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 环境,总的来说需要做如下事项:
- 开始创建自己的项目目录
mkdir my_grpcgateway
cd my_grpcgateway
mdkir protoc/order
cd protoc/order
- 下载 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
- 检查工具,执行完第二步之后,我们可以看到咱们将 gRPC-Gateway 的依赖库和工具都下载下来了,咱们可以看到在我们的 GOPATH 目录下有如下工具
- protoc-gen-go
- protoc-gen-grpc-gateway
- protoc-gen-go-grpc
- protoc
- 将依赖库的 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 步骤即可
- 编写 proto 文件
- 用工具生成相应的代码
- 填写相应的代码逻辑即可
编写 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 的反向代理了
- 在 my_grpcgateway 目录下创建 main.go
- 在 my_grpcgateway 下创建 server 目录,并在 server 目录下编写 server.go
mkdir server
cd server
vim server.go
server.go
- 回到 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
相关文章:

gRPC-Gateway 快速实战
今天来分享一波 gRPC-Gateway , 之前咱们有分享过什么是 gRPC 及其使用方式,可以看看这些关于 gRPC 的历史文章: gRPC介绍 gRPC 客户端调用服务端需要连接池吗? gRPC的拦截器 gRPC的认证 分享一下 gRPC- HTTP网关 I 今天主要是分…...
〔019〕Stable Diffusion 之 单图中绘制多人分区域写提示词 篇
✨ 目录 🎈 下载区域绘制插件🎈 区域绘制使用🎈 参数讲解和基础使用🎈 Lora 自组🎈 Lora 自组的使用🎈 分区扩散🎈 分区域提示🎈 下载区域绘制插件 在绘制图片时,经常绘制的图片不仅仅是 单人图片,也可能需要绘制 多人图片那么通过正常方式绘制出来的多人图片…...

Scala入门,idea关联Scala
Scala 介绍 Scala是一种多规范的编程语言,它结合了面向对象编程(OOP)和函数式编程(FP)的特征,Scala的名字源于”Scalable language“,意为”可伸缩语言“。2003年开发的,并在JVM&a…...

3DCAT携手华为,打造XR虚拟仿真实训实时云渲染解决方案
2023年5月8日-9日,以 因聚而生 众志有为 为主题的 华为中国合作伙伴大会2023 在深圳国际会展中心隆重举行。本次大会汇聚了ICT产业界的广大新老伙伴朋友,共同探讨数字化转型的新机遇,共享数字化未来的新成果。 华为中国合作伙伴大会2023现场&…...

Spring Security注销后未正确保存空的SecurityContext漏洞CVE-2023-20862
文章目录 0.前言漏洞Spring Security介绍 1.参考文档2.基础介绍3.解决方案3.1. 升级版本3.2. 临时替代方案 4.Spring Security使用教程简单代码示例 0.前言 背景:公司项目扫描到 Spring-security 组件 注销后未正确保存空的SecurityContext CVE-2023-20862 漏洞 高…...

11、监测数据采集物联网应用开发步骤(8.2)
监测数据采集物联网应用开发步骤(8.1) 新建TCP/IP Client线程类com.zxy.tcp.ClientThread.py #! python3 # -*- coding: utf-8 -Created on 2017年05月10日 author: zxyong 13738196011 import datetime import socket import threading import timefrom com.zxy.adminlog.Us…...

【PWN · ret2text | RISC-V异构】[2023 羊城杯]login
第一道异构PWN的题目,没做出来。。。。但是是因为工具没有 QAQ 目录 前言 一、食用工具 Ghidra 安装使用 二、解题思路 三、exp 总结 前言 我们context.arch经常是i386和amd64,突然遇到RISC-V架构的题目,一是本地运行不了(…...
【HBZ分享】TCP可靠性传输如何保证的?以及传输优化之Nagle算法
ACK机制 ACK机制是发送方与接收方的一个相互确认客户端向服务端发送连接请求,此时服务端要回馈给客户端ACK,以表示服务端接到了客户端请求,这是第一和的第二次握手客户端接收到服务端响应后,同样也要回馈服务端的响应,…...

智能电销机器人,主要体现的价值是什么
21世纪科技的迅速发展,人工智能逐渐走入大家的视线,越来越多的机器人出现在我们生活中。见的最多的有电销公司的智能语音机器人、在仓库拣货打包的机器人、商场店铺供娱乐对话的机器人。机器人活跃在各行各业中,降低了人工成本,代…...

Win7系统电脑开机总出现硬盘自检的简单解决方法
你是不是经常会遇到电脑开机进行硬盘自检,而且每次开机都检查很久不能跳过;怎么才能跳过这一步骤呢?下面教大家如何让Win7系统电脑在开机的时候跳过硬盘自检这一步骤,加快开机时间。 解决步骤: 1、按下“Win R”快捷键…...

计网第四章(网络层)(五)
目录 静态路由配置 默认路由: 特定主机路由: 示例: 广播域和冲突域: 静态路由配置 在第四节(计网第四章(网络层)(四)_永无魇足的博客-CSDN博客)有提到过…...
ios 手机浏览器,点击输入框页面会放大
一个普通的h5静态页面,在ios手机上用浏览器打开,发现每次聚焦输入框的时候整个页面都会放大! 解决办法在html的头部meta标签中设置 user-scalableno viewport meta 标记 - HTML(超文本标记语言) | MDN...
全局异常处理
案例一: 自定义异常 public class StudentException extends RuntimeException {private Integer code;private String msg;public StudentException(Integer code, String msg) {this.code code;this.msg msg;}/*** 这里需要重写 getMessage方法,否…...

更健康舒适更科技的照明体验!SUKER书客护眼台灯 L1上手体验
低价又好用的护眼台灯是多数人的需求,很多人只追求功能性护眼台灯,显色高、无频闪、无蓝光等基础需求。但是在较低价格中很难面面俱到,然而刚发布的SUKER书客L1护眼台灯却是一款不可多得的性价比护眼台灯,拥有高品质光源ÿ…...

Locked勒索病毒:最新变种.locked袭击了您的计算机?
导言: 在今天的数字时代,勒索病毒已经不再是仅仅让数据变得不可访问的小威胁。 .locked 勒索病毒,作为其中的一种,以其高度复杂的加密算法和迅速变化的攻击手法而备受恶意分子喜爱。本文91数据恢复将带您深入了解 .locked 勒索病毒…...

随机森林算法
介绍 随机森林是一种基于集成学习的有监督机器学习算法。随机森林是包含多个决策树的分类器,一般输出的类别是由决策树的众数决定。随机森林也可以用于常见的回归拟合。随机森林主要是运用了两种思想。具体如下所示。 Breimans的Bootstrap aggregatingHo的random …...

如何将国标规范用EndNote插入到英文期刊中,自定义文献插入指南
EndNote自定义文献 1.插入国标JTG 2034-2020这种新建一个StandardReference填入信息参考 插入英文期刊规范ASTM 1.插入国标JTG 2034-2020这种 首先找到大家要投稿的英文期刊,然后去找那些中…...

重写 UGUI
重写Button using UnityEngine; using UnityEngine.UI; public class MyButton : Button {[SerializeField] private int _newNumber; }using UnityEditor;//编辑器类在UnityEditor命名空间下。所以当使用C#脚本时,你需要在脚本前面加上 "using UnityEditor&q…...

合宙Air724UG LuatOS-Air LVGL API控件--容器 (Container)
容器 (Container) 容器是 lvgl 相当重要的一个控件了,可以设置布局,容器的大小也会自动进行调整,利用容器可以创建出自适应成都很高的界面布局。 代码示例 – 创建容器 cont lvgl.cont_create(lvgl.scr_act(), nil) lvgl.obj_set_auto_re…...
代码随想录训练营第41天|343.整数拆分,96.不同的二叉搜索树
代码随想录训练营第41天|343.整数拆分,96.不同的二叉搜索树 343.整数拆分文章思路代码 96.不同的二叉搜索树文章思路代码 总结 343.整数拆分 文章 代码随想录|0343.整数拆分 思路 二刷不难 d p [ i ] M a x j ( m a x ( j 1 , d p [ j ] ) ∗ ( i − j ) ) \…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...