何为RPC?
RPC即远程过程调用,通过名字我们就能看出RPC关注的是远程调用而非本地调用。
为什么要RPC?因为两个不同的服务器上的服务提供的方法不在一个内存空间,所以需要网络编程才能传递方法调用所需要的参数。并且方法调用的结果也需要通过网络编程来接收。但是如果我们自己手动网络编程来实现这个调用过程的话工作量是非常大的,因为我们需要考虑底层传输方式(TCP或者UDP),序列化方式等。
RPC能帮助我们做什么呢?简单来说,通过RPC可以帮助我们远程调用计算机上某个服务的方法。这个过程就像调用本地方法一样简单,并且我们不需要了解底层网络编程的具体细节。
举个例子:A,B两个服务部署在不同的机器上,服务A想调用服务B的某个方法就可以通过RPC来做。
一言蔽之:RPC的出现就是为了让你调用远程方法像调用本地方法一样简单。
RPC的原理是什么?
我们可以将整个RPC的核心功能看作是下面5个部分的实现:
- 客户端(服务消费端):调用远程方法的一端。
- 客户端Stub(桩):这其实就是一个代理类。代理类主要做的事情很简单,就是把你调用方法,类,方法参数等信息传递到服务端。
- 网络传输:网络传输就是你要把你调用的方法的信息比如说参数这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种,比如最基本的Socket或者性能以及封装更加优秀的Netty.
- 服务端Stub(桩):这个桩就不是代理类的,实际指的就是接收到客户端执行方法的请求后,去指定对应的方法返回结果给客户端的类。
- 服务端(服务提供端):提供远程方法的一端。
简单来讲:
- 客户端以本地调用的方式调用远程服务。
- 客户端Stub接收到调用后负责将方法,参数等组装成能够进行网络传输的消息体(序列化):RpcRequest
- 客户端找到远程服务的地址,并将消息发送到服务端
- 服务端Stub收到消息将消息反序列化成java对象。
- 服务端Stub根据对象中的类,方法,方法参数等信息调用本地的方法
- 服务端Stub等到方法的执行结果并组装成能够进行网络传输的消息体,序列化后发送给客户端
- 客户端Stub收到消息并反序列化成java对象。这样就得到了最终的结果。
有哪些常见的RPC框架?
我们这里说的RPC框架指可以让客户端直接调用服务端方法,就像调用本地方法一样简单的框架,比如下面说的Dubbo,Motan,gRPC这些。如果需要和HTTP协议打交道,解封和封装HTTP请求和响应,这种框架并不能算RPC框架,比如Feign。
Dubbo
Apache Dubbo是一款微服务框架,为大规模微服务实践提供高性能RPC通信,流量治理,可观测性等解决方案,涵盖Java,Golang等多种语言SDK实现。
Motan
Motan是新浪微博开源的一款RPC框架。据说在新浪微博正支撑着千亿次调用。不过好像市面上很少有公司使用。
很多人喜欢拿Dubbo和Motan作比较,但是Motan更像是一个精简版的Dubbo,可能是借鉴了Dubbo的思想,Motan的设计更加精简,功能更加纯粹。
不过不推荐实际项目中使用Motan,因为Dubbo的社区活跃度以及生态都要好得多。
- 从 Motan 看 RPC 框架设计:http://kriszhang.com/motan-rpc-impl/
- Motan 中文文档:https://github.com/weibocom/motan/wiki/zh_overview
gRPC
gRPC是Google开源的一个高性能,通用的RPC框架。其主要是面向移动应用开发并基于HTTP/2协议标准而设计的。基于ProtoBuf序列化协议开发,并支持众多开发语言。
何谓 ProtoBuf? 它是一种更加灵活、高效的数据格式,可用于通讯协议、数据存储等领域,基本支持所有主流编程语言且与平台无关。不过,通过 ProtoBuf 定义接口和数据类型还挺繁琐的,这是一个小问题。
据说Dubbo-go 3.0主要是借鉴了gRPC。
不过gRPC的设计导致其几乎没有服务治理功能。如果想要解决这个问题还要依赖于其它组件。
- Github:https://github.com/grpc/grpc
- 官网:https://grpc.io/
Thrift
Apache Thrift 是 Facebook 开源的跨语言的 RPC 通信框架,目前已经捐献给 Apache 基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于 thrift 研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。
Thrift支持多种不同的编程语言,包括C++、Java、Python、PHP、Ruby等(相比于 gRPC 支持的语言更多 )。
- 官网:https://thrift.apache.org/
- Thrift 简单介绍:https://www.jianshu.com/p/8f25d057a5a9
总结
gRPC和Thrift虽然支持跨语言的RPC调用,但是他们只提供了最基本的RPC框架功能,缺乏一系列配套的服务化组件和服务化治理功能的支持。
Dubbo不论是功能完善程度,生态系统还是社区活跃度来说都是最优秀的。而且Dubbo在国能还有很多成功的案例,比如当当网,滴滴等,是一款成熟稳定的RPC框架。最重要的是参考资料多,学习成本相对低。
dubbo也是Spring Cloud Alibaba里的一个组件。
但是dubbo和motan主要是给java语言使用,虽然目前能兼容部分语言,但是不太推荐,跨语言的话,可以考虑gRPC。
本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注。最近这几章侧重于一些理论和现有的轮子,其实说有用吧,工作中几乎用不到。但是说没用吧,我们可以借助原理去更好的理解这个工具,而且实现的方式也可以开拓我们的思路。总之所学即所得,也祝大家工作顺顺利利!