RPC基础知识回顾
1、先认识一下大家熟悉的HTTP
大家都了解HTTP吧。相信项目中也用过一些。
比如:
- JDK自带的老旧的HttpURLConnection,封装写的很累,java8之前基于HTTP1.0。在java9开始支持Http2.0
- Spring的其中RestTemplate都是基于HTTP/1.1的请求。
- 最新的还有Spring5推出的Webclient,这是基于http2.0的。
- 嗯…,java11不甘示弱,也在java11推出了Httpclient,不过国内都是用java8,这个也用不到,我也没用过,hhh…
- SpringCloud组件,Feign/OpenFeign,这是Http请求。
HTTP和RPC的区别
Http:是应用层协议
RPC:是远程调用框架,一般是基于TCP协议,还有些使用HTTP协议。
tips:讲一下TCP和HTTP
忘了叫啥?搜一下。OSI七层模型。OSI(Open System Interconnection)
这个OSI是理想的规范。
然后实际上实现的这个OSI的模型是,TCP/IP四层模型。
很明显,HTTP是在应用层,TCP是发生在传输层。所以TCP是效率高于HTTP是基于实际模型出发的。
RPC可以基于TCP协议(传输层),也可以基于HTTP协议(应用层)。
2、触摸RPC的本源
RPC,Remote Procedure Call.
远程程序调用框架。
RPC可以基于TCP协议(传输层),也可以基于HTTP协议(应用层)。
3、RPC的角色
RPC的核心功能主要角色分为:
1、客户端(消费端):理解成,新能源问界M9汽车,开车没电来充电。
2、客户端Stub(桩):理解成充电桩,充电电
3、网络传输:就是那个充电线连接到电网的电线。
4、服务端Stub(桩):电网的输入桩
5、服务端:提供电网的发电厂
原理过程。
偷一张图,其实我解释一下就能明白的。
- 服务消费端(client)以本地调用的方式调用远程服务;
- 客户端 Stub(client stub) 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体(序列化):
RpcRequest
; - 客户端 Stub(client stub) 找到远程服务的地址,并将消息发送到服务提供端;
- 服务端 Stub(桩)收到消息将消息反序列化为 Java 对象:
RpcRequest
; - 服务端 Stub(桩)根据
RpcRequest
中的类、方法、方法参数等信息调用本地的方法; - 服务端 Stub(桩)得到方法执行结果并将组装成能够进行网络传输的消息体:
RpcResponse
(序列化)发送至消费方; - 客户端 Stub(client stub)接收到消息并将消息反序列化为 Java 对象:
RpcResponse
,这样也就得到了最终结果。over!
相信小伙伴们看完上面的讲解之后,已经了解了 RPC 的原理。
上面也是抄的。
好的,我来总结下:
客户端Stub(桩):
- RpcRequest 将客户端信息,封装成可以传输的消息体,注意序列化。
- 找到远程服务的地址
服务端Stub(桩):
- RpcRequest 反序列化,调用本地的方法;
- 得到方法执行结果并将组装成能够进行网络传输的消息体:
RpcResponse
(序列化)发送至消费方;
客户端Stub(桩)
- 接收到消息并将消息反序列化为 Java 对象:
RpcResponse
,这样也就得到了最终结果。over!
3、常见框架
1、Dubbo
Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,
涵盖 Java、Golang 等多种语言 SDK 实现。
Dubbo 提供了从服务定义、服务发现、服务通信到流量管控等几乎所有的服务治理能力,支持 Triple 协议(基于 HTTP/2 之上定义的下一代 RPC 通信协议)、应用级服务发现、Dubbo Mesh (Dubbo3 赋予了很多云原生友好的新特性)等特性。
2、Motan
Motan 是新浪微博开源的一款 RPC 框架,据说在新浪微博正支撑着千亿次调用。不过笔者倒是很少看到有公司使用,而且网上的资料也比较少。
很多人喜欢拿 Motan 和 Dubbo 作比较,毕竟都是国内大公司开源的。笔者在查阅了很多资料,以及简单查看了其源码之后发现:Motan 更像是一个精简版的 Dubbo,可能是借鉴了 Dubbo 的思想,Motan 的设计更加精简,功能更加纯粹。
3、gRPC
这个我做了详细的介绍和入门。
主要就是HTTP2的协议,加上protoBuffer的处理数据的一个序列化协议。
protobuf最好的就是通用性和规范性。
4、Thrift
Apache Thrift 是 Facebook 开源的跨语言的 RPC 通信框架,目前已经捐献给 Apache 基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于 thrift 研发一套分布式服务框架,增加诸如服务注册、服务发现等功能
RPC协议可以基于不同的传输协议实现,如 TCP、HTTP、UDP等。不同的RPC框架或实现可以选择适合自己需求的传输协议。