gRPC理念

本文通过gRPC的结构概述和生命周期介绍一些gRPC理念的关键点。

概述

服务定义

就像很多RPC系统一样,gRPC也是基于定义一个服务的想法,指定可以被远程调用的方法。默认地,gRPC使用protocol buffers作为接口定义语言 (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,比如客户端发送请求到服务端,然后得到一个stream读取按序返回的messages。客户端从返回的stream里读取直到没有消息。
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}
  • Client streaming RPCs,比如客户端写入一个序列的消息,然后发送到服务端,然后继续使用提供的stream。当客户端结束写入消息后,就会等待服务端读取后返回数据。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}
  • 双向streaming RPCs,客户端和服务端都发送信息并且读-写流。两个streams独立操作,所以客户端和服务端可以按照他们想要的读取和写入:比如,服务端可以接收所有的客户端消息再返回数据或者可以先读取然后写数据,或者其他的读写组合方式,每个stream的消息顺序都已经保存了。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
}

我们在接下来的章节里查看这些不同类型的RPC的详情。

使用API层

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

  • 在服务端,服务器实现通过service定义的方法,并且运行一个gRPC服务来处理客户端调用。gRPC设施解码请求,执行service方法,然后encode service response.
  • 在客户端,客户端有一个已知的本地对象存根(stub)(对于一些语言,首选项是客户端)实现和服务端相同的方法。客户端就可以在本地对象上调用这些方法,为调用在合适的protocol buffer message类型包装参数 - gRPC随后发送请求到服务端然后返回服务端的protocol buffer response(s)。
异步 vs. 同步

同步RPC调用会阻塞,直到服务端有返回是最接近RPC的请求过程的抽象。另一方面,网络本质上是异步的,并且在很多场景,它对在当前线程启动无阻塞的RPCs很有用。

gRPC编程在大多数语言里都有同步和异步。可以在每个语言里的指南里和相关文档查看更多。

RPC生命周期

现在我们来看看当gRPC客户端调用gRPC服务单方法是发生了什么。我们不会看实现细节,你可以在特定语言页里查看更多。

Unary RPC

首先我们来看最简单的RPC类型,客户端发送一个请求并得到一个回复。

  • 一旦客户端调用方法在stub/client对象上,服务端会被通知到RPC被调用带着客户端的metadata, 方法名称,特定的deadline如果匹配.
  • 服务端然后可以直接返回它的最初的metadata(必须在返回前发送),或者等待客户端的请求信息 - 一个首先发生的application-specific。
  • 一旦服务端有客户端的请求信息,创建和填充它的response是必须的。response然后被返回(如果成功)到客户端带着状态详情(状态码和可选的状态信息)和可选的trailing metadata.
  • 如果状态是OK的,客户端会得到响应,客户端的请求就完成了。
Server streaming RPC

server-streaming RPC和我们简单的例子相似,除了服务端发送返回一连串的响应在得到客户端的请求信息后。在发送返回了所有的响应后,服务端的状态详情(状态码和可选的状态信息)和可选的trailing metadata会被发送回完成在客户端。客户端在得到所有客户端的相应后完成。

Client streaming RPC

client-streaming RPC也和简单的例子相同,除了客户端发送了一系列的请求到客户端而不是单个请求。服务端返回单个对象,通常但不一定收到了所有客户的请求后,连同其状态的细节和可选的元数据。

Bidirectional streaming RPC

在双向流的RPC里,还是客户端调用方法然后服务端接收客户端metaata,方法名称和deadline。然后服务端可以选择返回最初的metadata或者等待客户端开始发送请求。

接下来的情况就取决于应用了,客户端和服务端都能在任何顺序里读和写。流操作完全是独立的。所以,比如,服务端在写回响应时可以等待直到获取到所有客户端的信息,或者服务端和客户端可以像“乒乓”一样:服务端获取请求,然后返回响应,然后客户端基于返回发送另一个请求,等等。

Deadlines/Timeouts

gRPC允许客户端为一个RPC完成指定超时时间,不然RPC会被终止,抛出DEADLINE_EXCEEDED错误。在服务端,可以查看特定的RPC是否超时,或者还剩下多少时间完成RPC。

如何设置deadline或者timeout取决与不同的语言,比如,不是所有的语言有默认的deadline,有些语言APIs依据deadline(距离上次时间的点),一些依据timeout(间隔)。

RPC termination

在gRPC里,客户端和服务端是独立的,并且本地决定请求的成功,但是结论可能不匹配。这意味,比如,你可能有一个RPC在服务端成功的完成了("我已经发送了所有的响应")但是客户端失败了(“返回在我的deadline之后”)。当然服务端也可能在客户端发送所有请求前完成。

Cancelling RPCs

不管是客户端还是服务端都可以随时取消RPC。取消会立即终止RPC,首页不会再工作。这不是“撤销”: 在取消前已经发生的改变不会被回滚。

Metadata

Metadata是特定RPC请求的信息(比如authentication details)以列表信息的键值对,键是strings,values通常也是strings(但也可以是binary data)。Metadata对于gRPC是透明的 - 它可以让客户端提供调用信息到服务器,或者相反。访问metadata取决于语言。

Channels

gRPC channels在指定的host和port提供连接到gRPC,在创建客户端存根的时候使用。客户端可以指定特定的channel参数修改gRPC的默认行为,比如切换开和关消息压缩。channel有状态,包含connectedidle

gRPC如何处理关闭channel看编程语言。一些语言也允许查询channel状态。

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

推荐阅读更多精彩内容