RPC框架

作者: wang_zhi_hao | 来源:发表于2019-07-15 00:31 被阅读0次

    引言

    技术框架选型是优秀架构师必备的技能之一,所选择的技术一方面满足当前业务场景,另一方面能够很好的预判支撑未来产品架构发展,错误的架构选择可能会让一群程序猿面临大型车祸现场。即使在小公司,系统架构搭建少则半年,多则两年三年,这几年从业下来更加感觉到做好一套大型系统为之不易。而系统架构的升级改造和变动往往是一场持久战,持续的人力投入不说,保障已有的系统和业务平稳过渡是有很大挑战的。最近几年微服务架构逐渐完善成熟,WEB服务的实现方式也发生了巨大的变革。目前主流的WEB服务实现为RPC,在这里对RPC做一些调研和分析。

    RPC

    了解RPC之前先介绍一下IPC,即Inter-Process Communication进程间通信,指进程或者是线程之间传送数据和信号的一些技术和方法。本质是为了解决资源隔离的不同进程间互访资源问题。这些进程可以是在同一台计算机上,也可能是在网络联通的不同计算机上。根据进程所处位置不同,进程间通信的方法包括两类:

    • 本地过程调用(LPC,Local Procedure Call):LPC用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。
    • 远程过程调用(RPC,Remote Procedure Call):RPC是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。RPC开始是出现在Sun微系统公司和HP公司的运行UNIX操作系统的计算机中。


      RPC远程过程调用

    RPC中间最重要的几个概念点,分别是传输协议,编码协议(序列化协议)以及IO模型。这三个也是影响RPC框架选型的重要因素。

    附加说明:网上有很多文章把RPC和REST放在一起来对比和说明,但其实这两者并没有太多的可比性。REST 不是 RPC,但也有类似的请求-响应模式。REST是一种设计风格,符合这种风格的应用叫做RESTFUL应用,应用之间的接口叫做REST接口。而制定透明度请求、封送数据、解析响应这些不属于 REST范畴。
    REST只能基于HTTP协议,而RPC的传输协议实现可以是HTTP协议,或者是其他自定义协议。

    另外RPC的这种存在方式让我不经意间想起此前流行的SOAP框架,两者存在一些共通点,但也有所侧重不同。具体见参考文档:SOA,SOAP,RPC,以及 RPC协议与 REST 协议之间的关系

    RPC框架

    RPC框架组成

    一个典型RPC框架如下,包括几个组件:
    服务提供者:远程服务的被调用方,提供服务实现。
    服务消费者:远程服务的调用方。
    注册中心:提供服务的注册和发现。
    调用监控:监控远程服务调用情况。


    典型RPC框架

    RPC框架对比

    目前业界主流的RPC框架包括阿里巴巴的Dubbo、谷歌开源的gRPC、Apache(前身Facebook)的Thrift、新浪微博的Montan等。下面列举了主流的RPC框架,并挑选部分做表格对比
    国内

    国外

    Hessian Montan rpcx gRPC Thrift Dubbo Dubbox Spring Cloud
    开发语言 跨语言 Java Go 跨语言 跨语言 Java Java Java
    分布式(服务治理) × × ×
    多序列化框架支持 hessian √(支持Hessian2、Json,可扩展) × 只支持protobuf) ×(thrift格式)
    多种注册中心 × × ×
    管理中心 × × ×
    跨编程语言 ×(支持php client和C server) × × × ×
    支持REST × × × × × ×
    关注度
    上手难度
    运维成本
    开源机构 Caucho Sina Weibo Apache Google Apache Alibaba Dangdang Apache

    1、上面的RPC框架可以分为两类,一类是服务治理类框架,这类框架能够提供包括服务注册、管理中心在内的整套的微服务技术架构支持。典型代表包括Spring Cloud、Dubbo、Dubbox、Montan。
    2、另外一类RPC框架无法提供微服务治理功能,更多的关注于跨语言服务调用,典型代表有Hessian、gRPC、Thrift。
    之前公司项目所使用的框架是Apache开源Spring Cloud,该框架支持微服务治理,基于HTTP传输协议和JSON序列化协议(也可以支持其他),本质上也是RPC框架的一种。后面再对Spring Cloud做展开介绍和分析。

    关于Dubbo和Spring Cloud(转):使用 Dubbo 构建的微服务架构就像组装电脑,各环节我们的选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果你是一名高手,那这些都不是问题;而 Spring Cloud 就像品牌机,在 Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础有足够的了解。

    选型考虑(未完待续)

    传输协议

    • TCP
    • HTTP

    IO模型

    • 传统的阻塞 I/O(Blocking I/O)
    • 非阻塞 I/O(Non-blocking I/O)
    • I/O 多路复用(I/O multiplexing)
    • 异步 I/O(Asynchronous I/O)

    序列化

    • Encoding format。是 human readable 还是 binary。
    • Schema declaration。也叫作契约声明,基于 IDL,比如 Protocol Buffers/Thrift,还是自描述的,比如 JSON、XML。另外还需要看是否是强类型的。
    • 语言平台的中立性。比如 Java 的 Native Serialization 就只能自己玩,而 Protocol Buffers 可以跨各种语言和平台。
    • 新老契约的兼容性。比如 IDL 加了一个字段,老数据是否还可以反序列化成功。
    • 和压缩算法的契合度。跑benchmark和实际应用都会结合各种压缩算法,例如 gzip、snappy。
    • 性能。这是最重要的,序列化、反序列化的时间,序列化后数据的字节大小是考察重点。

    参考文档

    Spring Cloud 使用 HTTP2 https://www.jianshu.com/p/ed3f8f983764
    RPC框架的技术架构和未来 http://www.hyhblog.cn/2018/01/29/rpc_arch_future/
    Spring Cloud微服务框架主要子项目和RPC框架的对比 http://springcloud.cn/view/8
    SOA,SOAP,RPC,以及 RPC协议与 REST 协议之间的关系 https://www.cnblogs.com/aspirant/p/9172336.html
    *理解REST和RPC https://www.cnblogs.com/houkai/p/9772111.html
    *RPC简介及框架选择 https://www.jianshu.com/p/b0343bfd216e
    *远程过程调用(RPC)详解 https://waylau.com/remote-procedure-calls
    怎么看待谷歌的开源 RPC 框架 gRPC? https://www.zhihu.com/question/30027669
    Java 微服务框架选型(Dubbo 和 Spring Cloud?) https://www.cnblogs.com/xishuai/p/dubbo-and-spring-cloud.html
    What's the difference between XML-RPC and SOAP?
    Ask https://stackoverflow.com/questions/80112/whats-the-difference-between-xml-rpc-and-soap
    阿里技术专家详解 Dubbo 实践,演进及未来规划 https://www.infoq.cn/article/IwZCAp3jo_H5fJFbWOZu
    聊聊Dubbo(一):为何选择 https://www.jianshu.com/p/0b6e2c920014
    服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型 https://cloud.tencent.com/developer/article/1165589

    相关文章

      网友评论

        本文标题:RPC框架

        本文链接:https://www.haomeiwen.com/subject/xjrikctx.html