redis原理详细分析图解(最全的都在这里)

本文详细分析了RPC(远程过程调用)的原理,解释了什么是RPC、为何需要RPC框架以及RPC框架的主要职责。同时,文章探讨了序列化在RPC中的重要性,包括为什么要进行序列化,常见的序列化方式及其考虑因素。此外,还介绍了RPC客户端的同步和异步调用架构,以及连接池组件、上下文管理器和超时管理器在其中的作用。最后,文章以Redis为例,简要提及了其在服务化中的应用。
摘要由CSDN通过智能技术生成

服务化有什么好处?

服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示:
在这里插入图片描述
服务A:欧洲团队维护,技术背景是Java

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

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

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

在这里插入图片描述

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

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

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

什么是RPC?

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

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

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

当我们写下:

 int result = Add(1, 2);

这行代码的时候,到底发生了什么?
在这里插入图片描述

传递两个入参

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

返回一个出参

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

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

典型的,这个进程部署在另一台服务器上。
在这里插入图片描述

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

入参

调用哪个函数

出参

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

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

假设,设计一个11字节的请求报文:在这里插入图片描述

  1. 前3个字节填入函数名“add”
  2. 中间4个字节填入第一个参数“1”
  3. 末尾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)将字节流发送给调用方;

这个过程用一张图描述如下:
在这里插入图片描述

调用方与服务方的处理步骤都是非常清晰。

这个过程存在最大的问题是什么呢?

调用方太麻烦了,每次都要关注很多底层细节:

入参到字节流的转化,即序列化应用层协议细节

socket发送,即网络传输协议细节

socket接收

字节流到出参的转化,即反序列化应用层协议细节

能不能调用层不关注这个细节?</

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值