gPRC网关是通过接收HTTP请求进行转换成gRPC的客户端请求发送给服务端的过程。这里介绍gRPC中HTTP网关的具体实现以及代码实现。
HTTP网关
有时同一套业务代码我们既需要gRPC服务又需要HTTP服务,写两个服务又有点重复工作,而且维护两个版本的服务显然又不太合理,于是GRPC网关(grpc-gateway)就诞生了。它是通过protobuf的自定义option实现了一个网关,服务可以开启HTTP服务来接收HTTP请求,通过将请求数据转换成gRPC客户端请求发送个gRPC服务端,服务又将gRPC服务端的响应转化成HTTP响应返回给请求方。
安装
安装grpc-gateway, 这样protobuf就能生成gRPC网关相关代码
1 | go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway |
示例
HTTP服务
通过开启一个HTTP服务来接收http请求,通过将请求数据转换成gRPC客户端请求发送个gRPC服务端来实现整个请求过程。
1.proto文件新增http option
在前几节的massage.proto文件中的Hello方法新增http option, post请求,路由为/hello
。
1 | syntax = "proto3"; |
2.生成gRPC网关相关代码
通过protoc命令生成gRPC网关相关代码。这里需要引入google api的proto文件。
1 | protoc --go_out=. -I=. -I$GOPATH/src/github.com/googleapis/googleapis massage.proto |
3.新增HTTP服务代码
新增http_server/main.go, 实现http服务,相关认证选项和拦截器选项参考前几章客户端请求选项,这里自演示部分代码。
1 | ctx, cancel := context.WithCancel(context.Background()) |
4.启动HTTP服务和gRPC服务端
1 | curl -X POST -d '{"massage":"grpc gateway"}' http://127.0.0.1:8080/hello |
升级gRPC服务端
上面方法通过新开启一个HTTP服务实现了通过http请求转换成gRPC客户端请求发送服务端。这样我们是同时开启HTTP和gRPC两个服务,虽然解决了了重复工作的问题,但我们还是得维护两个服务,也不太合适,我们可以将这两个服务整合在一起,共用同一端口号。同时提供http和gRPC两种调用方式。
1.修改gRPC服务端代码
只需要修改gRPC服务端代码,将之前的gRPC服务端加上http网关相关,代码如下:
1 | func main() { |
2.启动服务
启动服务,通过gRPC客户端和http请求的方式进行验证。
1 | curl -X POST -k https://127.0.0.1:9000/hello -d '{"massage":"grpc and http"}' |
项目源码
1 | git clone https://github.com/zhouxuwen/grpcdemo-go.git |