引言
技术框架选型是优秀架构师必备的技能之一,所选择的技术一方面满足当前业务场景,另一方面能够很好的预判支撑未来产品架构发展,错误的架构选择可能会让一群程序猿面临大型车祸现场。即使在小公司,系统架构搭建少则半年,多则两年三年,这几年从业下来更加感觉到做好一套大型系统为之不易。而系统架构的升级改造和变动往往是一场持久战,持续的人力投入不说,保障已有的系统和业务平稳过渡是有很大挑战的。最近几年微服务架构逐渐完善成熟,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框架,并挑选部分做表格对比
国内
- Dubbo。来自阿里巴巴 http://dubbo.I/O/
- Motan。新浪微博自用 https://github.com/weibocom/motan
- Dubbox。当当基于dubbo的https://github.com/dangdangdotcom/dubbox
- rpcx。基于 Golang 的 https://github.com/smallnest/rpcx
- Navi & Navi-pbrpc。作者开源的 https://github.com/neoremind/navi https://github.com/neoremind/navi-pbrpc
国外
- Thrift from facebook https://thrift.apache.org
- Avro from hadoop https://avro.apache.org
- Finagle by twitter https://twitter.github.I/O/finagle
- gRPC by Google http://www.grpc.I/O (Google inside use Stuppy)
- Hessian from cuacho http://hessian.caucho.com
- Coral Service inside amazon (not open sourced)
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 | 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
网友评论