必须知道的RPC内核细节(值得收藏)!!!

微服务分层架构,之前聊得很多了,微服务离不开RPC框架,RPC框架的原理、实践及细节,今天和大家聊一聊。

文章较长,1万字左右,建议提前收藏。

服务化有什么好处?

服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示:

0067ff6416a720b7cb31a83f15cbeaf4.png

(1)服务A:欧洲团队维护,技术背景是Java;

(2)服务B:美洲团队维护,用C++实现;

(3)服务C:中国团队维护,技术栈是go;

服务的上游调用方,按照接口、协议即可完成对远端服务的调用。

但实际上,大部分互联网公司,研发团队规模有限,大都使用同一套技术体系来实现服务:

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

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

什么是RPC?

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

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

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

当我们写下:

int result = Add(1, 2);

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

70c035a48f96bc83e4f87565d6739451.png

(1)传递两个入参;

(2)调用了本地代码段中的函数,执行运算逻辑;

(3)返回一个出参;

这三个动作,都发生在同一个进程空间里,这是本地函数调用

那有没有办法,调用一个跨进程的函数呢?

典型的,这个进程部署在另一台服务器上。

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

(1)入参;

(2)调用哪个函数;

(3)出参;

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

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

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

817697bae1fcb67f8a3de9e3e6f1e893.png

(1)前3个字节填入函数名“add”;

(2)中间4个字节填入第一个参数“1”;

(3)末尾4个字节填入第二个参数“2”;

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

802f531daa9d9447a172bb0656154224.png

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

这个过程用一张图描述如下:

IPC(Inter-Process Communication,进程间通信)是一种用于不同进程间传递消息和共享数据的机制。在多进程系统中,各个进程之间需要相互通信来协调工作和共享资源。IPC提供了一系列的通信方式,比如管道、消息队列、共享内存、信号量等,可以方便地实现进程间的数据传输和同步。 RPC(Remote Procedure Call,远程过程调用)是一种分布式系统中的通信机制,它允许一台计算机上的程序能够调用另一台计算机上的过程(即函数)而不需要了解底层的网络细节RPC通过封装远程调用的细节,使得各个计算机节点之间的通信变得简单和透明。 微内核是操作系统设计的一种架构风格,其核心思想是将操作系统划分为多个小的、独立的模块,把核心功能和最基本的服务放在内核中,而将其他的功能移至用户态。这种设计可以提高操作系统的可扩展性、可维护性和安全性。微内核架构中的核心服务包括进程管理、内存管理、文件系统等,而其他功能如设备驱动、网络协议等则放在用户态运行。 在这三个概念中,IPC和RPC都是用于实现进程间通信的机制,不同之处在于IPC主要用于同一台计算机上的多个进程之间的通信,而RPC则主要用于跨网络的不同计算机之间的通信。微内核则是一种操作系统的设计思想,与IPC和RPC有关系,因为它们都涉及到各个模块之间的通信和交互。 可以说,IPC和RPC是实现微内核设计思想的基础和重要组成部分,它们为微内核架构提供了一种灵活和可扩展的通信方式,使得不同的模块可以相互交互,从而实现了操作系统的各种功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值