gRPC 基本概念

声明

本篇文章是在学习gRPC框架的过程中翻译的官方文档,非作者原创,官方文档参考gRPC,学习gRPC过程中,有些概念,思想理解翻译不到位还请多多指教。


本文通过回顾gRPC整体架构和RPC的生命周期来介绍gRPC中一些重要概念。
本文假定读者已经阅读过什么是gRPC。本文不具体讲解gRPC与具体语言相关的实现细节,这个部分内容读者可以参考

概述

服务定义

和其他RPC系统一样,服务定义也是gRPC的基础,gRPC默认使用protocol buffers作为接口定义语言(IDL)来定义服务接口和负载信息的结构,gRPC支持使用其他方法进行服务定义。一个简单的HelloService服务定义如下:

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

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  string reply = 1;
}

gRPC支持定义四种类型的方法:

  • 一元RPC方法:客户端发起一个请求,从服务端得到一个响应,和普通函数调用相似。
rpc SayHello(HelloRequest) returns (HelloResponse){
}
  • 服务端返回流RPC方法:客户端发起一个请求,从服务端得到一个消息流,客户端可以一直从流中读取数据直到读取完服务端返回的所有数据。
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}
  • 客户端发送流RPC方法:客户端向请求中写入流并发送给服务端,客户端发送完全部数据,客户端会使用相同的流获取服务端的返回。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}
  • 双向流RPC方法:客户端和服务端都可以使用读-写流发送一系列消息。读、写流的操作互相独立,客户端和服务端都可以按照各自的顺序读写数据。服务端响应客户端的三种方式:1、读完所有请求,然后返回响应;2、边读边发送响应;3、1和2的任意组合。读写流中数据的顺序保持不变。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
}

API 使用

API

使用.proto文件定义一个服务,gRPC提供protocol buffer编译插件来生成客户端和服务端代码,服务端实现API,客户端调用API。

  • 服务端:服务端需要实现.proto中定义的方法,并启动一个gRPC服务器用于处理客户端请求。gRPC反序列化到达的请求,执行服务方法,序列化服务端响应并发送给客户端。
  • 客户都:客户端本地有一个实现了服务端一样方法的对象,gRPC中称为桩,其他语言中更习惯称为客户端。客户调用本地桩的方法,将参数按照合适的协议封装并将请求发送给服务端,并接收服务端的响应。


    请求-响应模型

同步vs异步

在服务器返回响应前,同步RPC调用将阻塞客户端当前线程,同步RPC调用与gRPC的抽象过程调用模型最接近。从另一方面来看,网络本质上是异步的,在许多情况下,能够在不阻塞当前线程的情况下进行RPC调用非常有用。大多数编程语言对应的gRPC接口都同时支持异步和同步RPC调用。

RPC 的生命周期

更进一步,进入gRPC内部,了解客户端调用API的过程中究竟发生了什么。

一元RPC

一元RPC是最简单的RPC模型,在一元RPC中客户端发送一个请求并从服务端得到一个响应。

  • 一旦客户端调用了桩/客户端对象的方法,服务端将会收到方法被调用的通知,并从中得到客户端调用方法的元信息,方法名和最后期限(尽可能获取)
  • 服务器可以选择直接响应服务器自己的初始元信息(必须在发送响应前发送)或者等待客户端请求到达,服务器选择哪种方式,由应用配置决定的。
  • 服务器收到客户端请求,服务端就会执行创建和填充响应所需的任何工作。然后将响应(如果成功)连同状态详细信息(状态代码和可选状态消息)和可选的跟踪数据一起返回给客户端。
  • 如果请求状态是OK,客户端可以收到来自服务端的响应,整个请求-响应过程在客户端侧完成。


    一元RPC

服务端流RPC

服务端流RPC模型和简单的一元RPC模型类似,在服务端接收到客户端请求后,服务端返回一个响应流。当服务端发送完所有数据后,服务端状态详情(状态码和可选的状态新)和可选的跟踪元数据会返回给客户端,然后RPC请求-响应在服务端完成。一旦服务端发送完所有数据,客户端即完成。

客户端流RPC

该RPC模型下,客户端发送一个请求流而不是单一请求,服务端通常在接收完客户端请求后连同状态详细信息,跟踪元数据和响应一起返回给客户端,服务端可以选择返回状态信息和跟踪信息。

双向流RPC

在双向流RPC模型中,客户端RPC调用后,服务端接收到客户端元信息、方法名和最后期限。服务端可以选择马上发送自己的元信息给客户端,或者等待客户端请求的到达。
完成以上动作后,接下来的处理动作依赖应用程序,客户端和服务端可以以任意的顺序进行读写操作,流的操作完全互相独立。举个例子,服务端可能接收完所有客户端数据后再写响应到流中,或者客户端和服务端进行“ping-pong”操作,服务端接收到一个请求,然后返回一个响应,客户端根据响应的内容选择发送下一个请求,如此反复执行。

Deadlines/Timeouts

gRPC允许客户端设置等待RPC完成的时间(RPC因发生错误而结束前),在服务端,可以查询特定的RPC是否超时,剩余时间。然而不同编程语言之间对最后期限和超时时间的描述各异,有些编程语言通过时间点控制,有写编程语言通过时间段控制。.

RPC 终止

在gRPC框架中,客户端和服务端都可以独立的、单方面决定RPC 调用是否成功,客户端和服务端对同一个RPC调用的最终结果可能不一致。这意味这,比如,一个RPC调用在服务端是成功(服务端已经发送所有响应),但是RPC调用在客户端失败(响应到达时间超时)。服务端也有可能在客户端发送完所有数据前将当前RPC调用设置为完成。

取消 RPC

客户端和服务端可以在任何时间取消RPC调用,取消会立即终止RPC调用(不会执行其他动作),所以在RPC调用取消前,不会回滚任何操作。

元数据

元数据是特定RPC调用的信息(例如鉴权信息),元信息通常是键-值对的列表,键的类型为字符串,值的类型一般也为字符串,但是值可以是二进制数据。元数据对gRPC框架本身是不透明的——它允许客户端与服务器调与RPC调用相关的信息
获取元数据的方法依赖于语言。

通道

在创建客户端桩时,gRPC通过可以提供一个连接特点地址端口的服务端的连接,客户端可以通过参数来修改通道默认行为,比如是否开启信息压缩。通道是由状态的,比如已连接,空闲。gRPC如何处理通过的关闭是与语言相关的,有些语言支持查询通道的状态。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • “当清晨第一缕阳光驱赶了黑夜,我便醒来。 眼前的大海,没有浪花,没有一丝丝声音,安静的可怕...
    子子阳阅读 366评论 0 0
  • 时光回到1999年,那时候我正在读小学一年级,对于在那之前的事情,我已经不怎么记得,唯有外婆做的一道菜让我至今都还...
    亲吻月亮的女孩阅读 478评论 0 3