站在巨人的肩膀上:gRPC通过HTTP/2构建云原生时代的通信标准
gRPC:云原生时代的通信标准
gRPC将HTTP/2作为其传输层,并在此基础上定义了自身的通信语义。gRPC支持四种服务方法类型,它们都映射到HTTP/2的流模型上。
1)Unary RPC: 客户端发送单个请求,服务器返回单个响应(类似传统请求-响应)。
2)Server Streaming RPC: 客户端发送单个请求,服务器返回一个消息序列(流)。
3)Client Streaming RPC: 客户端发送一个消息序列(流),服务器返回单个响应。
4)Bidirectional Streaming RPC: 客户端和服务器都可以独立地发送一个消息序列(流)。
请求 (Request) 结构
gRPC的Request 包含请求头(Request Headers),请求体(Request Body)和EOS(end-of-stream)。
请求头使用 HTTP/2的headers, 使用HEADERS和CONTINUATION帧派发。请求头有Call-Definition和Custom-Metadata。其中grpc-前缀为 gRPC自己保留。
HEADERS (flags = END_HEADERS)
// HTTP 方法。对于 gRPC,:method标头始终为POST。
:method = POST
// HTTP 协议。如果启用了 TLS,则协议设置为https,否则为http。
:scheme = http
// 终端路径。对于 gRPC,此值构造为“/${包名}.${服务名}/${接口名}"。
:path = /ProductInfo/getProduct
// 目标 URI 的虚拟主机名。
:authority = abc.com
// 不兼容代理的检测。对于 gRPC,该值必须是“trailers”。
te = trailers
// 调用超时时。如果未指定,server端应假定无限超时。
grpc-timeout = 1S
// 内容类型。对于 gRPC,内容类型应以application/grpc。
content-type = application/grpc
// 消息压缩方式。包括identity、gzip、deflate、snappy及自定义压缩方式。
grpc-encoding = gzip
// 可选的请求头,用于访问有安全限制的终端服务。
authorization = Bearer xxxxxx
请求体使用DATA帧派发,请求体是长度前缀消息。它有一个 Compressed flag 用来表示message 是否压缩,为1表示采用了压缩算法(具体的压缩算法在HEADERS帧中定义)。后面跟着四字节的 message length 以及实际的 message。

EOS会在DATA帧里面带上了END_STREAM这个flag。用来表示请求消息的结束。
DATA (flags = END_STREAM)
<Length-Prefixed Message>
响应 (Response) 结构
gRPC的Response包含响应头(Response-Headers),响应体(Response Body)和 Trailers。
HEADERS (flags = END_HEADERS)
// 标识 HTTP 请求的状态。
:status = 200
// 消息压缩类型。包括identity、gzip、deflate、snappy和自定义类型。
grpc-encoding = gzip
// 内容类型。对于gRPC,content-type应该设置为application/grpc。
content-type = application/grpc
发完响应头,使用DATA帧派发响应体。响应体是长度前缀消息。
DATA
<Length-Prefixed Message>
结束标志不与数据帧一起发送,而是作为单独的头部发送,称为Trailers。 如果遇到了错误,也可以直接返回 Trailers-Only。
Trailer是一种特殊的元数据,通常包含有关执行的状态信息,例如状态码( grpc-status)和状态消息(grpc-message)
gRPC之所以要用单独的Trailers来标志响应结束。是因为在streaming模式下,所有消息没有传输完成之前,gRPC也不知道要传什么样的grpc-status 。
HEADERS (flags = END_STREAM, END_HEADERS)
// gRPC 状态代码
grpc-status = 0 # OK
// 错误描述。可选的,仅在处理请求出现错误时设置。
grpc-message = xxxxxx
服务描述
gRPC 利用 .proto 文件中的 service 来定义 RPC 接口。
// 文件: demo/hello/greeter.proto
syntax = "proto3";
package demo.hello;
// Greeter 服务定义
service Greeter {
// SayHello 方法定义
rpc SayHello (HelloRequest) returns (HelloReply);
}
// 请求消息结构
message HelloRequest {
string name = 1;
}
// 响应消息结构
message HelloReply {
string message = 1;
}
在上述 .proto 文件中,定义了一个名为 Greeter 的服务,它包含一个名为 SayHello 的方法。该方法接收 HelloRequest 消息并返回 HelloReply 消息。gRPC工具链会基于此IDL生成各种语言的客户端存根(stub)和服务端骨架(skeleton)。开发者通过调用存根上的方法,就如同调用本地方法一样,gRPC框架会处理底层的序列化、网络通信和方法分发。
一个 gRPC 定义包含三个部分,包名、服务名和接口名,连接规则如下:
/${包名}.${服务名}/${接口名}
SayHello的包名是demo.hello,服务名是Greeter,接口名是SayHello,所以对应的路径就是 /demo.hello.Greeter/SayHello。
HEADERS (flags = END_HEADERS)
:method = POST
:scheme = http
:path = /demo.hello.Greeter/SayHello
:authority = grpc.demo.com
content-type = application/grpc
DATA (flags = END_STREAM)
<Length-Prefixed Message>
gRPC基于这样的一个设计理念:定义一个服务,及其被远程调用的方法(方法名称、入参、出参)。开发者可以像调用本地方法一样,使用gRPC客户端存根(stub)调用远程机器上 gRPC 服务的方法。gRPC 的客户端和服务端都可以用任何支持 gRPC 的语言来实现,例如一个 gRPC 服务端可以是 C++语言编写的,以供 Ruby 语言的 gRPC 客户端和 JAVA 语言的 gRPC 客户端调用,如下图所示。

未完待续.
很高兴与你相遇!如果你喜欢本文内容,记得关注哦!
站在巨人的肩膀上:gRPC通过HTTP/2构建云原生时代的通信标准的更多相关文章
- react-native之站在巨人的肩膀上
react-native之站在巨人的肩膀上 前方高能,大量图片,不过你一定会很爽.如果爽到了,请告诉我
- 站在巨人的肩膀上,C++开源库大全
程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列 ...
- 站在巨人的肩膀上看Servlet——原来如此(更适合初学者认识Servlet)
前言: 有段时间没更新博客了,这段时间因为要准备考试,考完试后又忙了一阵别的事,一直没能静下心来写博客.大学考试真是越来越恶心了,各种心酸,那酸爽,够味.不过还好,马上就要大三了,听大三学长学姐说大三 ...
- 站在巨人的肩膀上学习Android开发
我们知道,一開始最好的学习方法是模仿,尤其是模仿巨人. 那说到Android开发的模仿自然就是分析并研究主流程序的布局.实现方法.进而提升自己的技术. 第一招----逆向project 要分析&quo ...
- 站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展
距离上次更新博客,时隔略长,诸事繁琐,赶在去广州答辩之前,分享下安卓 android 中的一个 列表收缩 类---ExpandableListView 先上效果图: 如果想直接看实现此页面的代码请下滑 ...
- 对EasyDarwin开源项目后续发展的思考:站在巨人的肩膀上再跳上另一个更高的肩膀
2017 EasyDarwin现状 自从2012年EasyDarwin项目创立开始,经过了快5年了,时光飞逝,如今EasyDarwin已经发展成为了不仅仅是一个单纯的开源流媒体服务器项目了,已经是各种 ...
- pdf.js的使用(1) 站在巨人的肩膀上纯干货分享,没有华丽的词藻
以下是我在实际项目开发中的过程分享 前端是:vue+jsp 1.首先下载pdf.js(怎么下可以去百度),实在不会就私我,我发给你 1.1展示一哈我下载下来的pdf.js的目录结构 1.2接下来可 ...
- 站在巨人的肩膀上才能看得更加远[Amo]
本来只是路过,写详细一点. 我看楼主浮躁得不得了.现在什么都不要做了,先去看几遍<不要做浮躁的嵌入式工程师>这篇文章,想清楚了,再动手吧. 我做了个实例,不用ST的库来点LED,解答你的问 ...
- java的设计模式的一些链接,站在巨人的肩膀上,才能看的更远。(均来源与网上的各个大牛的博客中)
创建型抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html工厂方法 http://www.cnblogs ...
- 对EasyDarwin开源项目2018的思考与2019发展的规划:继续站在巨人的肩膀引入更多巨人
EasyDarwin@2018思考 从2012年开始接触Darwin Streaming Server,到2018年从底层开始完全重新架构.研发.完成,EasyDarwin这个项目已经发展了6年了,时 ...
随机推荐
- 【Playwright + Python】系列(十七)揭秘 Playwright 处理 Handles:开启高效自动化之门
哈喽,大家好,我是六哥!今天来跟大家聊一聊Playwright 处理 Handles的方法,面向对象为功能测试及零基础小白,这里我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先收藏,以免后 ...
- Zabbix 4.0 安装与基本配置
一.Zabbix介绍 Zabbix介绍 Zabbix是一套企业级开源分布式监控解决方案,监控包括IT基础设施(网络.服务器和云资源).服务.应用等. Zabbix官方网站 Zabbix架构 Zabbi ...
- Web前端入门第 76 问:JavaScript 鼠标事件(mouse) enter/leave 和 over/out 区别
题外话 在考察事件基础的时候,会经常被问及 click.mousedown.mouseup 它们三者执行的先后顺序是怎样的? 如果平时没太注意,这细节可能就会忽略,毕竟很少会在同一个元素上面同时绑定这 ...
- pdf工具类之添加页码
实现思路:将原pdf复制一份到目标pdf,在目标pdf上进行操作,复制的原因是:原pdf需要获取其pdf读入流(PdfReader),如果还在原pdf上继续宁操作,就会出现一下一下异常 java.io ...
- 手把手教你在 Sevalla 上部署 Next.js 博客:从搭建到上线全流程
很多开发者会纠结:"现在博客平台这么多,为啥还要自己搭博客?" 答案很简单:用 Next.js 搭的博客,是真正属于你的 "数字资产". 为什么选 Next.j ...
- mybatis 三剑客 之 generator
简介 简单来说, 可以根据数据库生成一定的java代码.但是负载的逻辑还得自己实现. 就酱 参考连接 http://mybatis.org/generator/ 官网信息 https://www.im ...
- 面向 Git 用户的 jujutsu 使用入门
在软件开发领域,版本控制是协作的基石. Git作为当前主流工具,虽功能强大但设计理念可追溯至2005年,其复杂的命令集和冲突处理机制常令开发者困扰.近年来,新兴工具--比如Jujutsu(jj)和Pi ...
- 一个遵循 Material Design 设计规范、开源免费的 Blazor 组件库
前言 今天大姚给大家分享一个遵循 Material Design 设计规范.开源免费(MIT License)的 Blazor 组件库:MASA Blazor. Blazor 介绍 Blazor 是基 ...
- Streamlit入门 中文文档
基础概念 使用 Streamlit 进行开发非常简单.首先,在普通的 Python 脚本中添加几条 Streamlit 命令,然后使用 streamlit run 命令来运行它: streamlit ...
- POLIR-Society-Organization-Psychology-Color Theory:色彩理论 of IxDF(Interaction Design Foundation)
IxDF: https://www.interaction-design.org/literature/topics/color-theory Color Theory What is Color T ...