gozero使用gRPC-gateway生成http网关
目前gozero开发有点复杂,先写api文件生成http服务,然后在写proto3文件生成grpc服务属实有地麻烦 所以想试试能不能定义proto3生成grpc服务,然后再通过grpc开启http服务 这样做的好处是少写了api文件和部分代码,而且本身proto3就是必须写的,还能顺带生成swagger文档 先生成demo代码 执行命令:goctl rpc new demo 仓库地址 链接在这里
最终的文件目录
定义proto3文件并且使用验证器
syntax = "proto3" ; package demo;
import "validate/validate.proto" ;
import "google/api/annotations.proto" ;
option go_package = "./demo" ; message Request { string ping = 1 [ ( validate.rules) .string.len = 3 ] ; //输入
} message Response { string pong = 1 [ ( validate.rules) .string.len = 2 ] ; //输出
} service Demo { //ping方法rpc Ping( Request) returns( Response) { option ( google.api.http) = { post: "/api/ping" body: "*" } ; } ;
}
demo.yaml
Name: demo.rpc
ListenOn: 0.0 .0.0:7070
Mode: dev
Consul:Host: localhost:8500 Key: add.rpc Meta:Protocol: grpcTag:- tag- rpc
gateway.yaml
Name: gateway
Host: 0.0 .0.0
Port: 7777
Upstreams:- Grpc:Target: localhost:7070Prefix: /api
getway.go
package mainimport ( "github.com/zeromicro/go-zero/core/conf" "github.com/zeromicro/go-zero/gateway"
) func main ( ) { var c gateway.GatewayConfconf.MustLoad( "gateway.yaml" , & c) gw := gateway.MustNewServer( c) defer gw.Stop( ) gw.Start( )
}
然后执行生成proto对应的文件,需要修改-I的文件路径,按照自己下载的包地址来protoc demo.proto -I. -I/code/nan/third_party \ -I/code/nan/third_party/google \ -I/go/pkg/mod/github.com/envoyproxy/protoc-gen-validate@v1.2.1 \ --go_out= . --go-grpc_out= . \ --openapiv2_out= demo --openapiv2_opt= logtostderr= true \ --validate_out= demo --validate_opt= lang= go,paths= source_relative \ --descriptor_set_out= demo/demo.pb
之后就单独启动grpc服务( main.go) 和网关服务( getway.go)
补充
没解决proto3生成的时候项目路径问题 生成的swagger文档可以直接导入到apifox,grpc的调试可以通过apifox,具体步骤如下,新建项目的时候选择grpc项目,proto文件选择服务器映射,直接选择开启的grpc服务就可以生成文档,进行调试