RPC通信

RPC(RemoteProcedureCall)是一种允许程序调用远程服务的技术,它隐藏了通信细节,使得调用如同本地操作。RPC用于简化分布式系统中的服务调用,通过IDL定义接口和消息,使用序列化和反序列化处理数据传输,常基于TCP网络协议。客户端通过服务ID和实例ID找到服务端,而服务端则在注册中心注册其提供的服务。

一、RPC通信

1、什么是RPC?

RPC(Remote Procedure Call)远程过程调用,允许像调用本地服务一样调用远程服务。在整个过程中,RPC 会隐藏具体的通信细节。RPC是一种通信方式,可以通过HTTP来实现,也可以通过socket自己实现一套协议来实现。

2、为什么要使用RPC?

经常会听别人提起 B/S ( Browser/Server,浏览器 / 服务器) 架构。在这种架构中,被调用方(服务器)有一个开放的接口,然后调用方(用户)通过 Browser 使用这个接口,来间接调用被调用方相应的服务,从而实现远程调用。但是,B/S 架构是基于 HTTP 协议实现的,每次调用接口时,都需要先进行 HTTP 请求,发起http请求的代码呢?比如httpClient.sendRequest…之类的。这样既繁琐又浪费时间,不适用于有低时延要求的大规模分布式系统,所以能不能简单一下,像本地方法调用一样,去发起远程调用,让使用者感知不到远程调用的过程。RPC主要解决的两个问题,如下:

  • 解决分布式系统中,服务之间的调用问题。
  • 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

3、RPC相关的概念

3.1、IDL定义提供的接口与消息

跨语言平台PRC框架,根据IDL(Interface Description Language接口描述语言)定义服务端提供的接口与通信所使用的消息。编译时通过protobuf工具编译成对应的代码,生成的代码与业务代码编译到一起。

3.2、序列化与反序列化

网络协议传输的内容是二进制流,调用者发送请求时,RPC框架会把要传递的消息(即C语言里面的一个结构体)序列化成二进制流。数据到达服务端后,会把二进制流转换成消息(消息的结构是约定好的)。序列化和反序列化解决了调用方和被调用方之间的数据传输格式问题,但要想序列化后的数据能在网络中顺利传输,还需要有相应的网络协议,比如 TCP、UDP 等,因此就需要有一个底层通信层。目前,大部分 RPC 框架采用的是 TCP 协议。

3.3、客户端

客户端根据服务端信息(服务ID+实例ID)查询到服务端地址(IP+端口),根据服务端地址信息向对应的服务端发送请求

3.4、服务端

服务端提供者会向注册中心注册自己提供的服务(schema)

RPC(远程过程调用)是一个计算机通信协议/规范/标准,允许运行于一台计算机的程序通过网络调用另一台计算机的子程序,这种调用就像调用本地程序一样,采用Client/Server模式,可实现进程间的通信,许多技术框架基于此概念实现。其主要功能目标是让构建分布式计算(应用)更容易,通过网络从远程计算机程序上请求服务,开发者无需了解底层网络技术,简单来说就是像调用本地服务一样调用远程服务,对开发者而言是透明的 [^2][^4]。 RPC框架一般使用长连接,不必每次通信都进行3次握手,可减少网络开销。同时一般都有注册中心,具备丰富的监控管理功能。发布、下线接口、动态扩展等操作对调用方来说是无感知、统一化的。而且协议私密,安全性较高,能做到协议更简单、内容更小、效率更高。此外,RPC是面向服务的更高级的抽象,支持服务注册发现、负载均衡、超时重试、熔断降级等高级特性 [^3][^4]。 在应用场景方面,RPC适用于实时通信领域,可用于构建分布式计算应用,让不同进程之间实现高效通信,比如在大型互联网应用中,各个微服务之间的交互就可以使用RPC来实现 [^1][^2][^4]。 在实现方式上,不同的RPC框架有不同的实现。例如,使用临时节点可以方便地支持集群环境下的动态扩容与缩容,新的服务提供者上线或者旧的提供者下线,都能迅速反映到服务注册中心,进而使得消费者能及时感知并调整访问策略 [^5]。 ```python # 以下是一个简单的RPC调用示例(伪代码) # 客户端 import rpc_client # 创建RPC客户端实例 client = rpc_client.RPCClient() # 调用远程服务 result = client.call("remote_function", param1, param2) print(result) # 服务端 import rpc_server # 定义远程函数 def remote_function(param1, param2): return param1 + param2 # 创建RPC服务端实例 server = rpc_server.RPCServer() # 注册远程函数 server.register_function(remote_function) # 启动服务 server.start() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值