gRPC 提供接口文档

gRPC 提供接口文档

在 RESULTful 接口服务中,我们可以使用 swagger 来展示当前服务接口列表,但是当我们的项目是使用的 gRPC 提供接口服务时,就没法使用 swagger 来做接口展示服务了。
为了解决这个问题,本文将介绍 protoc-gen-doc静态文件 Web 服务 的方式来在线提供 gRPC 文档。

一、编写 gRPC 服务

在开始生成接口文档之前,我们先简单定义一个 gRPC 服务:

// pb/hello.proto
syntax = "proto3";
option go_package = "./;pb";
package pb;
service Greeter {
  // simple RPC
  rpc SimpleRPC(HelloRequest) returns (HelloResponse);
  // Bidirectional Streaming RPC
  rpc BidrectionalStreamingRPC(stream HelloRequest) returns (stream HelloResponse);
  // Repeated Test RPC
  rpc RepeatedTest(HelloRequest) returns (RepeatedResponse);
  // Map Test RPC
  rpc MapTest(HelloRequest) returns (MapResponse);
}
message HelloRequest {string name = 1;}
message HelloResponse {string reply = 1;}
message RepeatedResponse {
  message Result {
    string name = 1;
    int32 age = 2;
  }
  repeated Result results = 1;
}
message MapResponse {
  map<string,int64> dict = 1;
}

生成 gRPC 接口文档

首先需要安装 protoc-gen-doc 插件(默认已经安好 protocGo):

go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc@latest

安装完成后生成文档(需要手动创建 doc 文件夹 ):

protoc --doc_out=./doc --doc_opt=html,index.html  pb/*.proto

命令执行成功后,会在 doc 文件夹下面生成 index.html 文件。如果想要生成其他格式的文档,可以参看官方文档:pseudomuto/protoc-gen-doc: Documentation generator plugin for Google Protocol Buffers (github.com)

浏览器打开 index.html 文件:
image-20221107090636498

三、启动静态文件 Web 服务

由于 gRPC 是使用的 HTTP 2.0 协议,但是想要在网页端访问文件又需要 HTTP 1.1 协议,因此需要让当前服务能够根据 HTTP 协议版本分别提供 gRPC 服务和静态文件 Web 服务。

为了达成当前效果,我们需要借助一个 cmux 库,下载该库:
为了达成当前效果,我们需要借助一个 cmux 库,

cmux是一个通用的Go库,用于根据负载对连接进行多路复用。使用cmux,可以在同一个TCP侦听器上提供gRPC、SSH、HTTPS、HTTP、Go-RPC和几乎任何其他协议。

下载该库:

go get -u github.com/soheilhy/cmux

编写服务端代码:

func RunGrpcServer() *grpc.Server {
	s := grpc.NewServer()
	pb.RegisterGreeterServer(s, &server{})
	reflection.Register(s)

	return s
}

func RunHttpServer() *http.Server {
	serveMux := http.NewServeMux()
	// 处理静态资源
	serveMux.Handle("/doc/", http.FileServer(http.Dir(".")))

	return &http.Server{
		Addr:    ":5678",
		Handler: serveMux,
	}
}

func main() {
	l, err := net.Listen("tcp", ":5678")
	if err != nil {
		log.Fatalf("Run TCP Server err: %v", err)
	}
	
    // 创建一个多路复用器
	m := cmux.New(l)
    // 匹配 gRPC 应用
	grpcL := m.MatchWithWriters(cmux.HTTP2MatchHeaderFieldPrefixSendSettings("content-type", "application/grpc"))
	// 匹配 HTTP 1.1 应用
    httpL := m.Match(cmux.HTTP1Fast())

    // 处理 gRPC 服务
	grpcS := RunGrpcServer()
    // 处理 HTTP 服务
	httpS := RunHttpServer()
	go grpcS.Serve(grpcL)
	go httpS.Serve(httpL)

	err = m.Serve()
	if err != nil {
		log.Fatalf("Run Serve err: %v", err)
	}
}

运行服务,打开浏览器访问 Protocol Documentation,即可访问到我们之前生成的 gRPC 文档。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gRPC是一种高性能的远程过程调用框架,它可以用于构建分布式系统。通过gRPC,我们可以定义我们自己的接口服务,并通过使用Protocol Buffers来定义消息类型和服务接口。接口文档是一份详细描述这些接口及其使用方法的文档。 gRPC接口文档中文提供了对于gRPC接口的详细说明和使用指南。文档中通常包含以下信息: 1. 接口定义:文档会提供接口的定义,包括接口名称、方法名称和方法参数。这些定义将在客户端和服务端之间进行通信时使用。 2. 消息类型:文档会描述消息类型及其字段的定义。这些消息类型用于在不同服务之间传递数据。 3. 错误码:文档会列出可能的错误码及其含义。这些错误码用于标识调用接口时可能出现的错误情况。 4. 使用示例:文档中通常会提供一些使用示例,以帮助开发人员理解如何使用接口。这些示例可以包括创建客户端、调用接口方法和处理返回结果。 5. 安全认证:如果接口需要进行安全认证,文档会提供相应的认证方法和配置。 通过阅读gRPC接口文档中文,开发人员可以更加清楚地了解如何使用gRPC构建分布式系统。在开发过程中,可以根据接口文档编写客户端代码、验证接口调用和处理错误情况。接口文档也可以帮助团队成员之间更加协作,确保彼此的理解和一致性。 总之,gRPC接口文档中文在使用gRPC构建分布式系统时是一个重要的参考工具。它提供了接口的详细定义、用法示例和错误处理,帮助开发人员更加高效地使用gRPC接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值