gRPC是由Google开发的一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
在gRPC中,客户端应用可以像调用本地方法一样直接调用另一台不同机器上的服务端应用的方法,使得能够更容易地创建分布式应用和服务。
相关面试题
(1)什么是RPC?★★★★☆
(2)RPC框架的原理是怎样的?★★★★☆
(3)RPC的调用流程是怎样的?★★★☆☆
(4)主流的RPC框架有哪些?★★★☆☆
1.RPC的原理
RPC(Remote Procedure Call)指远程过程调用,主要用于异构的分布式系统之间的通信。随着系统复杂度的增加,我们不得不将一个大的应用拆分为多个服务,这种拆分既包括水平方向拆分(按照功能模块拆分),也包括垂直方向拆分(按照应用所处的层拆分)。进行服务拆分后,由于服务分布在多台服务器上,所以相互之间的调用需要通过网络来进行。
RPC的主要目标是在尽量保证提供类似本地调用的简洁语义的基础上,让分布式应用之间的通信变得更加方便和高效。RPC框架需要提供一种透明调用机制,使得调用者无须显式地区分本地调用和远程调用,同时基于 RPC 使得服务治理(服务限流、服务熔断等)更加方便。
RPC被广泛使用主要有如下原因。
(1)随着业务复杂化和系统拆分,微服务构建和分布式部署已经成为常态,而分布式系统之间的通信需要使用RPC框架实现。
(2)随着公司规模的增长,不同的团队和项目使用不同的语言开发,跨语言的接口调用需求不断增加。
(3)分布式系统之间的服务治理可以通过RPC框架解决。
(4)要实现高并发的网络服务访问,传统的 HTTP2 在每次调用时都要建立连接,对资源消耗多且效率低下。
RPC的调用分为异步和同步两种方式,异步调用不用等待调用结果,而同步调用需要等待调用结果的返回。
RPC 架构包含4个核心组件:客户端(Client)、客户端存根(Client Stub)、服务端(Server)及服务端存根(Server Stub)。
(1)客户端:服务的调用者。
(2)客户端存根:存放服务端的服务列表,将客户端请求打包并通过网络发送到服务端。
(3)服务端:服务提供者。
(4)服务端存根:接收客户端消息并解包,然后调用本地的方法。
RPC的调用过程主要包括:建立通信、服务寻址、网络传输、服务调用和返回。一个典型的RPC调用的详细流程如图所示。
(1)客户端以本地调用的方式发起调用,这时调用的其实是客户端存根。
(2)服务端存根在收到调用后,负责将被调用的方法名、参数等打包并编码成特定格式的能进行网络传输的消息体。
(3)客户端存根将消息体通过网络发送给服务端。
(4)服务端存根通过网络接收到消息,按照相应的格式进行拆包、解码,获取方法名和参数。
(5)服务端存根根据方法名和参数进行本地调用,这时调用的是真正的服务提供者。
(6)服务提供者调用本地服务,然后将结果返回给服务端存根。
(7)服务端存根将返回值打包并编码成消息。
(8)服务端存根通过网络将消息发送给客户端。
(9)服务端存根在收到消息后,进行拆包、解码并返回给客户端。
(10)服务端存根得到本次RPC调用的最终结果。
在RPC中一般会用到动态代理、序列化反序列化、NIO网络通信、服务注册和发现等技术。
2.gRPC的原理
gRPC无论是客户端还是服务端都可以在多种语言环境中运行。如下图所示,gRPC的服务端是C++提供的服务,而客户端一个是Ruby客户端,一个是Java客户端。客户端和服务端之间通过Proto的请求和响应完成跨网络和跨语言的访问。
添加图片注释,不超过 140 字(可选)
gRPC中的角色包括客户端和服务端,其服务调用过程如下。
(1)客户端调用远程方法发起RPC调用,对调用的请求信息使用ProtoBuf进行对象序列化压缩。
(2)服务端(gRPC Server)在接收到请求后,解码请求体,进行业务逻辑处理并返回。
(3)对响应结果使用ProtoBuf进行对象序列化压缩。
(4)客户端接收到服务端的响应结果,解码请求体,回调被调用的方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果。
gRPC的特性如下。
(1)语言中立,支持多种语言。
(2)通信协议基于标准的HTTP2来设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性。这些特性使得gRPC在移动端设备上更加省电和节省网络流量。同时HTTP2协议让gRPC的网络兼容能力更好。
(3)序列化支持ProtoBuf和JSON。ProtoBuf是一种语言无关的高性能序列化框架,基于HTTP2和ProtoBuf,保障了RPC调用的高性能。
gRPC服务端的创建流程如下。
(1)创建Netty HTTP2服务端。
(2)将需要调用的服务端接口实现类注册到内部的Registry中,当客户端发起 RPC调用时,可以根据RPC请求消息中的服务定义信息查询到服务接口实现类。
(3)创建gRPC Server。gRPC Server是gRPC服务端的抽象,聚合了各种Listener,用于RPC消息的统一调度和处理。gRPC Server在接收到gRPC请求消息后会先对gRPC消息头和消息体进行解析和处理,然后经过内部的服务路由和调用,最后返回响应消息。
内容摘自《Offer来了(第2版)》。这是一本超强Java面试宝典、面霸手册,超详尽的Java知识点速查,Java面试题库,帮你深入理解Java核心技术,对Java知识点查漏补缺,可作为工具书使用。