![](https://i-blog.csdnimg.cn/blog_migrate/e5e64479b8a7307906199fa974d5d06b.png)
gRPC-Gateway 简介
我们都知道 gRPC
并不是万能的工具。 在某些情况下,我们仍然想提供传统的 HTTP/JSON API
。原因可能从保持向后兼容性到支持编程语言或 gRPC
无法很好地支持的客户端。但是仅仅为了公开 HTTP/JSON API
而编写另一个服务是一项非常耗时且乏味的任务。
那么,有什么方法可以只编写一次代码,却可以同时在 gRPC
和 HTTP/JSON
中提供 API
?
答案是 Yes
。
gRPC-Gateway
是 Google protocol buffers compiler protoc
的插件。 它读取 protobuf service
定义并生成反向代理服务器( reverse-proxy server
) ,该服务器将 RESTful HTTP API
转换为 gRPC
。 该服务器是根据服务定义中的 google.api.http
批注(annotations
)生成的。
这有助于你同时提供 gRPC
和 HTTP/JSON
格式的 API
。
开始之前
在开始编码之前,我们必须安装一些工具。
在示例中,我们将使用 Go gRPC Server
,因此请首先从 https://golang.org/dl/
安装 Go
。
安装 Go
之后,请使用 go get
下载以下软件包:
$ go get github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway
$ go get google.golang.org/protobuf/cmd/protoc-gen-go
$ go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
这将安装我们生成存根所需的协议生成器插件。确保将 $GOPATH/bin
添加到 $PATH
中,以便通过 go get
安装的可执行文件在 $PATH
中可用。
我们将在本教程的新模块中进行工作,因此,请立即在您选择的文件夹中创建该模块:
创建 go.mod 文件
使用 go mod init
命令启动你的 module
以创建 go.mod
文件。
运行 go mod init
命令,给它代码所在 module
的路径。在这里,使用 github.com/myuser/myrepo
作为 module
路径—在生产代码中,这将是可以从其中下载 module
的 URL
。
$ go mod init github.com/myuser/myrepo
go: creating new go.mod: module github.com/myuser/myrepo
go mod init
命令创建一个 go.mod
文件,该文件将您的代码标识为可以从其他代码中使用的 module
。 您刚创建的文件仅包含模块名称和代码支持的 Go
版本。 但是,当您添加依赖项(即其他模块的软件包)时,go.mod
文件将列出要使用的特定 module
版本。 这样可以使构建具有可复制性,并使您可以直接控制要使用的 module
版本。
用 gRPC 创建一个简单的 hello world
为了了解 gRPC-Gateway
,我们首先要制作一个 hello