实战自己动手搭建RPC框架

Posted ITSK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战自己动手搭建RPC框架相关的知识,希望对你有一定的参考价值。

快乐只喜欢亲近积极做事的人。专门地、刻意地去寻找快乐,它往往会躲藏起来,而用心去做眼前事的人,它反倒会不请自来! 【实战】自己动手搭建RPC框架 【实战】自己动手搭建RPC框架

【实战】自己动手搭建RPC框架

纯音乐 From ITSK 03:24


我们上篇文章详细介绍了RPC相关的知识,感兴趣小伙伴可以查看,

顶顶顶顶

雅静,公众号:ITSK

这篇文章我们介绍一下常用的RPC框架,以及自己动手搭建了一个基于HTTP协议的RPC框架。


RPC框架性能
影响RPC框架性能的因素如下:
  • 网络IO模型:在高并发状态下,阻塞式同步IO、非阻塞式同步IO或者多路IO模型对RPC服务器影响很大,特别是单位处理性能下对内存、CPU资源使用率的影响。
  • 基于的网络协议:RPC框架可选择的协议有HTTP协议、HTTP/2协议、TCP协议等。HTTP协议使用文本协议对传输内容进行编码,相对于采用二进制编码协议的TPC/IP协议码流更大。选择不同的协议对RPC框架的性能有一定的影响。目前没有采用UDP协议作为主要的传输协议。
  • 消息封装格式:消息封装格式的设计是影响RPC框架性能最重要的原因,这就是为什么几乎所有主流的RPC框架都会设计私有的消息封装格式。选择或者定义一种消息格式的封装要考虑的问题包括消息的易读性、描述单位内容时的消息体大小、编码难度、解码难度、解决半包/粘包问题的难易度。
    Dubbo消息体数据包含Dubbo版本号、接口名称、接口版本、方法名称、参数类型列表、参数、附加信息等。
  • Schema和序列化(Schema & Data Serialization):序列化、反序列化的时间,序列化后数据的字节大小直接影响RPC框架性能。

常用的RPC框架
RMI远程方法调用RMI(Remote Method Invocation)
基于Java远程方法协议(Java RemoteMethod Protocol)和Java的原生序列化,利用java.rmi包实现。它能够使部署在不同主机上的Java对象之间进行透明的通信与方法调用。RMI实现原理图如下:

【实战】自己动手搭建RPC框架

客户端方法调用从客户对象经占位程序(Stub)、远程引用层(RemoteReference Layer)和传输层(Transport Layer)向下,然后再次经传输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。

  • 占位程序:扮演着远程服务器对象的代理角色,使该对象可被客户激活。
  • 远程引用层:处理语义、管理单一或多重对象的通信,决定调用应发往一个服务器还是多个服务器。
  • 传输层:管理实际的连接,并且追踪可以接受方法调用的远程对象。
  • 骨干网:完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、传输层,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。
RMI的特性如下:支持面向对象多态性。只支持Java语言。使用Java原生的序列号机制。底层通信基于BIO(同步阻塞I/O)。
RMI的缺点如下:支持语言少。性能较差。由于RMI使用Java原生的序列号机制与BIO通信机制,导致RMI的性能较差,不建议在性能要求高的场景使用。

其他RPC框架
  • Dubbo:国内较早开源的服务治理的Java RPC框架,虽然在阿里巴巴内部竞争中落败于HSF,沉寂了几年,但是在国内得到了广泛的应用,目前Dubbo项目又获得了支持,并且Dubbo 3.0也开始开发。
  • Motan:微博内部使用的RPC框架,底层支持Java,生态圈往ServiceMesh发展以支持多语言。
  • RPCX:基于Go的服务治理的RPC框架,客户端支持跨语言。
  • 腾讯Tars:腾讯公司的RPC框架。
  • 百度BRPC:百度公司的RPC框架。
  • Thrift:跨语言的RPC框架,由Facebook贡献。
  • Hessian:由Caucho Technology开发的轻量级二进制RPC框架
  • Avro:来自Hadoop子项目。
  • gRPC:Google出品的跨语言RPC框架,很弱的(实验性的)负载均衡。
  • twirp:twitch.tv开源的一个RESTful风格的RPC框架。
  • go-micro:Go语言的一个服务治理RPC框架。
  • Spring Cloud:新兴产物。

自己手搭框架
自己手动搭建了一个简单的基于HTTP协议的RPC框架,其主要模块如下:
  • 协议模块http-rpc-protocol:定义了客户端到服务端做交互时用的协议;
  • 序列化模块http-rpc-serialize:实现对象和网络传输所需二进制数据的相互转换;
  • 网络通讯模块http-rpc-transport:传输序列化后的数据;
  • 客户端模块http-rpc-client:有一个存根的代理对象:完成序列化操作、网络交互;
  • 服务端模块http-rpc-server:Server存根:完成了服务调用、反射的存储;
  • 公共模块http-rpc-commom:封装了公共的工具类,eg:用于反射处理的工具类;

    这些模块的依赖关系图如下所示:(IDEA中选中项目,ctrl+alt+shift+u可以快速生成模块依赖图)

【实战】自己动手搭建RPC框架

【实战】自己动手搭建RPC框架


基于HTTP协议实现的RPC和基于TCP/IP实现的RPC有什么区别?
①使用TCP/IP协议的性能更高

相对于HTTP协议,TCP/IP协议的性能更高,因为HTTP协议的内容除了应用数据本身外,还带有描述本次请求上下文的数据(比如Header信息、响应码等)。HTTP协议使用文本协议对传输内容进行编码,相对于采用二进制编码协议的TPC/IP协议码流更大。

②使用HTTP协议比较简单、相对方灵活;


本文总结到这里,想要交流的小伙伴欢迎评论区留言哦【实战】自己动手搭建RPC框架【实战】自己动手搭建RPC框架【实战】自己动手搭建RPC框架


ITSK

以上是关于实战自己动手搭建RPC框架的主要内容,如果未能解决你的问题,请参考以下文章

自己动手从0开始实现一个分布式RPC框架

解密Dubbo:自己动手编写一个较为完善的RPC框架(两万字干货)

自己动手从0开始实现一个分布式RPC框架

花了快2个月!自己动手写了一个简单的RPC框架!

大厨小鲜——基于Netty自己动手编写RPC框架

花了快2个月!Guide自己动手写了一个简单的RPC框架!