站长网 系统 谈微服务架构,你需要掌握的RPC细节

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

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

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

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

什么是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)将字节流发送给调用方;

本文来自网络,不代表站长网立场,转载请注明出处:https://www.zwzz.com.cn/html/fuwuqi/xt/2021/0524/5438.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部