常见的RPC架构对比
- RPC基本原理
- 常见的RPC架构
- 1.java RMI:
- 2.Motan
- 3.Apache Trift
- 4.gRPC
- 5. Dubbo
RPC基本原理
1.client code:客户端代码调用的实现,负责发起RPC调用,为调用方提供提供API;
2.序列号与反序列化:一般RPC网络传输的内容有文本和二进制两大类。文本:xml和json。二进制:java原生的序列化与反序列化,以及Hession、protobuf、Thrift、Avro、Kryo、MessagePack;
3.stub Proxy:存根,可以看做一种代理对象,屏蔽了RPC调用的复杂网络处理,使得RPC调用透明化。
4.Transport:作为RPC底层的通讯模块,一般使用Socket使得客户端与服务端之间传递请求与应答。
5.service code:服务端服务业务逻辑具体的实现
最为关键影响RPC性能框架的两个因素:序列化和通讯模块。
常见的RPC架构
1.java RMI:
基于java的远程过程调用,是java特有的RPC实现。
- 真正支持面向对象的多态
- 不支持其他语言
- 使用了java原生的序列化机制,所有序列化对象必须实现serializable接口
- 基于BIO实现的socket通讯
2.Motan
新浪微博开源的一个Java 框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。
3.Apache Trift
由FaceBook内部使用,是一种跨平台和语言的RPC架构。支持的语言有:C#,java,C++,Delphi,Erlang,Node.js,Object-C,PHP,Python,Ruby,SmallTalk等。
- 采用二进制编码协议
- TCP-IP协议作为传输层
4.gRPC
由Google开发,高性能开源的通用RPC架构,面向移动和HTTP/2的设计。提后了C语言,java,共语言版本,其中c余元版本支持的较多:C#,javaC,C++,Node.js,Object-C,PHP,Python,Ruby。服务接口定义在.proto文件中。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。跨语言,针对移动端:省电、省流量、高性能、双向流、支持DNS负载。关于性能,肯定比HTTP/1好,比TCP差。
- 序列化:默认使用protocol buffer实现。也支持json等。
- 通讯:gRPC使用的http2.0
5. Dubbo
Dubbo是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(非开源)有竞争关系,导致dubbo团队已经解散,反到是当当网的扩展版本仍在持续发展,墙内开花墙外香。其它的一些知名电商如当当、京东、国美维护了自己的分支或者在dubbo的基础开发。
不过随着spring cloud 的来临,2018年,阿里巴巴整合了各个版本的dubbo,并且开源托管给Apache基金会。形成了全新的Apache Dobbo。成为国内最流行的RPC框架。默认使用hessian协议,支持协议有:
- 1.dubbo:
- 2.rmi:
- 3.hessian:
- 4.http:
- 5.webservice:
- 6.thrift
- 7.memcached
- 8.redis