加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 服务器 > 系统 > 正文

谈微服务架构,你需要掌握的RPC细节

发布时间:2021-05-25 00:36:33 所属栏目:系统 来源:互联网
导读:这样的话,如果没有统一的服务框架,各个团队的服务提供方就需要各自实现一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等业务之外的重复

这样的话,如果没有统一的服务框架,各个团队的服务提供方就需要各自实现一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等“业务之外”的重复技术劳动,造成整体的低效。

因此,统一服务框架把上述“业务之外”的工作统一实现,是服务化首要解决的问题。

什么是RPC?

Remote Procedure Call Protocol,远程过程调用。

什么是“远程”,为什么“远”?

先来看下什么是“近”,即“本地函数调用”。

当我们写下:

int result = Add(1, 2); 

这行代码的时候,到底发生了什么?

最容易想到的,两个进程约定一个协议格式,使用Socket通信,来传输:

入参

调用哪个函数

出参

如果能够实现,那这就是“远程”过程调用。

Socket通信只能传递连续的字节流,如何将入参、函数都放到连续的字节流里呢?

假设,设计一个11字节的请求报文:

前3个字节填入函数名“add”

中间4个字节填入第一个参数“1”

末尾4个字节填入第二个参数“2”

同理,可以设计一个4字节响应报文:

4个字节填入处理结果“3”

调用方的代码可能变为:

request = MakePacket(“add”, 1, 2); 

 

SendRequest_ToService_B(request); 

 

response = RecieveRespnse_FromService_B(); 

 

int result = unMakePacket(respnse); 

这4个步骤是:

(1)将传入参数变为字节流;

(2)将字节流发给服务B;

(3)从服务B接受返回字节流;

(4)将返回字节流变为传出参数;

服务方的代码可能变为:

request = RecieveRequest(); 

 

args/function = unMakePacket(request); 

 

result = Add(1, 2); 

 

response = MakePacket(result); 

 

SendResponse(response); 

这个5个步骤也很好理解:

(1)服务端收到字节流;

(2)将字节流转为函数名与参数;

(3)本地调用函数得到结果;

(4)将结果转变为字节流;

(5)将字节流发送给调用方;

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读