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
2
3
4
5
6
7
1.  网络通信 ---> gRPC自己封装网络通信的部分 提供多种语言的 网络通信的封装 (C Java[Netty] GO)
2. 协议 ---> HTTP2 传输数据的时候 二进制数据内容。 支持双向流(双工)连接的多路复用。
3. 序列化 ---> 基本文本 JSON 基于二进制 Java原生序列化方式 Thrift二进制的序列化 压缩二级制序列化。
protobuf (Protocol Buffers) google开源一种序列化方式 时间效率和空间效率是JSON3---5倍。
IDL语言
4. 代理的创建 --->让调用者像调用本地方法那样 去调用远端的服务方法。
stub

对比

目前流行的开源 RPC 框架还是比较多的,有阿里巴巴的 Dubbo、Google 的 gRPC、Facebook 的 Thrift 和 Twitter 的 Finagle 等

gRPC 与 ThriftRPC 区别

  • 共性:支持异构语言的RPC。
  • 区别:
    1. 网络通信 Thrift TCP 使用专属协议,GRPC 使用 HTTP2
    2. 性能角度 ThriftRPC 性能 高于 gRPC
    3. gRPC 大厂背书(Google),云原生时代 与其他组件合作的顺利。所以gRPC应用更广泛。

gRPC的好处

  1. 高效的进行进程间通信。
  2. 支持多种语言 原生支持 C Go Java 实现。C 语言版本上扩展 C++ C# NodeJS Python Ruby PHP..
  3. 支持多平台运行 Linux Android IOS MacOS Windows。
  4. gPRC 序列化方式采用 protobuf,效率高。
  5. 使用 Http2 协议
  6. 大厂的背书

01-gRPC 简介
https://flepeng.github.io/046-gRPC-01-gRPC-简介/
作者
Lepeng
发布于
2024年4月1日
许可协议