01-gRPC 简介
1、RPC(Remote Procedure Call、远程过程调用)
RPC 是一种协议,是用来屏蔽分布式计算中的各种调用细节,使你能够像调用本地方法一样,直接调用一个远程的函数。可以理解为一种规范。
下面简单说明一下客户端与服务端的沟通过程,以此来引出rpc的作用
客户端 与 服务器 沟通的过程:
- 客户端 发送 数据 (字节流)
- 服务器 接受并解析。根据约定知道需要执行上面。把结果返回给客户
RPC:
- 封装上述过程,使操作更加优化便捷
- 使用大家都认可的协议,使其规范化
- 做成一些框架,直接或间接产生利益
2、gRPC 框架介绍
gRPC 是由 google 开源的一个高性能的 RPC 框架。Stubby Google 内部的 RPC,演化而来的,2015 正式开源。云原生时代是一个 RPC 标准。
用官方的话来说:
A high-performance, open-source universal RPC framework
gRPC 是一种开源的,高性能的通用 RPC 框架,能够跨平台支持多种语言。(隔壁 Kitex 目前还只能支持 unix 平台)
在 gRPC 中,我们称调用方为 client,被调用方为 server。跟其他 RPC 框架一样,gRPC 也是基于”服务定义”的思想。简单的来说,就是我们通过某种方式来描述一个服务,这种描述方式是语言无关的。在这个”服务定义”的过程种,我们描述了我们提供的服务名是什么,有哪些方法开源被调用,有什么样的入参,有什么样的回参
也就是说,在定义好了这些服务、方法之后, gRPC会屏蔽底层的细节,client只需要直接调用定义好的方法,就能够拿到预期返回的结果。对于server端来说,只需要实现我们定义的方法。同样的,gRPC也会帮助我们屏蔽底层的细节,我们只需要实现所定义方法的具体逻辑即可。
你可以发现,在上面的描述过程种,所谓的”服务定义”,就跟定义接口是类似的。我更愿意理解为是一种”约定”,双方规定好接口,然后server实现接口,client调用接口,至于其他的细节就交给gRPC管理
此外,gRPC 还是语言无关的,我们开源使用 C++ 开发服务端,使用 Golang、Java 等作为客户端来调用服务器的接口。为了实现这一点,我们在”服务定义”和在编码解码过程中,同样应该做到语言无关。因此,gRPC 使用了 Protocol buffers(谷歌开发的一套成熟的数据结构序列化机制)
gRPC 核心的设计思路
1 |
|
对比
目前流行的开源 RPC 框架还是比较多的,有阿里巴巴的 Dubbo、Google 的 gRPC、Facebook 的 Thrift 和 Twitter 的 Finagle 等
gRPC 与 ThriftRPC 区别
- 共性:支持异构语言的RPC。
- 区别:
1. 网络通信 Thrift TCP 使用专属协议,GRPC 使用 HTTP2
2. 性能角度 ThriftRPC 性能 高于 gRPC
3. gRPC 大厂背书(Google),云原生时代 与其他组件合作的顺利。所以gRPC应用更广泛。
gRPC的好处
- 高效的进行进程间通信。
- 支持多种语言 原生支持 C Go Java 实现。C 语言版本上扩展 C++ C# NodeJS Python Ruby PHP..
- 支持多平台运行 Linux Android IOS MacOS Windows。
- gPRC 序列化方式采用 protobuf,效率高。
- 使用 Http2 协议
- 大厂的背书