Go框架三件套-RPC框架 | 青训营

125 阅读4分钟

1. RPC框架

1.1 简介

RPC(Remote Procedure Call)即远程过程调用,不同于本地调用,RPC是指调用远端机器的函数或方法且不需要关心底层的调用细节,如网络协议和传输协议等。对于调用者来说,和调用本地方法没有什么区别。RPC调用的是一个远端对象,调用者和被调用者是处于不同的地址空间。
如果是一个功能比较简单的应用,可以将所有功能实现在一个服务中或者实现在多个服务中,然后部署在一个机器上,这样接口间调用要么在同一进程内或者是本地进程间通信。随着业务的发展,服务功能持续迭代,单体应用出现性能瓶颈,这时就需要考虑对服务进行拆分,根据业务功能划分为不同的模块,不同的模块部署到不同的集群上,模块间进行通信完成功能。一个服务拆分为不同的模块或者单体应用拆分为多个微服务时,就需要RPC,不同模块及不同服务间都需要RPC才能进行通信,RPC是分布式系统架构或者微服务架构必不可少的实现手段。

1.2 RPC框架的重要组成

  1. 客户端(Client):服务调用方
  2. 客户端存根(Client Stub):存放服务端地址,将客户端请求参数数据信息打包成网络消息,再通过网络传输发送给服务器
  3. 服务端存根(Server Stub):接收客户端发送过来的请求新消息并进行解包,然后调用本地服务进行处理
  4. 服务端(Server):服务的真正提供者
  5. Network Service:底层传输,可以是TCP或者HTTP

1.3 原理

当客户端发起一次远程调用时:

  1. client以本地方式调用远程方法
  2. client stub受到调用后负责将方法以及参数等组成网络可以传输的消息体
  3. client stub找到服务端地址,通过系统调用,将数据传输服务端
  4. server stub收到消息后进行反序列化
  5. server stub通过得到的参数调用本地方法
  6. 执行结果返回给server stub
  7. server stub将执行结果进行序列化
  8. server stub进行系统调用将数据发送给客户端
  9. client stub收到消息并进行解码
  10. 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框架通常提供了性能优化和安全机制,如连接池、请求压缩、认证和授权等。