gRPC gateway 数据的转换
通常把 gRPC 用作内部通信,而使用 Restful Api 进行外部通信。为了避免写两套应用(或者为了兼容旧服务),我们使用 grpc-gateway 把 gRPC 转成 HTTP。服务接收到 HTTP 请求后,grpc-gateway 把它转成 gRPC 进行处理,然后以 JSON 形式返回数据。
通常把 gRPC 用作内部通信,而使用 Restful Api 进行外部通信。为了避免写两套应用(或者为了兼容旧服务),我们使用 grpc-gateway 把 gRPC 转成 HTTP。服务接收到 HTTP 请求后,grpc-gateway 把它转成 gRPC 进行处理,然后以 JSON 形式返回数据。
搭建环境
这篇分析是基于 grpc-go 1.48 这个版本来的
gRPC 客户端架构概述
HTTP 协议错误处理基本会通过 status code 和请求响应(自定义消息)来传递错误,而 gRPC 这边错误处理就没有 HTTP 这么好控制。
gRPC 构建在 HTTP/2 协议之上,因此我们可以将 gRPC 服务和普通的 Web 服务架设在同一个端口之上。
业务场景介绍
grpc 使用 protobuf(google 的序列化框架)作为通信协议,底层上使用 http2 作为其传输协议,grpc 源码中自己实现了 http2 的服务端跟客户端,而并没有用 net/http 包。
今天在看 b 站的 powermock 源码时,发现它 Mock gRPC 是通过一个叫做 grpc.UnknownServiceHandler 的方法来做 服务端的 Mock 的
gRPC 默认提供了两种认证方式:
grpcurl 是一个与 grpc 服务器交互的命令行工具,可认为是 gRPC 的 curl 工具。
官网这个 protoc 的使用方式介绍写的实在是模糊,这里重新整理一下
protoreflect 库是一个用来反射 proto 文件的库。它为 protobuf 和 gRPC 提供了反射 API。 protobuf 中反射的核心是 descriptor。 descriptor 本身就是 protobuf message,它描述 proto 源文件或其中的元素。 因此,descriptor 的集合可以描述 protobuf 类型的整个架构,包括 RPC 服务。