Go语言实现HTTP到gRPC请求转换的最简单方法
上次我写了通过protoreflect
的方法,自动代理服务,可以摆脱开proto文件的限制,这样网关可以将这些服务都自动代理起来。更进一步的,像现在微服务框架,如Kratos、ego、go-zero都兼顾根据proto文件上,根据google/api/annotations.proto
增加的注解,生成HTTP的服务,而这些属性注释,网关都可以通过反射拿到,然后代理其HTTP。
除此之外,HTTP —> Gateway —> GRPC 有没有省事点的方法呢?可以直接将HTTP/1.1协议转成GRPC兼容,然后将返回再翻译为HTTP/1.1。
协议数据修改
这是偶然看到go-kratos/gateway中实现的http—>h2所使用的技术。
这里利用了GRPC协议中为了兼容一些HTTP1.1端,在消息体的格式中,可使用json
格式进行序列化(application/grpc+json
)。
在使用此 Content-Type 时,gRPC 服务器会将 JSON 格式的数据转换为 Protocol Buffers 格式的数据,然后进行处理。所以使用什么数据格式传输,并不影响其协议依然为HTTP/2。
代码分析
不想看代码,可以直接看总结
中看如何实现的。
配置文件
1 | # This is a gateway config. |
proxy构建
这里来看下来看下kratos-gateway的代码。
1 | go-kratos/gateway/cmd/gateway/main.go |
这里使用了库net/http2
,是Golang标准库中用于支持HTTP/2协议的包,它提供了HTTP/2客户端和服务器的实现,以及与HTTP/1.x的兼容性支持。
从这里也就能看到实际上在gateway中的客户端请求的实例了,gateway通过它来请求到后端实际的服务。到这里还得看HTTP request是怎么转化到GRPC请求的。
继续看Gateway怎么构建proxy的。
1 | go-kratos/gateway/cmd/gateway/main.go |
请求—协议转化
实际请求时, 将进行协议中间件进行转化。
协议转化在go-kratos/gateway/middleware/transcoder/transcoder.go。
1 | // Middleware is a gRPC transcoder. |
总结
通过GRPC协议中为了兼容HTTP/1.1协议所给出传输格式application/grpc+json
,使用golang.org/x/net/http2
,通过修改HTTP请求头,可以做到使用HTTP访问到GRPC服务。以下是更简略的版本。
1 | func Test_defaultH2Client(t *testing.T) { |
本文标题:Go语言实现HTTP到gRPC请求转换的最简单方法
文章作者:小师
发布时间:2023-05-18
最后更新:2024-08-18
原始链接:chunlife.top/2023/05/18/Go语言实现HTTP到gRPC请求转换的最简单方法/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可