赞
踩
完整的RPC
序列化
数据对象 ——> 字节流(码流)的形式进行传输.
过程是将对象的状态信息(变量,属性值)编码为字节流,以便在网络上进行传输.
反序列化
字节流转换回原始的对象表示
框架实现需要解决的三部分问题
1、调用映射
RPC建立一个对应表,解析对应表取得server
的ip和端口(port),再调用相关函数
2、序列化和反序列化
调用函数往往需要给参数,在本地函数调用中,参数是直接被系统压栈,相当于放到了内存里,而远程调用不属于一个机器,不能通过内存来传递参数,此时,需RPC客户端将参数序列化为字节流,传给RPC提供方,再进行反序列化,得到参数。
同理,返回结果也需要经过序列化和反序列化的过程。
3、网络传输
RPC调用为远程的,所以离不开网络传输,RPC客户端与服务端之间的调用传参与返回都需要经过网络传输。
Thrift不仅仅是序列化协议,而是一个RPC框架
由于Thrift
其Server
是基于自身的Socket服务,所以在跨防火墙访问时,安全是一个顾虑。Thrift
序列化后的数据是Binary
数组,不具有可读性。
由于Thrift
的序列化和框架紧耦合,无法支持向持久层直接读写数据,所以不适合做数据持久化序列化协议。
RPC(解耦服务)基于C/S模型
1、RPC_request
包括一个请求id和一个请求命令
RPC请求,包括命令id和请求内容两部分,其中命令id作用在于将request
和response
建立绑定关系,在异步调用时使用。
RPC_response
包括答复id(与请求id一致)和运行结果。
2、在RPC消息中传递参数
eg:add(a,b)
中的a,b
3、实现对应的encode
和decode
方法
decode
需注意的是解码出来的是request
还是response
4、处理传输数据(引入传输层),基于Socket
,简单的connection
类(两个list
,一个管发送,一个管接收)
之后就是将RPC消息通过connection
去发送,通过connection
接收。
通过自定义协议发起TCP调用
步骤:
① 客户端(Server A
)执行远程方法时,调用client stub
传递类名、方法名、参数等信息。
② Client Stub
将参数等信息序列化为二进制流的形式,通过Socket
发送给服务端(B)。
③ 服务端收到数据包后,Server Stub
进行解析序列化为类名、方法名、参数信息。
④ Server Stub
调用对应的本地方法将执行结果返回给客户端。
Client:
① 提供调用的接口的全限定名和方法,调用方法的参数给调用端的本地存根。
② 从调用端的本地存根中接收执行结构。
Server
提供服务,执行接口实现的方法逻辑,也就是为服务提供方法的具体实现。
Stub
(桥梁)进行类型和参数化,经Stub处理后,两端能够正常传送信息并沟通。
RPCRuntime
数据包的传输、数据包的确认、路由和加密等。在 Client 和 Server 端都有一个RPCRuntime 实例,负责双方间的通信,可靠地将存根传递的数据包传输到另一端。
存在问题:
RPC会带来地址空间被隔离
不同机器上仍可能出现位宽不同,处理器大小端不同等,导致函数调用无法匹配
1、服务暴露过程
服务暴露到远程的第一步是在本地绑定端口,然后将服务提供端的应用服务信息注册到注册中心(中间层)。
2、服务发现过程
client
通过注册中心进行服务发现(不用去维护静态的配置文件,从注册中心拿到对应的url
),server
的地址和端口从注册中心获取。
3、服务引用过程
client
通过服务发现获取所有 server
提供的地址后,选择其中一个 server
的节点进行服务引用。
服务引用过程就是与某一服务节点建立连接,以及在服务调用端(client
)创建接口代理的过程。
建立连接的过程也就是两端 RPCRuntime
建立连接的过程。
4、方法调用过程
服务引用完成后,client
和 server
已经建立了连接,之后可进行方法调用。
串口上实现 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。