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 # consul endpoint
  Key: add.rpc # service name registered to Consul
  Meta:
    Protocol: grpc
  Tag:
    - tag
    - rpc


gateway.yaml

Name: gateway
Host: 0.0.0.0
Port: 7777
Upstreams:
  - Grpc:
      Target: localhost:7070
      Prefix: /api
#    ProtoSets: #填这个就报错,因为使用了验证器,找不到文件
#        - ../demo/demo.pb
#    Mappings: #这个可以不填写
#      - Method: POST
#        Path: /ping
#        RpcPath: demo.Demo/Ping

getway.go

package main

import (
	"github.com/zeromicro/go-zero/core/conf"
	"github.com/zeromicro/go-zero/gateway"
)

func main() {
	var c gateway.GatewayConf
	conf.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)

补充

  1. 没解决proto3生成的时候项目路径问题
  2. 生成的swagger文档可以直接导入到apifox,grpc的调试可以通过apifox,具体步骤如下,新建项目的时候选择grpc项目,proto文件选择服务器映射,直接选择开启的grpc服务就可以生成文档,进行调试
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐