gRPC服务调用+protoc 生成swagger API文档

本文档详细介绍了如何在Ubuntu 18.04环境下,通过gRPC、Protocol Buffers v3以及相关插件安装,编写proto文件并编译生成Go源码及swagger.json。接着,利用docker启动Swagger UI服务来展示API文档,同时阐述了如何编写和调用RPC服务,包括server.go和client.go的实现,并提供了完整的项目目录结构。

1、环境

  • 操作系统:ubuntu 18.04
  • go版本:1.14.2
  • docker版本:19.03.1
  • docker-compose版本:1.24.0

2、gRPC环境安装

# 启用 module模式
GO111MODULE="on"
# 配置 goproxy
go env -w GOPROXY="https://goproxy.io,https://goproxy.cn,direct"
# 安装 grpc
$ go get -u google.golang.org/grpc

3、安装 Protocol Buffers v3

$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protobuf-all-3.11.4.tar.gz
$ sudo tar -zxvf protobuf-all-3.11.4.tar.gz -C /usr/local
$ cd /usr/local/protobuf-3.11.4/
$ sudo ./configure
$ sudo make
$ sudo make install
$ sudo ldconfig

检查是否安装成功

$ protoc --version
libprotoc 3.11.4

4、安装插件 protoc-gen-go、protoc-gen-grpc-gateway、protoc-gen-swagger

go get -u github.com/golang/protobuf/protoc-gen-go
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger

5、编写protot文件并编译

5.1 生成swagger API 文档,需要用到google/apihttp.protoannotations.proto这两个文件,先拷贝到项目目录下
# 进入项目的根目录
$ cd /path/to/project
$ mkdir -p ./proto/google/api
$ cp -r $GOPATH/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@v1.14.4/third_party/googleapis/google/api/* ./proto/google/api
5.2 编写protot文件
syntax = "proto3";

package proto;

import "google/api/annotations.proto";

// 源.proto文件应包含go_package选项,该选项指定文件的完整Go导入路径。
// 如果没有go_package选项,则编译器将尝试猜测一个。将来的编译器版本将要求go_package选项。
// 生成的代码的Go包名称将是go_package选项的最后一个路径组件。
option go_package = "../proto";

message StringMessage {
  string value = 1;
}

//定义RPC服务
service HelloService {
  rpc Hello (StringMessage) returns (StringMessage) {
    option (google.api.http) = {
      post: "/v1/hello"
      body: "*"
    };
  }
}
5.3 使用protoc命令编译生成go源码及swagger.json
# 生成proto对应的go源码
protoc --go_out=plugins=grpc:. *.proto

# 生成proto对应的swagger.json文件(/path/to/project为项目的根目录)
protoc -I /usr/local/include -I . -I /path/to/project/proto/google/api --swagger_out=logtostderr=true:. ./hello.proto

6、使用docker启动swagger ui服务,查看生成的API文档

docker run --rm -d -p 80:8080 -e SWAGGER_JSON=/foo/hello.swagger.json -v /path/to/project/proto:/foo swaggerapi/swagger-ui

访问swagger ui服务所在的主机的80端口,即可查看API文档在这里插入图片描述

7、编写server.goclient.go调用RPC服务

7.1 server.go
package main

import (
	"context"
	pb "github.com/king-tu/helloGRPC/proto"
	"google.golang.org/grpc"
	"log"
	"net"
)

type HelloService struct{}

func (*HelloService) Hello(ctx context.Context, msg *pb.StringMessage) (*pb.StringMessage, error) {
	log.Println("client request message: ", msg)
	reply := &pb.StringMessage{
		Value: "hello " + msg.Value,
	}
	return reply, nil
}

func main() {
	address := ":1234"
	//获取grpc服务端对象
	grpcServer := grpc.NewServer()
	//注册grpc服务
	pb.RegisterHelloServiceServer(grpcServer, new(HelloService))

	//设置服务端监听
	lis, err := net.Listen("tcp", address)
	if err != nil {
		panic(err)
	}
	//在指定端口上提供grpc服务
	log.Println("gRPC Server listen on: ", address)
	if err := grpcServer.Serve(lis); err != nil {
		panic(err)
	}
}

7.2 client.go
package main

import (
	"context"
	pb "github.com/king-tu/helloGRPC/proto"
	"google.golang.org/grpc"
	"log"
)

func main() {
	//和grpc服务建立连接
	conn, err := grpc.Dial("localhost:1234", grpc.WithInsecure())
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	client := pb.NewHelloServiceClient(conn)
	reply, err := client.Hello(context.Background(), &pb.StringMessage{Value: "lisi"})
	if err != nil {
		panic(err)
	}
	log.Println("reply: ", reply)
}

7.3 测试效果

服务端

$ go run server.go 
2020/04/28 01:04:54 gRPC Server listen on:  :1234
2020/04/28 01:05:10 client request message:  value:"lisi"

客户端

$ go run client.go 
2020/04/28 01:06:01 reply:  value:"hello lisi"

8、完整项目目录

$ tree
.
├── client
│   └── client.go
├── go.mod
├── go.sum
├── proto
│   ├── google
│   │   └── api
│   │       ├── annotations.proto
│   │       ├── httpbody.proto
│   │       └── http.proto
│   ├── hello.pb.go
│   ├── hello.proto
│   └── hello.swagger.json
└── server
    └── server.go

5 directories, 10 files

参考链接
Python 本身并不直接提供将 gRPC 的 `.proto` 文件自动生成 Swagger (现在通常称为 OpenAPI) 的 YAML 文件的功能。gRPC 使用的是单独的 `protoc-gen-grpc` 和 `protoc-gen-openapigen` 插件来分别生成 gRPC 和 OpenAPI 的定义。不过,可以借助一些工具和组合使用外部脚本来完成这个转换过程。 以下是一个简化的步骤说明: 1. 首先,确保你已经安装了 gRPC 和相关的 protoc 版本,并且可以正常生成 gRPC 服务定义 (`grpc.pb.py` 或者 `.proto` 文件夹下的 `.proto` 文件)。 2. 安装 `protoc-gen-openapigen` 插件,如果你还没有安装,可以通过下面的命令行安装: ```bash pip install protobuf openapidocs ``` 3. 创建一个 Python 脚本,利用 `subprocess` 来调用 protoc 生成 OpenAPI 描述文件: ```python import subprocess def generate_swagger(file_path): command = ['protoc', '--plugin=protoc-gen-openapigen=./path/to/openapidocs/bin/openapidocs', '-Ipath/to/proto', '--openapigen_out=swagger.yaml', file_path] subprocess.run(command, check=True) # 替换 'myproto.proto' 为你实际的 .proto 文件名 generate_swagger('myproto.proto') ``` 这里的 `./path/to/openapidocs/bin/openapidocs` 是指代 `protoc-gen-openapigen` 的位置。 4. 脚本执行后会生成 `swagger.yaml` 文件,你可以进一步处理它,如果需要的话。 注意:这个过程可能会比较繁琐,因为涉及到多个步骤和可能依赖的操作系统环境。此外,如果你的 `.proto` 文件非常复杂,你可能需要调整插件的配置或者查找专门用于这种任务的库或工具。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值