当前位置: 首页 > article >正文

RPC技术分享

一、微服务与RPC技术分享

1.1 微服务简介

微服务架构是一种软件设计和开发的模式,将应用程序拆分为一组小型、独立的服务。每个服务运行在自己的进程中,并使用轻量级通信机制进行协同工作。微服务架构通过提高灵活性、可维护性和可伸缩性来改进大型系统的开发和维护。

1.2 为什么使用RPC在微服务架构中

微服务之间的通信是构建整体系统的关键部分。使用RPC(Remote Procedure Call)作为微服务之间的通信机制有以下优势:

  • 抽象复杂性:RPC提供了一种抽象,使得开发者可以调用远程服务就像调用本地函数一样,无需关心底层通信细节。
  • 标准化通信:RPC框架定义了标准的通信协议,使得不同微服务之间的通信更加一致和可靠。
  • 性能优化:一些RPC框架,如gRPC,使用了高性能的通信协议(如HTTP/2),并支持多路复用,从而提高了通信效率。
  • 类型安全:使用IDL(Interface Definition
    Language)定义服务接口和消息格式,提供了类型安全的通信,减少了通信错误的可能性。

二、RPC协议介绍

2.1 RPC协议基本概念

RPC协议是一种通过网络在远程计算机上执行程序的协议。它建立在客户端和服务器之间,允许客户端调用远程服务器上的过程或方法,就像调用本地过程一样。RPC协议通常包括定义远程服务接口、数据序列化和网络传输等方面。

常用RPC技术或框架

应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
通信框架:MINA 和 Netty

主流的gRPC、Thrift、Dubbo

  • gRPC:gRPC是Google开源软件,gRPC是基于HTTP2.0协议,而HTTP2.0是基于二进制的HTTP协议升级版本,底层使用Netty框架支持。
  • Thrift:Thrift是Facebook开源项目,其是一个跨语言的服务开发框架。用户只需在进行二开即可,对底层的RPC通讯透明。
  • Dubbo:Dubbo是阿里开源组件协议和序列化框架都可以插拔,依托Spring框架开发,远程接口是基于Java接口,适用于微服务架构。

使用场景

  • 大型网站:内部涉及多个子系统,服务、接口较多。
  • 注册发现机制:如Nacos、Dubbo等,一般都有注册中心,服务有多个实例,调用方调用的哪个实例无感知。
  • 安全性`:不暴露资源。
  • 服务化治理:微服务架构、分布式架构。

架构图

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5da247808a3843cfbca4d4dcd3c587ea.png#pic_center
在这里插入图片描述

2.2 不同RPC框架的协议

不同的RPC框架可能使用不同的协议,如XML-RPC、JSON-RPC、Thrift等。每种协议都有其特定的优势和适用场景。

三、RPC技术分享

3.1 RPC简介

RPC(Remote Procedure Call)是一种远程过程调用的协议,允许程序调用另一台机器上的程序,就像调用本地函数一样。RPC的实现可以通过不同的协议和框架,如XML-RPC、JSON-RPC、Thrift等。

3.2 Python实现RPC的Demo

3.2.1 安装所需库

pip install xmlrpc.server

3.2.2 Python实现RPC的示例代码



from xmlrpc.server import SimpleXMLRPCServer

def add(x, y):
    return x + y

server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(add, "add")

print("RPC Server listening on port 8000...")
server.serve_forever()




from xmlrpc.client import ServerProxy

server = ServerProxy("http://localhost:8000")

result = server.add(3, 5)
print("Result from RPC call:", result)


3.3 RPC的好处

抽象远程调用的复杂性,使分布式系统开发更加简便。
提高系统的可维护性和可扩展性。
降低系统之间通信的复杂性。

四、gRPC技术分享

4.1 gRPC简介

gRPC是一种高性能、开源的RPC框架,由Google开发,基于HTTP/2协议。它支持多种编程语言,并提供强大的IDL(Interface Definition Language)工具,如Protocol Buffers。

4.2 Protobuf语法相关讲解

4.2.1 定义服务和消息格式

Protocol Buffers(Protobuf)是一种轻量级的数据交换格式,通过.proto文件定义消息的结构和服务的接口。以下是一个简单的Protobuf示例文件

// calculator.proto

syntax = "proto3";

service Calculator {
  rpc Add (AddRequest) returns (AddResponse);
}

message AddRequest {
  int32 x = 1;
  int32 y = 2;
}

message AddResponse {
  int32 result = 1;
}

- syntax = “proto3”;:指定使用Protocol Buffers的第三个版本。
- service Calculator:定义一个服务,其中包含一个RPC方法 Add。
- message AddRequest 和 message AddResponse:定义了请求和响应消息的格式。

4.2.2 编译生成代码

在终端中执行以下命令,将.proto文件编译为Python代码:

python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. calculator.proto

4.3 gRPC的Demo分享
4.3.1 编写服务端代码


# server.py
from concurrent import futures
import grpc
import calculator_pb2
import calculator_pb2_grpc

class CalculatorServicer(calculator_pb2_grpc.CalculatorServicer):
    def Add(self, request, context):
        result = request.x + request.y
        return calculator_pb2.AddResponse(result=result)

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
calculator_pb2_grpc.add_CalculatorServicer_to_server(CalculatorServicer(), server)


print("gRPC Server listening on port 50051...")
server.add_insecure_port("[::]:50051")
server.start()
server.wait_for_termination()


4.3.2 编写客户端代码


# client.py
import grpc
import calculator_pb2
import calculator_pb2_grpc

channel = grpc.insecure_channel("localhost:50051")
stub = calculator_pb2_grpc.CalculatorStub(channel)


request = calculator_pb2.AddRequest(x=3, y=5)
response = stub.Add(request)

print("Result from gRPC call:", response.result)

4.4 gRPC的好处

  • 性能优越:基于HTTP/2协议,支持多路复用和头部压缩,提高传输效率。

  • 多语言支持:支持多种编程语言,使得在不同技术栈之间进行通信更加方便。

  • 强大的IDL工具:使用Protocol Buffers定义服务和消息格式,提供更加强大的接口定义和类型约束。

五、总结

通过本文的技术分享与演示,我们了解了RPC的基本概念,并使用Python实现了一个简单的RPC示例。随后,介绍了gRPC作为一种现代化的RPC框架,通过示例演示了其强大的功能和优势。选择合适的RPC框架取决于项目的需求和复杂性,而gRPC以其高性能和多语言支持成为当今分布式系统开发中的重要选择。


http://www.kler.cn/a/232475.html

相关文章:

  • 【postman】怎么通过curl看请求报什么错
  • 力扣513:找树左下角的值
  • Mybatis配置文件的增删改查功能
  • 越南很火的slots游戏投放Google谷歌广告策略
  • STM32中,不进行printf改写通过函数达到同款效果
  • Spring Cloud Gateway(分发请求)
  • 【杂谈】年尾做了这件事,我后悔了.......
  • git flow与分支管理
  • 【大数据】Flink 中的 Slot、Task、Subtask、并行度
  • 利用路由懒加载和CDN分发策略,对Vue项目进行性能优化
  • Ubuntu in VMware的问题
  • 对比 elasticsearch 和 mysql
  • Qt网络编程-QTcpServer的封装
  • 前端JavaScript篇之对原型、原型链的理解、原型修改、重写、原型链指向
  • 职业性格测试在求职应聘跳槽中的应用
  • Nginx方向代理和负载均衡配置
  • Unity3d Shader篇(六)— BlinnPhong高光反射着色器
  • PyTorch自动微分模块torch.autograd的详细介绍
  • Top 20 Docker 面试题(附答案)
  • 时间序列预测 —— DeepAR 模型
  • RedissonClient妙用-分布式布隆过滤器
  • 解锁机器学习多类分类之门:Softmax函数的全面指南
  • 详细关于如何解决mfc140.dll丢失的步骤,有效修复mfc140.dll文件丢失的问题。
  • l + r >> 1; 的含义
  • 10分钟快速入门正则表达式
  • 100天精通Python(实用脚本篇)——第115天:基于selenium实现反反爬策略之隐藏浏览器指纹特征