乐趣区

关于grpc:gRPCGateway-快速实战

明天来分享一波 gRPC-Gateway, 之前咱们有分享过什么是 gRPC 及其应用形式,能够看看这些对于 gRPC 的历史文章:

  • gRPC 介绍

<!—->

  • gRPC 客户端调用服务端须要连接池吗?

<!—->

  • gRPC 的拦截器

<!—->

  • gRPC 的认证

<!—->

  • 分享一下 gRPC- HTTP 网关 I

明天次要是分享对于 gRPC-Gateway 的实战局部,文章大体分为如下几个局部:

  • gRPC-GateWay 简略原理介绍

<!—->

  • 根本环境创立

<!—->

  • gRPC-GateWay 实战

gRPC-GateWay 简略原理介绍

如下是官网的一张基本原理图

gRPC-Gateway 是一个协定插件,它读取一个 gRPC 服务定义,并生成一个反向代理服务 它将一个 RESTful JSON API 转换为 gRPC,这个服务器是依据 gRPC 定义中的自定义选项生成的。

简略来说,咱们的 gRPC-Gateway 能做到的事件就是:

可能提供 RESTful JSON API 接口,并且申请通过 http 接口打进来,gRPC-Gateway 可能将其申请转给 grpc 服务,最终 grpc 服务进行解决并响应

接下来,咱们就来看看 gRPC-Gateway 是如何同时提供 http 接口和 grpc 服务的

根本环境创立

应用 gRPC-Gateway,咱们须要搭建根本的环境,正如之前咱们实战 grpc 的时候,须要搭建一个根本的 grpc 环境,总的来说须要做如下事项:

  1. 开始创立本人的我的项目目录
mkdir my_grpcgateway
cd my_grpcgateway
mdkir protoc/order
cd protoc/order
  1. 下载 gRPC-Gateway 的依赖
$ 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
  1. 查看工具,执行完第二步之后,咱们能够看到咱们将 gRPC-Gateway 的依赖库和工具都下载下来了,咱们能够看到在咱们的 GOPATH 目录下有如下工具
  • protoc-gen-go

<!—->

  • protoc-gen-grpc-gateway

<!—->

  • protoc-gen-go-grpc

<!—->

  • protoc
  1. 将依赖库的 google/api 拷贝到咱们的 order 目录下

这个时候咱们次要是后续实战会应用库外面的 annotations.proto他的作用就是将 HTTP 映射成 gRPC,目录是这样的

google/
├── api
│   ├── annotations.proto
│   ├── httpbody.proto
│   └── http.proto

例如 我的 GOPATH 在 “/root/go”,因而咱们能够这样来复制

cp /root/go/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@v1.16.0/third_party/googleapis/google/api/ ./

接下来就能够进入到实战局部 了,目前,咱们的目录是这样的

my_grpcgateway/
├── protoc
│   └── order
│       ├── google
│       │   ├── api
│       │   │   ├── annotations.proto
│       │   │   ├── httpbody.proto
│       │   │   └── http.proto

gRPC-GateWay 实战

来到实战局部,先说一下咱们的需要:

  • 咱们客户端通过申请服务端接口,查问订单信息

这个时候,其实咱们只须要走如下 3 步骤即可

  1. 编写 proto 文件

<!—->

  1. 用工具生成相应的代码

<!—->

  1. 填写相应的代码逻辑即可

编写 proto 文件

在上述的 my_grpcgateway/protoc/order 下 创立 文件 order.proto

cd my_grpcgateway/protoc/order
vim  order.proto

编写 order.proto 文件的时候咱们导入了annotations.proto 文件 import "google/api/annotations.proto";

另外,咱们在编写 proto 的时候,当初多定义了一个 Service

service Order {rpc GetOrderInfo (GetOrderReq) returns (GetOrderRsp) {option (google.api.http) = {
      post: "/v1/order/getorder"
      body: "*"
    };
  };
}

那通过咱们写的 order.proto 文件,咱们晓得,咱们定义的

  • HTTP 接口是 POST /v1/order/getorder

<!—->

  • gRPC 接口是 GetOrderInfo

用工具生成相应的代码

protoc -I ./ \
  --go_out ./ --go_opt paths=source_relative \
  --go-grpc_out ./ --go-grpc_opt paths=source_relative \
  --grpc-gateway_out ./ --grpc-gateway_opt paths=source_relative \
  ./order.proto

咱们生成的文件寄存目录都是当前目录,应用 protoc 工具生成代码后,咱们能够看到 order 目录 下是这样的

# ls
google  order_grpc.pb.go  order.pb.go  order.pb.gw.go  order.proto

这个时候,其实咱们本次最关注的是 order.pb.gw.go 文件的生成

填写相应的代码逻辑即可

那这个时候,咱们就能够创立代码文件来实现上述的 gRPC 接口,以及初始化 gRPC 服务和 gRPC-Gateway 的反向代理了

  1. 在 my_grpcgateway 目录下创立 main.go
  1. 在 my_grpcgateway 下创立 server 目录,并在 server 目录下编写 server.go
mkdir server 
cd server
vim server.go

server.go

  1. 回到 my_grpcgateway,创立 mod,拉依赖包,并运行代码
go mod init mytest
go mod tidy
go run main.go

这个时候,咱们能够看到 6666 端口,和 9999 端口都被服务监听着,此时咱们来申请 9999 的 HTTP 端口,如下:

服务端曾经启动:

客户端能够应用 postman 来申请接口:

当然也能够在 linux 外面应用 curl 来申请接口

curl -X POST -d '{"tid":"0001-000001","tenant_name":"test tenant","order_id":"1000-1000001"}' http://localhost:9999/v1/order/getorder

写在最初

至此,咱们从 gRPC-Gateway 的基本原理到疾速实战,置信 xdm 可能有肯定的播种吧,连忙动起手来实战一波,并退出本人的想法变着花色的去玩他

应用 gRPC-Gateway 能够极大的进步咱们的效率,间接实现 grpc 服务接口也能够提供 http 接口进来

下一篇,将会是 gRPC-Gateway Swaager 相干,可能让咱们提供进来的接口更加敌对和不便

我的项目代码能够查看地址:https://github.com/qingconglaixueit/my_grpcgateway_demo

感激浏览,欢送交换,点个赞,关注一波 再走吧

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是 阿兵云原生,欢送点赞关注珍藏,下次见~

退出移动版