当前位置: 首页 > 科技观察

Golang使用Proto文件同时生成gRPC和HTTP

时间:2023-03-14 09:40:55 科技观察

大家好,我是Z哥,做技术的都知道程序间通信常用的方式有两种,RPC和HTTP。普遍的共识是RPC用于系统内部各个子系统之间的通信,HTTP用于与外部系统的通信。为了避免需要编写两套合约文件来生成两套API(.proto和.api),如果能够基于同一个合约文件为两套API生成代码就好了。Z哥现在的公司使用的是gRPC作为rpc的框架,那么自然首先想到的是是否可以基于一个proto文件同时生成gRPC和HTTP存根代码。没多久就在网上找到了符合要求的框架。相信很多地鼠应该都听说过或者正在使用。https://github.com/grpc-ecosystem/grpc-gateway框架的原理可以用一张图来表达。通过一个proto文件,在生成gRPC代码的同时生成一个基于HTTP1.1+JSON的反向代理网关。这样可以直接通过gRPC调用实际的服务器,也可以通过反向代理中转一次访问服务器。具体使用方法可以参考github上的官方教程。Z哥和你主要说说可能遇到的卡点。毕竟你知道国内的网络情况,有些操作可能会遇到一些困难。1、不懂科学上网的人不要用buf。教程中提供了两种操作方式,一种是通过基础工具protoc操作,另一种是通过一个基于protoc包的工具bu??f操作。Protoc可以基于gomod安装。由于gomod也有国内的镜像站点可以解决访问困难,所以建议不会上网的朋友通过protoc科学操作,因为无法成功安装buf。2.手动下载googleapis的repo。然后,在定义网关的时候,需要引入一些google包。你该怎么办?直接去github下载,具体地址是:https://github.com/googleapis/googleapis如果可以,建议下载整个仓库,否则就单独下载教程中提到的4个文件即可。特别需要注意的是,googleapis/google/目录下缺少的protobuf相关文件,需要从下面的repo下载,放在googleapis/google/目录下。https://github.com/protocolbuffers/protobuf/tree/main/src/google/protobuf3.protoc-I官方教程中指定搜索目录protoc-I它只会搜索当前命令执行目录的范围,所以如果你下载的googleapi没有存放在当前目录下,你需要添加额外的信息来指定搜索目录。指定的方式是再加一个-I,命令如下(第二行是新增的搜索google包的目录):protoc-I./\-I$GOPATH/src/googleapis\--grpc-gateway_out./gen/go\--grpc-gateway_optlogtostderr=true\--grpc-gateway_optpaths=source_relative\--grpc-gateway_optgenerate_unbound_methods=true\your/service/v1/your_service.proto如果还有其他目录可以搜索,然后继续增加-I。嗯,需要注意的就是以上三点。官方教程中提到的三个命令可以一起执行,这样就可以同时生成gRPCserver、gateway和swagger.json:protoc-I./\-I$GOPATH/src/googleapis\--go_out。/gen/go/--go_optpaths=source_relative\--go-grpc_out./gen/go/--go-grpc_optpaths=source_relative\--grpc-gateway_out./gen/go/\--grpc-gateway_optlogtostderr=true\--grpc-gateway_optpaths=source_relative\--grpc-gateway_optgenerate_unbound_methods=true\--openapiv2_out。--openapiv2_optlogtostderr=true\your/service/v1/your_service.proto关于gRPC-Gateway的一些其他用法,请参考:https://grpc-ecosystem.github.io/grpc-gateway/嗯,在这个Z哥一文给大家分享如何使用一个proto文件同时生成gRPC和HTTPStub代码和Swagger文档。这样既可以提高效率,又可以避免维护两个不同的合同文件带来的不一致风险。我希望它可以帮助你。