gRPC-Gateway 快速实战

今天来分享一波 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

image.png

编写 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

image.png

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

server.go
image.png

image.png

image.png

  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

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

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

可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/113946.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React面向组件编程

往期回顾:# React基础入门之虚拟Dom【一】 面向组件编程 react是面向组件编程的一种模式,它包含两种组件类型:函数式组件及类式组件 函数式组件 注:react17开始,函数式组件成为主流 一个基本的函数组件长这个样子 …

Meta语言模型LLaMA解读:模型的下载部署与运行代码

文章目录 llama2体验地址模型下载下载步骤准备工作什么是Git LFS下载huggingface模型 模型运行代码 llama2 Meta最新语言模型LLaMA解读,LLaMA是Facebook AI Research团队于2023年发布的一种语言模型,这是一个基础语言模型的集合。 体验地址 体验地址 …

Nacos基础(2)——nacos的服务器和命名空间 springBoot整合nacos 多个nacos配置的情况

目录 引出nacos服务器和命名空间Nacos服务器命名空间 springBoot整合nacosspringcloud Alibaba 版本与springcloud对应关系引包配置maincontroller 报错以及解决【报错】错误:缺少服务名称报错:9848端口未开放 启动测试引入多个nacos配置多个配置的情况没…

Linux土遁术之监测监测进程打开文件

分析问题过程中,追踪进程打开的文件可以在许多不同情况下有用,体现在以下几个方面: 故障排除和调试: 当程序出现问题、崩溃或异常行为时,追踪进程打开的文件可以帮助您找出问题的根本原因。这有助于快速定位错误&…

手机盖板IR油墨透光率检测仪T03

手机盖板作为手机最外层玻璃面板,其加工一般有落料、倒边、抛光、镀膜、丝印等多道加工工序组成,其中任何一个工序出现差错,都有可能导致手机盖板产生缺陷,例如漏油、透光、IR孔不良、视窗划伤、油墨区划伤、內污、边花等&#xf…

【java安全】FastJson反序列化漏洞浅析

文章目录 【java安全】FastJson反序列化漏洞浅析0x00.前言0x01.FastJson概述0x02.FastJson使用序列化与反序列化 0x03.反序列化漏洞0x04.漏洞触发条件0x05.漏洞攻击方式JdbcRowSetImpl利用链TemplatesImpl利用链**漏洞版本**POC漏洞分析 【java安全】FastJson反序列化漏洞浅析 …

Ansible 自动化运维工具的使用

目录 一、Ansible简介 Ansible 总结 二、Ansible 的安装和使用 下载 使用 三、Ansible命令和模块 1.命令格式 2.命令行模块 (1)command 模块 (2)shell 模块 (3)cron 模块 present添加 absent删…

高速公路自动驾驶汽车超车控制方法研究

目录 摘要 ............................................................................................................ I Abstract ...................................................................................................... II 目录 ...............…

图转超图 Graph convert toHypergraph

图转超图 DHT 介绍那么它有啥用呢? 这个实在太好玩了,参考的这个论文: EHGNN 采用的方法叫 Dual Hypergraph Transformation (DHT),主要就是把一个 graph 转为 hypergraph DHT 介绍 如何将 graph 转 hypergraph 的呢&#xff1…

企业智能知识管理在线工具语雀、helplook、石墨文档、Baklib怎么样?

语雀、helplook、石墨文档和Baklib都是企业智能知识管理的在线工具,它们都提供了一系列功能来帮助企业管理和共享知识。下面我将对这些工具进行详细的介绍和评价。 语雀: 语雀是一款功能强大的在线知识管理工具,它提供了丰富的功能和优秀的…

如何检测勒索软件攻击

什么是勒索软件 勒索软件又称勒索病毒,是一种特殊的恶意软件,又被归类为“阻断访问式攻击”(denial-of-access attack),与其他病毒最大的不同在于攻击方法以及中毒方式。 攻击方法:攻击它采用技术手段限制…

unity 之 如何获取父物体与子物体

文章目录 获取父物体获取子物体 获取父物体 在Unity中,你可以使用Transform组件的属性来获取对象的父物体。以下是在C#脚本中如何获取父物体的示例代码: using UnityEngine;public class GetParentExample : MonoBehaviour {void Start(){// 获取当前物…

三、mycat分库分表

第五章 分库分表 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业 务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同 的库上面,如下图: 系统被切分成了&…

解决抖音semi-ui的Input无法获取到onChange事件

最近在使用semi-ui框架的Input实现一个上传文件功能时遇到了坑&#xff0c;就是无法获取到onChange事件&#xff0c;通过console查看只是拿到了一个文件名。但若是把<Input>换成原生的<input>&#xff0c;就可以正常获取到事件。仔细看了下官方文档&#xff0c;发现…

巨人互动|游戏出海游戏出海的趋势如何

随着全球游戏市场的不断扩大和消费者需求的多元化&#xff0c;游戏出海作为游戏行业的重要战略之一&#xff0c;正面临着新的发展趋势。本文小编将讲讲游戏出海的趋势&#xff0c;探讨一下未来游戏出海的发展方向与前景。 巨人互动|游戏出海&2023国内游戏厂商加快“出海”发…

高效利用隧道代理实现无阻塞数据采集

在当今信息时代&#xff0c;大量的有价值数据分散于各个网站和平台。然而&#xff0c;许多网站对爬虫程序进行限制或封禁&#xff0c;使得传统方式下的数据采集变得困难重重。本文将向您介绍如何通过使用隧道代理来解决这一问题&#xff0c;并帮助您成为一名高效、顺畅的数据采…

postgresql类型转换函数

postgresql类型转换函数 简介CAST 函数to_date 函数to_timestamp 函数to_char 函数to_number 函数隐式类型转换 简介 类型转换函数用于将数据从一种类型转换为另一种类型。 CAST 函数 CAST ( expr AS data_type )函数用于将 expr 转换为 data_type 数据类型&#xff1b;Post…

SpringBoot—日志

目录 日志使用日志日志级别设置日志级别设置分组指定日志文件路径日志切割归档使用第三方日志框架log4j2配置文件【分级存储】logback配置文件【分级存储】 实例代码 日志 使用日志 给controller添加日志信息 要给controller类上添加Slf4j注解&#xff0c;然后使用log.info(…

根据身高重建队列【贪心算法】

根据身高重建队列 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返…

公网中Linux系统下Redis使用注意事项以及被pnscan病毒攻击的经过

一次惨痛的教训&#xff1a;被pnscan病毒攻击的经过&#xff08;公网中Linux系统下Redis使用注意事项&#xff09; 0.案发情况pnscan病毒感染惨状&#xff1a;>>提示<< 1.案发原因2.排查过程简单排查之后&#xff0c;发现啥都做不了。先百度到了如下文章&#xff1…