1 gRPC 框架简介

1 gRPC框架简介

最近一些年,随着网络的快速发展,一些软件项目越来越大、越来越复杂,也越来越变得难以维护。为了改变这样的困境,项目拆分成了一个选择。但不是没有代价的,原先作为一个单一项目,数据都在服务内部进行交互、处理,拆分为若干项目之后,数据间的交互成为一个问题。这个时候,RPC框架应运而生,解决了服务进程间的数据交互问题。

1.1 RPC简介及原理

RPC,远程过程调用协议(Remote Procedure Call Protocol),是为解决服务进程间数据交互而诞生的一种技术。客户端发起请求,服务端返回数据。它底层封装了网络交互的各种繁琐细节,使程序员可以专注于程序业务,快速实现进程间数据交互。

PRC 是怎样知道程序要交互的各个细节呢?

这不得不提到各种现代编程语言的一种编程思想——抽象!

在RPC 内部,无论是客户端还是服务端,都有一个叫做stub存根的组件,它是代理进行网络调用的对象。stub之上,是程序间定义的交互规则——服务接口。客户端调用服务接口,进而调用stub及网络,然后网络传输到服务端,再通过网络、stub反向找到服务接口,找到服务端注册的服务接口的具体实现,响应调用请求,通过网络访问客户端,就完成了服务进程间的数据交互。

图像说明文字

图1.1 RPC 调用过程

从图中可以清楚看到,对于程序开发来说,在使用RPC过程中,服务接口最为重要,它定义了服务间的交互规则,是服务双方需要直接调用的组件。在服务端,服务接口具体实现真正实现了程序业务逻辑,进而实现了拆分程序的目标。而客户端,只需要调用服务接口解析访问数据即可。

一个定义良好规范的服务接口,对于RPC来说,非常关键和重要。

1.2 为何选择gRPC

gPRC,google开源实现的一个RPC框架,以支持多语言和适用移动场景应用为最大特点,自2015年项目发起以来受到广大关注。

目前,gRPC框架已经成熟,在互联网公司例如京东、腾讯等都开始有所应用。

图像说明文字

图1.2 gRPC 官方列出的使用项目

为什么选择gRPC框架呢,总的来说,有三点原因:1多语言支持;2基于HTTP2标准;3、可插拔的插件机制。

在一个规模较大的公司当中,通常开发语言都不只有一种。通过gRPC,只需定义一个服务接口,就可实行各种语言项目之间的交互,大大促进了各项目之间的融合,减少了内部设施的复杂度。到目前,gRPC已支持C、C++、C#、Object-c、Java、Go、Ruby…..等多种语言。

gRPC基于HTTP/2标准设计,相比 HTTP /1标准,压缩头部,节省数据传输,同时带来了诸如双向流、流控、单TCP连接上的多复用请求等特性。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

另外,许多客户端通过 HTTP 代理访问网络,gRPC 采用 HTTP/2 实现,能透明转发 gRPC 的数据,无缝兼容 gRPC。

Nginx从1.13.10开始支持gRPC。

gRPC 在设计之初,就注意到了后期扩展。通过提供可插拔的插件机制,可以实现负载平衡、跟踪、健康检查和身份验证等诸多高级功能。

1.3 使用 gRPC 的前置知识

对于使用RPC来说,服务接口的定义至关重要。

许多RPC框架,例如阿里Dubbo,都是使用RPC本身开发语言来定义服务接口,而gRPC,为了实现对多语言支持,采用了一种叫做Protobuf的服务中立语言,来定义服务接口。

Protobuf是一种序列化机制,也是一种中立接口。Protobuf自成一个体系,不与任何特定编程语言绑定。在这个体系中,它拥有对各种语言特性的描述。使用Protobuf定义接口后,只需要使用Protobuf对应各语言的编译器,反向生成编程语言,就能实现跨语言特性。

简单理解,Protobuf就是一门编程语言,而Protobuf特定语言编译器,就是编程语言的特定系统编译器。编程语言依靠对应的特定系统编译器实现了跨系统运行,同样,Protobuf也依靠特定语言编译器,实现了多语言支持。

因此,要使用gRPC,protobuf是必须要掌握的前置知识。

接下来,就让我们来了解 Protobuf吧!

目录