站在巨人的肩膀上:gRPC通过HTTP/2构建云原生时代的通信标准

简介: gRPC是云原生时代高效通信标准,基于HTTP/2实现,支持四种服务方法。通过.proto文件定义接口,生成多语言Stub,实现跨语言调用。其请求响应结构清晰,结合Headers、Data帧与Trailers,保障高性能与可扩展性,广泛应用于微服务架构中。

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。

image.png

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 客户端调用,如下图所示。

image.png

未完待续.

很高兴与你相遇!如果你喜欢本文内容,记得关注哦!

目录
相关文章
|
4月前
|
消息中间件 人工智能 安全
云原生进化论:加速构建 AI 应用
本文将和大家分享过去一年在支持企业构建 AI 应用过程的一些实践和思考。
1003 51
|
6月前
|
运维 NoSQL Serverless
|
10月前
|
人工智能 关系型数据库 OLAP
光云科技 X AnalyticDB:构建 AI 时代下的云原生企业级数仓
AnalyticDB承载了光云海量数据的实时在线分析,为各个业务线的商家提供了丝滑的数据服务,实时物化视图、租户资源隔离、冷热分离等企业级特性,很好的解决了SaaS场景下的业务痛点,也平衡了成本。同时也基于通义+AnalyticDB研发了企业级智能客服、智能导购等行业解决方案,借助大模型和云计算为商家赋能。
789 17
|
5月前
|
安全 算法 网络安全
SSL/TLS协议如何确保HTTP通信的安全
通过这些机制和过程,SSL/TLS对HTTP通信提供了强大的保护,确保数据不被未授权的第三方访问或篡改,这对维护数据隐私和网络安全至关重要。随着互联网技术的不断进步,SSL/TLS协议本身也在不断更新和升级,以对抗新出现的威胁和满足现代网络的要求。
318 10
|
6月前
|
运维 NoSQL Serverless
《第四纪元》玩得轻松,构建也轻松 | 阿里云云原生 API 网关、函数计算助力 IGame 快速构建轻休闲游戏
在轻休闲游戏流量波动大、生命周期短的背景下,传统架构难以应对成本与扩展挑战。本文介绍了基于阿里云函数计算 FC 和 Redis 构建的新一代服务器架构,实现弹性伸缩、成本优化与高效运维,助力轻休闲游戏快速迭代与稳定运营,提升开发效率并降低运维复杂度。
《第四纪元》玩得轻松,构建也轻松 | 阿里云云原生 API 网关、函数计算助力 IGame 快速构建轻休闲游戏
|
7月前
|
安全 Cloud Native 容器
开发者视角:构建坚不可摧的云原生安全工具 - 安全内生于开发流
云原生时代,运维团队面临容器漏洞、微服务失陷与CI/CD污染三大威胁。通过容器基因解码、微服务免疫与管道净化构建三维防御体系,结合板栗看板、Snyk、Check Point、Aqua等工具,实现从漏洞预测到实时拦截的全链路防护。未来,安全将内生于云原生技术,构建主动免疫防线。
开发者视角:构建坚不可摧的云原生安全工具 - 安全内生于开发流
|
8月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
Cloud Native
邀您参加云原生高可用技术沙龙丨云上高可用体系构建:从理论到实践
云原生高可用技术专场,邀您从理论到实践一起交流,探索云上高可用体系构建!
284 79
|
10月前
|
XML 网络协议 程序员
Apipost接口调试全解:从HTTP到gRPC,程序员必备的“协议生存指南
Apipost是一款强大的接口调试工具,支持多种主流API协议。它涵盖HTTP/HTTPS、WebSocket、Socket.IO、gRPC、GraphQL、TCP及ISO8583金融报文等冷门协议。通过Body多样化、全局参数配置、性能分析等功能优化HTTP调试;提供WebSocket多消息存档与事件监听;gRPC支持服务反射和流式调试;GraphQL可自动生成Schema;TCP报文模板专业精准;SSE配置简单。此外,Apipost还具备环境变量、脚本加持和文档生成功能,是提升开发效率的全能工具。

热门文章

最新文章