RPC框架——编解码

RPC

完整的RPC

在这里插入图片描述
序列化
数据对象 ——> 字节流(码流)的形式进行传输.
过程是将对象的状态信息(变量,属性值)编码为字节流,以便在网络上进行传输.

反序列化
字节流转换回原始的对象表示

框架实现需要解决的三部分问题

1、调用映射
RPC建立一个对应表,解析对应表取得server的ip和端口(port),再调用相关函数

2、序列化和反序列化
调用函数往往需要给参数,在本地函数调用中,参数是直接被系统压栈,相当于放到了内存里,而远程调用不属于一个机器,不能通过内存来传递参数,此时,需RPC客户端将参数序列化为字节流,传给RPC提供方,再进行反序列化,得到参数。
同理,返回结果也需要经过序列化和反序列化的过程。

3、网络传输
RPC调用为远程的,所以离不开网络传输,RPC客户端与服务端之间的调用传参与返回都需要经过网络传输。

Thrift不仅仅是序列化协议,而是一个RPC框架
由于ThriftServer是基于自身的Socket服务,所以在跨防火墙访问时,安全是一个顾虑。Thrift序列化后的数据是Binary数组,不具有可读性。
由于Thrift的序列化和框架紧耦合,无法支持向持久层直接读写数据,所以不适合做数据持久化序列化协议。

RPC(解耦服务)基于C/S模型
1、RPC_request 包括一个请求id和一个请求命令
RPC请求,包括命令id和请求内容两部分,其中命令id作用在于将requestresponse建立绑定关系,在异步调用时使用。
RPC_response 包括答复id(与请求id一致)和运行结果。

2、在RPC消息中传递参数
eg:add(a,b)中的a,b

3、实现对应的encodedecode方法
decode需注意的是解码出来的是request还是response

4、处理传输数据(引入传输层),基于Socket,简单的connection类(两个list,一个管发送,一个管接收)
之后就是将RPC消息通过connection去发送,通过connection接收。

RPC 框架 (原过程调用,本质是远程通信)

通过自定义协议发起TCP调用
在这里插入图片描述

步骤:
① 客户端(Server A)执行远程方法时,调用client stub 传递类名、方法名、参数等信息。

Client Stub 将参数等信息序列化为二进制流的形式,通过Socket 发送给服务端(B)。

③ 服务端收到数据包后,Server Stub 进行解析序列化为类名、方法名、参数信息。

Server Stub 调用对应的本地方法将执行结果返回给客户端。

RPC核心组成部分(四部分)

在这里插入图片描述
Client:
① 提供调用的接口的全限定名和方法,调用方法的参数给调用端的本地存根。

② 从调用端的本地存根中接收执行结构。

Server
提供服务,执行接口实现的方法逻辑,也就是为服务提供方法的具体实现。

Stub
(桥梁)进行类型和参数化,经Stub处理后,两端能够正常传送信息并沟通。

RPCRuntime
数据包的传输、数据包的确认、路由和加密等。在 Client 和 Server 端都有一个RPCRuntime 实例,负责双方间的通信,可靠地将存根传递的数据包传输到另一端。

存在问题:
RPC会带来地址空间被隔离
不同机器上仍可能出现位宽不同,处理器大小端不同等,导致函数调用无法匹配

RPC 调用过程

1、服务暴露过程
服务暴露到远程的第一步是在本地绑定端口,然后将服务提供端的应用服务信息注册到注册中心(中间层)。

2、服务发现过程
client通过注册中心进行服务发现(不用去维护静态的配置文件,从注册中心拿到对应的url),server的地址和端口从注册中心获取。

3、服务引用过程
client 通过服务发现获取所有 server 提供的地址后,选择其中一个 server 的节点进行服务引用。
服务引用过程就是与某一服务节点建立连接,以及在服务调用端(client)创建接口代理的过程。
建立连接的过程也就是两端 RPCRuntime 建立连接的过程。

4、方法调用过程
服务引用完成后,clientserver 已经建立了连接,之后可进行方法调用。

eRPC 嵌入式RPC(Remote Procedure Call)

串口上实现 C——>S(客户端请求——>服务器响应)
(传输层串行通信,1对1简化版C/S模型)

不依赖具体设备的情况通过使用TCP/IP传输层模拟串口,就可以在x86平台上实现RPC调用的两端模拟通信(C/S)。
数据传输、序列化、反序列化、校验等底层细节由erpc完成。

特性:
底层采用TCP长链接方式实现。
通信采用json-rpc协议。

erpcgen 目录下是erpcgen工具源码,用于编译生成grpcgen工具程序
erpcgen -> 将IDL文件转化为C/Python文件。

erpc_c erpc的c/c++实现
---- config        ---- 配置文件
---- infra         ---- 协议编解码核心部分代码
---- port          ---- 适配不同环境的porting层代码文件
---- setup         ---- C语言APIS,包括客户端和服务端初始化反初始化等,可在C中使用
---- transport     ---- 包含不同传输媒介的传输层定义
-----------------------------------------------------------------------------------------

编译
1、将编译 erpc_c 编译成库
2、编译 erpcgen 编译成可执行文件
   用于.erpc的IDL语法生成 service 和 cilent 的代码
   .erpc
   生成4个文件(cpp文件) ------- xx_client.cpp
                              xx_client.h
                              xx_server.cpp
                              xx_server.h
  
  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nerd Nirvana

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值