1. RPC框架
1.1 简介
RPC(Remote Procedure Call)即远程过程调用,不同于本地调用,RPC是指调用远端机器的函数或方法且不需要关心底层的调用细节,如网络协议和传输协议等。对于调用者来说,和调用本地方法没有什么区别。RPC调用的是一个远端对象,调用者和被调用者是处于不同的地址空间。
如果是一个功能比较简单的应用,可以将所有功能实现在一个服务中或者实现在多个服务中,然后部署在一个机器上,这样接口间调用要么在同一进程内或者是本地进程间通信。随着业务的发展,服务功能持续迭代,单体应用出现性能瓶颈,这时就需要考虑对服务进行拆分,根据业务功能划分为不同的模块,不同的模块部署到不同的集群上,模块间进行通信完成功能。一个服务拆分为不同的模块或者单体应用拆分为多个微服务时,就需要RPC,不同模块及不同服务间都需要RPC才能进行通信,RPC是分布式系统架构或者微服务架构必不可少的实现手段。
1.2 RPC框架的重要组成
- 客户端(Client):服务调用方
- 客户端存根(Client Stub):存放服务端地址,将客户端请求参数数据信息打包成网络消息,再通过网络传输发送给服务器
- 服务端存根(Server Stub):接收客户端发送过来的请求新消息并进行解包,然后调用本地服务进行处理
- 服务端(Server):服务的真正提供者
- Network Service:底层传输,可以是TCP或者HTTP
1.3 原理
当客户端发起一次远程调用时:
- client以本地方式调用远程方法
- client stub受到调用后负责将方法以及参数等组成网络可以传输的消息体
- client stub找到服务端地址,通过系统调用,将数据传输服务端
- server stub收到消息后进行反序列化
- server stub通过得到的参数调用本地方法
- 执行结果返回给server stub
- server stub将执行结果进行序列化
- server stub进行系统调用将数据发送给客户端
- client stub收到消息并进行解码
- client stub将结果返回给调用者
2. 常用框架
2.1 Thrift
Thrift是一个轻量级、跨语言的RPC框架,主要用于各个服务之间的RPC通信,最初由Facebook于2007年开发,2008年进入Apache开源项目。它通过自身的IDL中间语言,借助代码生成引擎生成各种主流语言的RPC服务端和客户端模板代码。支持多种不同的编程语言,包括C++、Java、Python、PHP、Ruby、C#、Golang等。
2.2 gRPC
gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2标准协议设计,基于ProtoBuf序列化协议开发,且支持众多语言开发。gRPC提供了一种简单的方法来精确的定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链式功能,从而有助于节省带宽、降低TCP连接次数、节省CPU使用、电池寿命。
2.3 Dubbo
Dubbo是一个分布式服务框架,以及SOA治理方案。其功能主要包括高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架。
2.4 对比
选择Thrift更好:
- 需要在非常多的语言间进行数据交换
- 对CPU敏感
- 协议层、传输层有多种控制要求
- 需要稳定的版本
- 不需要良好的文档和示例
选择gRPC更好:
- 需要良好的文档和示例
- 喜欢或是习惯HTTP/2、ProtoBuf
- 对网络传输带宽敏感
心得体会(总结)
- 理解分布式系统概念:在学习RPC框架之前,先了解分布式系统的基本概念是很重要的。了解分布式系统是如何工作的,包括网络通信、服务发现、负载均衡和容错机制等方面,有助于更好地理解RPC框架的使用和设计。
- 选择合适的RPC框架:RPC框架有多种选择,如gRPC、Apache Dubbo、Thrift等。根据项目需求、性能要求、开发语言和社区支持等因素,选择最适合的框架进行学习和实践。
- 性能优化和安全考虑:RPC框架通常提供了性能优化和安全机制,如连接池、请求压缩、认证和授权等。