`
mugui83
  • 浏览: 4715 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转载】为什么说要搞定微服务架构,先搞定RPC框架?

阅读更多

一、需求缘起

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


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

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

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

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

 

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


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

 

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

 

二、RPC背景与过程

什么是RPCRemote Procedure Call Protocol),远程过程调用?

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

int result = Add(1, 2);


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

 

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


 

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

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


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

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

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

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


即处理结果。

 

调用方的代码可能变为:

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

 


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

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

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

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

3socket接受

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

 

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

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

 

三、RPC框架职责

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

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

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

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


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

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

 

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

分享到:
评论

相关推荐

    为什么说要搞定微服务架构,先搞定RPC框架

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

    为什么说要搞定微服务架构,先搞定RPC框架?

    今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践,为什么说要搞定微服务架构,先搞定RPC框架呢?服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图:...

    6种微服务RPC框架,你知道几个?

    跟语言平台绑定的开源RPC框架主要有下面几种。Dubbo:国内最早开源的RPC框架,由阿里巴巴公司开发并于2011年末对外开源,仅支持 Java语言。 Motan:微博内部使用的RPC框架,于2016年对外开源,仅支持Java语言。 Tars...

    微服务架构之RPC-client序列化细节

    微服务架构之RPC-client序列化细节

    rpc 微服务架构下的安全认证与鉴权1

    2. 分布式 Session 方案分布式会话方案原理主要是将关于用户认证的信息存储在共享存储中,且通常由用户会话作为 key 来实现的简单分布式哈希映射 3.

    微服务架构,RPC细节

    为什么需要序列化? 把对象转化为连续二进制流的过程,叫做序列化。磁盘存储,缓存存储,网络传输只能操作于二进制流,所以必须序列化。 同步RPC-client的核心组件是什么? 同步RPC-client的核心组件是序列化组件、...

    拍拍贷微服务rpc框架源码.zip

    拍拍贷微服务rpc框架源码.zip # 拍拍贷微服务体系 拍拍贷微服务体系是拍拍贷基础框架部总结内部微服务多年实践,参考、吸收大量业内解决方案形成的适合中型互联网公司的微服务解决方案。 拍拍贷微服务体系主要组成...

    基于微服务架构的平台化服务框架的设计与实现

    Boot框架和Protocol Buffers实现了高效的微服务开发框架,它支持服务定义、服 务注册发现、服务间REST和RPC通信、服务持续集成等功能。另外,结合Nginx 和Lua语言的OpenResty平台,开发了具有权限校验、流量控制、...

    微服务架构组件分析,看这篇就够了

    主要被用作HTTP或者HTTPS协议的接口定义,即使在非微服务架构体系下,也被广泛采用优势:HTTP协议本身是一个公开的协议,对于服务消费者来说几乎没有学习成本,所以比较适合用作跨业务平台之间的服务协议。...

    基于微服务库的可插拔RPCgo-micro.zip

    Go-Micro 是一个基于微服务库的可插拔 RPC,为编写分布式应用程序提供基本构件。它是 Micro 工具包的一部分,支持 Proto-RPC 和 JSON-RPC 的请求/响应协议,默认设置Consul为探索。示例服务可以在 examples/...

    Java微服务架构163课

    082 为什么要使用 Dubbo 083 再谈微服务-背景介绍 084 再谈微服务-面向服务架构与微服务架构 085 再谈微服务-服务框架对比 1 085 再谈微服务-服务框架对比 2 086 再谈微服务-RPC 对比 REST 087 Dubbo 简介 ...

    Netty4.1实战-手写RPC框架.pdf

    RPC是一种远程调用的通信协议,例如dubbo、thrift等,我们在互联网高并发应用开发时候都会使用到类似的服务。本专题主要通过三个章节实现一个rpc通信的基础功能,来学习RPC服务...- 手写RPC框架第三章《RPC中间件》

    PHP微服务架构之RPC通信

    一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。可通过全自动部署机制独立部署,共用一个最小型的集中式的管理。服务可用不同的...

    RPC框架的实现原理,及RPC架构组件详解.pdf

    详细讲解RPC

    net RPC 架构选型

    netcore Rpc框架选型,值得拥有,微服务架构必看书籍。。

    40_如何设计一个类似dubbo的rpc框架?架构上该如何考虑?.zip

    40_如何设计一个类似dubbo的rpc框架?架构上该如何考虑?

    jsonrpc是一个基于Java的高性能开源RPC框架

    jsonrpc是一个基于Java的高性能开源RPC框架

    Java微服务架构l零从基础到精通高清视频教程全套 163课

    082 为什么要使用 Dubbo 083 再谈微服务-背景介绍 084 再谈微服务-面向服务架构与微服务架构 085 再谈微服务-服务框架对比 1 085 再谈微服务-服务框架对比 2 086 再谈微服务-RPC 对比 REST 087 Dubbo 简介 088 Dubbo...

Global site tag (gtag.js) - Google Analytics