x-note
  • Introduction
  • JavaScript
    • JavaScript 作用域链
    • JavaScript 数据结构与类型
    • JavaScript 原型
    • JavaScript this 关键字
    • JavaScript 函数
    • JavaScript delete 运算符
    • JavaScript 内存管理与垃圾回收
    • JavaScript 严格模式与混乱模式
    • JavaScript 数字精度丢失
    • JavaScript 并发模型
    • 利用原型链实现继承
  • ECMAScript
    • ECMAScript 6 变量及常量的声明
    • ECMAScript 6 变量的解构赋值
    • ECMAScript 6 Promise 对象
    • ECMAScript 6 Symbol
    • ECMAScript 6 Proxy
    • ECMAScript 6 Reflect
    • ECMAScript 6 new.target
    • ECMAScript 6 Set 和 WeakSet
    • ECMAScript 6 Map 和 WeakMap
    • ECMAScript 6 Iterator
    • ECMAScript 6 Generator
    • ECMAScript 6 class
    • ECMAScript 7
    • ECMAScript 8 async 函数
    • ECMAScript 8 内存共享与原子性
    • ECMAScript 8 Others
    • ECMAScript 2018
    • ECMAScript 2019
  • CSS
    • CSS 块格式化上下文(BFC)
    • CSS 盒模型
    • CSS 外边距合并
    • CSS Float
    • CSS Position
    • CSS Border-Image
    • CSS BEM
    • CSS 表布局详解
    • 页面布局之单列布局
    • 页面布局之多列布局
  • React
    • React 组件的生命周期
    • React 虚拟 DOM
    • React Reconciliation
    • React Diff 算法核心
    • React Fiber
    • React Scheduling
    • React Context API
    • React Refs
    • React HMR
    • React Hook
  • VUE
    • VUE 响应式系统
    • VUE 渲染机制
    • 关于 Vue 的思考
  • Webpack
    • Webpack 基本概念
    • Webpack HMR
  • Babel
    • @babel/preset-env
  • WEB
    • WEB 基础知识及概念
      • 屏幕测量单位
      • 重绘与重排
      • 前端模块化系统
      • WEB 客户端存储
      • 浏览器的渲染过程
    • WEB 性能优化
      • WEB 性能指标
      • WEB 图片优化
      • 懒加载资源
    • WEB 安全
      • XSS
      • XSRF
      • 点击劫持
      • 同源策略(Same Origin Policy,SOP)
    • WEB 解决方案
      • webp 兼容方案
      • WEB 拖拽实现方案
    • WEB SEO
  • Git
    • Git 工作流
    • Git 内部原理
  • 传输协议
    • UDP
      • UDP 基本概念
    • TCP
      • TCP 基本概念
    • HTTP
      • HTTP 基础
      • HTTP 缓存
      • HTTP-2
      • HTTP-3
      • HTTPS
      • 自定义 HTTPS 证书
  • Protocol Buffers
    • Protocol Buffers 基础
  • gRPC
    • gRPC 简介
    • gRPC 基础概念
    • GRPC with GraphQL and TypeScript
  • 正则表达式
    • 正则表达式基础
    • 正则表达式的悲观回溯
  • 基础算法
    • 冒泡排序
    • 插入排序
    • 选择排序
    • 快速排序
    • 归并排序
    • 希尔排序
    • 堆排序
    • 桶排序
    • 计数排序
    • 基数排序
    • 二叉树的遍历
    • 动态规划
    • 回溯
  • 压缩算法
    • HPACK
    • QPACK
  • 设计模式
    • DDD
      • 模型元素的模式
    • 常见设计模式
      • 工厂方法
      • 抽象工厂
      • 构造器
      • 原型
      • 单例模式
      • 适配器模式
      • 桥接模式
      • 组合模式
      • 外观模式
      • 享元模式
      • 代理模式
      • 责任链模式
      • 命令模式
      • 迭代器模式
      • 中介者模式
      • 备忘录模式
      • 观察者模式
      • 状态模式
      • 策略模式
      • 模版方法模式
      • 访问者模式
      • 依赖注入
    • MVC
    • MVP
    • MVVM
  • 颜色空间
    • LCH
由 GitBook 提供支持
在本页
  • 概述
  • 服务定义 Service definition
  • 使用 API surface
  • 同步与异步
  • RPC 生命周期
  • Unary RPC
  • Server streaming RPC
  • Client streaming RPC
  • Bidirectional streaming RPC
  • Deadlines/Timeouts
  • RPC 终止
  • 取消 RPC
  • Metadata
  • Channels
在GitHub上编辑
  1. gRPC

gRPC 基础概念

上一页gRPC 简介下一页GRPC with GraphQL and TypeScript

最后更新于5年前

概述

服务定义 Service definition

与许多 RPC 系统一样,gRPC 围绕定义服 ​​ 务的思想,指定可通过其参数和返回类型远程调用的方法。 默认情况下,gRPC 使用 作为接口定义语言(IDL)来描述服务接口和有效负载消息的结构。

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  string reply = 1;
}

gRPC 可以定义四种服务方法:

  • Unary RPCs, 客户端向服务器发送单个请求并获得单个响应,就像普通的函数调用一样。

    rpc SayHello(HelloRequest) returns (HelloResponse) {
    }
  • Server streaming RPCs,客户端向服务器发送请求,并获取流以回读一消息队列。客户端从返回的流中读取,直到没有更多消息为止。 gRPC 保证单个 RPC 调用中的消息顺序。

    rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse) {
    }
  • Client streaming RPCs,客户端再次使用提供的流编写一消息队列并将其发送到服务器。客户端写完消息后,它将等待服务器读取消息并返回响应。 gRPC 再次保证了在单个 RPC 调用中的消息顺序。

    rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
    }
  • Bidirectional streaming RPCs,双方都使用读写流发送一系列消息。这两个流独立运行,因此客户端和服务器可以按照自己喜欢的顺序进行读写:例如,服务器可以在写响应之前等待接收所有客户端消息,或者可以先读取消息再写入消息,或其他一些读写组合。每个流中的消息顺序都会保留。

使用 API surface

从 .proto 文件中的服务定义开始,gRPC 提供了 protocol buffer 编译器插件,这些插件可生成客户端和服务器端代码。 gRPC 用户通常在客户端调用这些 API,并在服务器端实现相应的 API。

  • 在服务器端,服务器实现服务声明的方法,并运行 gRPC 服务器来处理客户端请求。 gRPC 基础结构解码传入的请求,执行服务方法,并对服务响应进行编码。

  • 在客户端,客户端具有一个称为 stub 的本地对象(对于某些语言,可能是 client),该对象实现与服务相同的方法。然后,客户端可以只在本地对象上调用这些方法,将调用的参数包装在适当的 protocol buffer 消息类型中-gRPC 在将请求发送到服务器并返回服务器的 protocol buffer 响应之后进行查找。

同步与异步

阻塞的同步 RPC 调用直到服务器收到响应为止,是最接近 RPC 所追求的过程调用抽象的近似方法。 另一方面,网络本质上是异步的,因此在许多情况下能够启动 RPC 而不阻塞当前线程很有用。

大多数语言中的 gRPC 编程界面都有同步和异步两种形式。

RPC 生命周期

Unary RPC

  • 服务器既可以立即发送自己的初始 metadata(必须在发送任何响应之前发送),也可以等待客户端的请求 message (首先发生的是特定于应用程序。

  • 服务器收到客户的请求消息后,它将执行创建和填充其响应所需的所有工作。然后将响应(如果成功)连同状态详细信息(状态代码和可选状态消息)以及可选尾随 metadata 一起返回(如果成功)。

  • 如果状态为 OK,则客户端将获得响应,从而在客户端完成调用。

Server streaming RPC

server-streaming RPC 不同之处在于服务器在获得客户端的请求消息后发回响应流。发送回所有响应后,服务器的状态详细信息(状态代码和可选状态消息)和可选的尾 metadata 将被发送回服务器端以完成操作。客户端在收到所有服务器的响应后即完成操作。

Client streaming RPC

Client streaming RPC,不同之处在于客户端将请求流而不是单个请求发送到服务器。服务器通常在收到客户端的所有请求后(但不一定)发送单个响应,以及其状态详细信息和可选的尾 metadata。

Bidirectional streaming RPC

在 Bidirectional streaming RPC 中,调用再次由客户端调用方法,服务器接收客户端 metadata,方法名称和 deadline 。同样,服务器可以选择发回其初始元数据,或等待客户端开始发送请求。

接下来发生的情况取决于应用程序,因为客户端和服务器可以按任何顺序进行读写 -- 流完全独立地运行。 所以,例如,服务器可以等到收到所有客户端的消息后再写响应,或者服务器收到请求,然后发回响应,然后客户端发送基于响应的另一个请求,依此类推。

Deadlines/Timeouts

gRPC 允许客户端指定在终止带有错误 DEADLINE_EXCEEDED 的 RPC 之前,他们愿意等待 RPC 完成多长时间。在服务器端,服务器可以查询以查看特定的 RPC 是否超时,或者还剩下多少时间来完成 RPC。

如何指定 deadline/timeout 的方式因语言而异。 例如,并非所有语言都有默认期限,某些语言 API 按照 deadline (固定的时间点)工作,而某些语言 API 根据 timeouts 来工作(持续时间)。

RPC 终止

在 gRPC 中,客户端和服务器都对呼叫成功进行独立和本地确定,其结论可能不匹配。

例如,在服务器端成功完成 RPC 的 RPC(“我已发送所有响应!”),而在客户端却失败了(“响应在我的 deadline 之后到达!”)。

服务器也有可能在客户端发送所有请求之前决定完成。

取消 RPC

客户端或服务器都可以随时取消 RPC。取消操作会立即终止 RPC,因此无需进行进一步的工作。 这不是“撤消”:取消之前所做的更改不会回滚

Metadata

Metadata 是以键值对列表的形式提供的有关特定 RPC 调用的信息(例如身份验证详细信息),其中键是字符串,值通常是字符串(但可以是二进制数据)。 Metadata 对于 gRPC 本身是不透明的,它允许客户端向服务器提供与调用相关的信息,反之亦然。

对元数据的访问取决于语言。

Channels

gRPC 通道提供到指定主机和端口上的 gRPC 服务器的连接,并在创建客户端 stub/client 时使用。 客户可以指定通道参数来修改 gRPC 的默认行为,例如打开和关闭消息压缩。通道具有状态,包括 connected 和 idle。

客户端调用 stub/client 对象上的方法后,会通知服务器 RPC 被调用。使用该客户端的 ,方法名称和指定的 。

关于身份验证可参考:

protocol buffers
metadata
deadline
gRPC Authentication