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吧!