分布式系统之 RPC
RPC模型
RPC 比较有影响的论文就是1984年发表的 Implementing Remote Procedure Calls. 有五个核心概念。
1.user(客户端)------>UserStub----->RPCRuntimes ---->RPCRuntimes--->ServerStub--->Server
2.user(客户端)<------UserStub<-----RPCRuntimes <----RPCRuntimes<---ServerStub<---Server
一个完整的RPC调用,核心是通信,序列化和透明化调用.可以参考通信和序列化。 剩下就是透明化调用。
Java远程方法调用
远程方法调用(Remote Method Invocation,RMI),它与论文的流程相似,增加了RMI Registry的概念,进而实现了 客户端和服务端通过Registry来注册服务和寻找服务的调用方式,让客户端和服务端的调用变的透明。
缺点:性能低(JRMP协议采用阻塞模型,原生的序列化方方案),缺少服务治理,不支持异构语言。
异构语言框架gRPC
gRPC是google 开源的一款对语言和平台中立的高性能 RPC框架,,基于http2,支持单连接多路复用,在移动设备上可以节省流量和耗电量。
gRPC服务端的启动代码和 Netty相似,其实其java版本就是使用了Netty作为底层通信框架。
Dubbo
ubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1] Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
-
Provider
暴露服务方称之为“服务提供者”。 -
Consumer
调用远程服务方称之为“服务消费者”。 -
Registry
服务注册与发现的中心目录服务称之为“服务注册中心”。 -
Monitor
统计服务的调用次数和调用时间的日志服务称之为“服务监控中
总结:RMI已经不再适用,Dubbo性能极高,支持多种通信和序列化协议,还支持服务治理。但是有些重。另外Restful API性能较弱,java开发实际中可以采用Netty+Kryo的通信和序列化组合自行实现通信框架也是不错的。