搞定微服务架构,先搞定RPC框架吧

微服务在用,RPC 框架也用了不少,HSF(丢大了,只想起来了这一个 肿么办,很紧张啊~~~),其实 dubbo 也用过了。

这篇文章 大概介绍下 为什么需要RPC 啊,RPC 有什么好处,或者这个鬼帮我们做了哪些工作啊?

不会涉及具体代码及实现,后面一点点啃哈,莫急!

一、需求缘起

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

为ä"�ä¹�说è¦�æ��å®�å¾®æ��å�¡æ�¶æ��ï¼�å �æ��å®�RPCæ¡�æ�¶ï¼�

服务A是欧洲团队提供服务,欧洲团队的技术背景是Java,可以用Java实现服务;

服务B是美洲团队提供服务,可以用C++实现服务;

服务C是中国团队提供服务,可以用Go实现服务;

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

但实际上,99.9%的公司的团队规模有限,技术团队人数也有限,基本是使用同一套技术体系来调用和提供服务的:

为ä»�ä¹�说è¦�æ��å®�å¾®æ��å�¡æ�¶æ��ï¼�å �æ��å®�RPCæ¡�æ�¶ï¼�

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

在达成【“使用统一的RPC框架”是正确的道路】这个一致的前提下,本文期望用简单通俗的言语简述一下一个通用RPC框架的技术点与实现。

二、RPC背景与过程

什么是RPC(Remote Procedure Call Protocol),远程过程调用?

先来看下什么是本地函数调用,当我们写下:

int result = Add(1, 2);

为ä"�ä¹�说è¦�æ��å®�å¾®æ��å�¡æ�¶æ��ï¼�å �æ��å®�RPCæ¡�æ�¶ï¼�

这段代码的时候,我们知道,我们传入了1,2两个入参数,调用了本地代码段中的一个Add函数,得到了result出参。此时,传入数据,传出数据,代码段在同一个进程空间里,这是本地函数调用。

那有没有办法,我们能够调用一个跨进程(所以叫“远程”,典型的,这个进程部署在另一台服务器上)的函数呢

为ä"�ä¹�说è¦�æ��å®�å¾®æ��å�¡æ�¶æ��ï¼�å �æ��å®�RPCæ¡�æ�¶ï¼�

最容易想到的,两个进程约定一个协议格式,使用Socket通信,来传输【入参】【调用哪个函数】【出参】。

假设请求报文协议是一个11字节的字节流:

为ä"�ä¹�说è¦�æ��å®�å¾®æ��å�¡æ�¶æ��ï¼�å �æ��å®�RPCæ¡�æ�¶ï¼�

(1)前3个字节填入函数名

(2)中间4个字节填入第一个参数

(3)末尾4个字节填入第二个参数

同时可以设计响应报文协议是一个4字节的字节流:

为ä"�ä¹�说è¦�æ��å®�å¾®æ��å�¡æ�¶æ��ï¼�å �æ��å®�RPCæ¡�æ�¶ï¼�

即处理结果。

调用方的代码可能变为:

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

SendRequest_ToService_B(request);

response = RecieveRespnse_FromService_B();

int result = unMakePacket(respnse);

简单解释一下:

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

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

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

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

服务方的代码可能变为:

request = RecieveRequest();

args/function = unMakePacket(request);

result = Add(1, 2);

response = MakePacket(result);

SendResponse(response);

这个过程也很好理解:

(1)服务端收到字节流

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

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

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

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

为ä"�ä¹�说è¦�æ��å®�å¾®æ��å�¡æ�¶æ��ï¼�å �æ��å®�RPCæ¡�æ�¶ï¼�

这个过程用一张图描述如上,调用方与服务方的处理步骤都是非常清晰的。这个过程存在最大的问题是什么呢?

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

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

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

(3)socket接受

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

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

回答:可以,RPC框架就是解决这个问题的,它能够让调用方“像调用本地函数一样调用远端的函数(服务)”。

三、RPC框架职责

通过上面的讨论,RPC框架要向调用方屏蔽各种复杂性,要向服务提供方也屏蔽各类复杂性

(1)调用方感觉就像调用本地函数一样

(2)服务提供方感觉就像实现一个本地函数一样来实现服务

所以整个RPC框架又分为client部分与server部分,负责把整个非(1)(2)的各类复杂性屏蔽,这些复杂性就是RPC框架的职责。

为ä"�ä¹�说è¦�æ��å®�å¾®æ��å�¡æ�¶æ��ï¼�å �æ��å®�RPCæ¡�æ�¶ï¼�

再细化一些,client端又包含:序列化、反序列化、连接池管理、负载均衡、故障转移、队列管理,超时管理、异步管理等等等等职责。

server端包含:服务端组件、服务端收发包队列、io线程、工作线程、序列化反序列化、上下文管理器、超时管理、异步回调等等等等职责。

however,因为篇幅有限,这些细节不做深入展开。

四、结论

(1)RPC框架是架构微服务化的首要基础组件,它能大大降低架构微服务化的成本,提高调用方与服务提供方的研发效率,屏蔽跨进程调用函数(服务)的各类复杂细节

(2)RPC框架的职责是:让调用方感觉就像调用本地函数一样调用远端函数、让服务提供方感觉就像实现一个本地函数一样来实现服务

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容