protoc 插件-protoc-gen-grpc-gateway-gosdk

news2024/9/20 22:30:57

👇我在这儿 

基本介绍

protoc-gen-grpc-gateway-gosdk 是一个 protoc 插件, 能根据 proto 文件一键生成 go http sdk 客户端代码,通过借助 grpc-gateway 插件将 grpc 接口转化为 http 的方式, 进而可以通过本插件生成 http sdk 代码。

5198c19b722358b8332b78e534359a57.png


特性

1.一键自动生成 go 客户端代码, 无需人工维护

2.通过设置统一网关, 支持将多个微服务的客户端整合

3.根据 service 或者根据路由进行资源分类, 直观调用

4.能对资源接口进行扩展, 如支持 websocket 接口以及支持扩展 http 原生框架的接口

5.自带 http rest frame 封装, 并支持 Direct 方式调用接口

6.能自动生成接口 fake 调用, 让单元测试更加简单

8de776c3d70fafbfd12b5626f9dd2797.gif


安装

go install github.com/golang/protobuf/protoc-gen-go@v1.3.2
go install github.com/jaronnie/protoc-gen-grpc-gateway-gosdk@v1.8.0


快速使用

编写 proto

syntax = "proto3";
option go_package = "./userpb";
package user;

import "google/api/annotations.proto";

message AddUserReq {
      string name = 1;
      int32 age = 2;
}

message AddUserResp {
      int32 id = 1;
}

service user {
      rpc Add(AddUserReq) returns (AddUserResp) {
            option (google.api.http) = {
                  post: "/api/v1.0/user/add"
                  body: "*"
            };
      };
}

目录结构如下:

$ tree proto              
proto
├── google
│   └── api
│       ├── annotations.proto
│       └── http.proto
└── user.proto

2 directories, 3 files

生成 httpsdk

生成的 sdk 代码在服务端:

mkdir -p pkgsdk/pb
protoc -I./proto --go_out=./pkgsdk/pb --grpc-gateway-gosdk_out=logtostderr=true,v=1,scopeVersion=userv1,sdkDir=pkgsdk:pkgsdk proto/user.proto

生成的 httpsdk 目录结构如下:

$ tree pkgsdk 
pkgsdk
├── clientset.go
├── fake
│   └── fake_clientset.go
├── pb
│   └── userpb
│       └── user.pb.go
├── rest
│   ├── client.go
│   ├── option.go
│   └── request.go
└── typed
    ├── direct_client.go
    ├── fake
    │   └── fake_direct_client.go
    └── userv1
        ├── fake
        │   ├── fake_user.go
        │   ├── fake_user_expansion.go
        │   └── fake_userv1_client.go
        ├── user.go
        ├── user_expansion.go
        └── userv1_client.go

8 directories, 14 files

生成的 httpsdk 独立 module:

mkdir -p modsdk/pb
protoc -I./proto --go_out=./modsdk/pb --grpc-gateway-gosdk_out=logtostderr=true,v=1,scopeVersion=userv1,goModule=github.com/jaronnie/autosdk,goVersion=1.18:modsdk proto/user.proto
cd modsdk
go mod tidy

生成的 httpsdk 目录结构如下:

$ tree modsdk
modsdk
├── clientset.go
├── fake
│   └── fake_clientset.go
├── go.mod
├── go.sum
├── pb
│   └── userpb
│       └── user.pb.go
├── rest
│   ├── client.go
│   ├── option.go
│   └── request.go
└── typed
    ├── direct_client.go
    ├── fake
    │   └── fake_direct_client.go
    └── userv1
        ├── fake
        │   ├── fake_user.go
        │   ├── fake_user_expansion.go
        │   └── fake_userv1_client.go
        ├── user.go
        ├── user_expansion.go
        └── userv1_client.go

8 directories, 16 files


http sdk 结构剖析

  • clientset.go: 客户端集合

  • fake/fake_clientset.go: fake 客户端集合

  • pb: 使用 protoc-gen-go 插件生成的 pb 文件

  • rest: rest frame 封装

  • typed: 所有接口封装

    • typed/userv/fake: 即 user 服务 v1 接口 fake 实现

    • typed/userv1/user.go:  userv1 服务 user 资源的实现

    • typed/userv1/user_expansion.go: userv1 服务 user 资源的接口扩展定义

    • typed/userv1/userv1_client.go: userv1 服务 user client 定义

    • typed/userv1/fake/fake_user.go:  userv1 服务 user 资源的 fake 实现

    • typed/userv1/fake_user_expansion.go: userv1 服务 user 资源的 fake 接口扩展定义

    • typed/userv1/fake_userv1_client.go: userv1 服务 fake user client 定义

    • typed/direct_client.go: direct 方式调用的 client

    • typed/fake/fake_direct_client.go: direct 方式调用的 fake client

    • typed/userv1: 即 user 服务 v1 接口实现



高级使用(微服务版)

一般而言, 都是多服务形式的, 如 A 服务, B 服务。前端通过统一的网关打入到 A, B 服务当中。通过该插件可生成 A, B 服务的统一 httpsdk。

编写 A 服务 proto

syntax = "proto3";
option go_package = "./apb";
package a;

import "google/api/annotations.proto";

message AddUserReq {
      string name = 1;
      int32 age = 2;
}

message AddUserResp {
      int32 id = 1;
}

service a {
      rpc Add(AddUserReq) returns (AddUserResp) {
            option (google.api.http) = {
                  post: "/api/v1.0/user/add"
                  body: "*"
            };
      };
}

编写 B 服务 proto

syntax = "proto3";
option go_package = "./bpb";
package b;

import "google/api/annotations.proto";

message AddUserReq {
      string name = 1;
      int32 age = 2;
}

message AddUserResp {
      int32 id = 1;
}

service b {
      rpc Add(AddUserReq) returns (AddUserResp) {
            option (google.api.http) = {
                  post: "/api/v1.0/user/add"
                  body: "*"
            };
      };
}

编写 env_file.yaml

scopeVersions: [av1, bv1]
goModule: github.com/jaronnie/autosdk
goVersion: 1.18

生成 httpsdk

通过设置 gatewayPrefix 变量统一网关

mkdir -p mutilmodsdk/pb
protoc -I./proto --go_out=./mutilmodsdk/pb --grpc-gateway-gosdk_out=logtostderr=true,v=1,scopeVersion=av1,gatewayPrefix=/gateway/a,env_file=./etc/modmutilsdk.yaml:mutilmodsdk proto/a.proto
protoc -I./proto --go_out=./mutilmodsdk/pb --grpc-gateway-gosdk_out=logtostderr=true,v=1,scopeVersion=bv1,gatewayPrefix=/gateway/b,env_file=./etc/modmutilsdk.yaml:mutilmodsdk proto/b.proto
cd mutilmodsdk
go mod tidy

生成的目录结构如下:

$ tree mutilmodsdk 
mutilmodsdk
├── clientset.go
├── fake
│   └── fake_clientset.go
├── go.mod
├── go.sum
├── pb
│   ├── apb
│   │   └── a.pb.go
│   └── bpb
│       └── b.pb.go
├── rest
│   ├── client.go
│   ├── option.go
│   └── request.go
└── typed
    ├── av1
    │   ├── av1_client.go
    │   ├── fake
    │   │   ├── fake_av1_client.go
    │   │   ├── fake_user.go
    │   │   └── fake_user_expansion.go
    │   ├── user.go
    │   └── user_expansion.go
    ├── bv1
    │   ├── bv1_client.go
    │   ├── fake
    │   │   ├── fake_bv1_client.go
    │   │   ├── fake_user.go
    │   │   └── fake_user_expansion.go
    │   ├── user.go
    │   └── user_expansion.go
    ├── direct_client.go
    └── fake
        └── fake_direct_client.go

11 directories, 23 files

实战篇

采用 go-zero 微服务框架, 编写 user 服务, 并加上 http 接口。

完整代码示例: https://github.com/jaronnie/protoc-gen-grpc-gateway-gosdk/tree/main/examples/grpc-restful

git clone github.com/jaronnie/protoc-gen-grpc-gateway-gosdk
cd protoc-gen-grpc-gateway-gosdk/examples/grpc-restful
go run user.go

# 使用插件生成 pkgsdk
mkdir -p pkgsdk/pb
protoc -I./proto --go_out=./pkgsdk/pb --grpc-gateway-gosdk_out=logtostderr=true,v=1,scopeVersion=userv1,sdkDir=pkgsdk:pkgsdk proto/user.proto

使用示例

package main

import (
 "context"
 "fmt"
 "github.com/jaronnie/protoc-gen-grpc-gateway-gosdk/grpc-restful/pkgsdk"
 "github.com/jaronnie/protoc-gen-grpc-gateway-gosdk/grpc-restful/pkgsdk/pb/userpb"
 "github.com/jaronnie/protoc-gen-grpc-gateway-gosdk/grpc-restful/pkgsdk/rest"
 "net/http"
)

func main() {
 cs, err := pkgsdk.NewClientWithOptions(
  rest.WithProtocol("http"),
  rest.WithAddr("127.0.0.1"),
  rest.WithPort("8081"),
  rest.WithHeaders(http.Header{"Content-Type": []string{"application/json"}}),
 )

 if err != nil {
  panic(err)
 }

 data, err := cs.Userv1().User().Add(context.Background(), &userpb.AddUserReq{
  Name: "jaronnie",
  Age:  22,
 })
 if err != nil {
  panic(err)
 }
 fmt.Println(data)
}

参考链接

  • 五分钟给你的 gRPC 服务加上 HTTP 接口:https://mp.weixin.qq.com/s/0v0zM9FkYSVw1iyRiQRNYw

  • protoc-gen-grpc-gateway-gosdk:

    https://protoc-gen-grpc-gateway-gosdk.jaronnie.com/

  • grpc-restful:

https://github.com/kevwan/grpc-restful

  • jaronnie/grpc-restful:

https://github.com/jaronnie/protoc-gen-grpc-gateway-gosdk/tree/main/examples/grpc-restful



45afdc2fe844bd99b3de4bb3fc72a525.jpeg

👇和我一起去

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot整合cache+redis

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、cache是什么?二、使用步骤1.使用方式1.引入依赖2.搭建项目依赖问题application.ymlTestControllerTestServiceTestServiceImplUserMapperMyRedi…

使用vue.component全局注册组件、props的使用

通过components注册的是私有子组件 例如: 在组件A的 components 节点下,注册了组件F。 则组件F只能用在组件A中;不能被用在组件C中。 注册全局组件 在vue项目的 main.js 入口文件中,通过 Vue.component() 方法,可以注册全局组件…

数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)

目录 基本介绍 平衡因子 平衡二叉树 平衡二叉树的高度 基本介绍 什么是平衡二叉树? 以一个例子来解释一下: 搜索树结点按不同的插入次序,将会导致不同的深度和平均查找长度ASL 在二叉搜索树中查找一个元素: &#xff08…

TCP 协议的低效实现

包括 Linux kernel 在内的各种 TCP 实现均使用类似 skb 的对象管理一个个 packet,使 TCP 失去了 “流” 特征。应用通过 syscall 每写入一批数据,协议栈都可能生成一个 skb: ​ 仅管理这些 skb 就是一笔大开销。除了 skb 数据结构本身的 cru…

Python小姿势 - import requests

import requests Python中使用requests模块发送POST请求 在使用Python进行开发时,经常会遇到需要向某个网址发送POST请求的情况。这时候就需要使用到requests模块了。 requests模块是Python的一个标准模块,可以直接使用pip安装。 安装完成后,…

Java每日一练(20230425)

目录 1. 乘积最大子数组 🌟🌟 2. 插入区间 🌟🌟 3. 删除有序数组中的重复项 II 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏…

CesiumForUnreal之3DTileset点选拾取属性与单体高亮

文章目录 1.实现目标2.实现过程2.1 3DTiles数据准备2.2 属性拾取2.3 单体高亮3.参考资料1.实现目标 在UE5中使用CesiumForUnreal插件加载本地的3dTiles建筑白模数据,实现点击拾取3DTileset单体要素的属性数据,并对高亮单体进行展示,GIF动图如下: 2.实现过程 总体的实现过程…

模型剪枝网络 Learning Efficient Network throung Network Slimming 简述

1. 概述 训练得到的特征图,并不是所有特征图都重要,另一方面,希望对权重执行策略,体现出权重之间的差异性,最终目的就是获得不同特征图中的channel sacling factors,表征了不同特征图的重要性 2. BN 采…

老码农眼中的大模型(LLM)

即便全力奔跑,也不一定能跟上时代的步伐。但如果失去了学习的动力,很可能会被时代淘汰。而且,当时代淘汰我们的时候,往往不会有任何预警。基于大模型的 ChatGPT 给我们带来了极大的震撼,那么什么是大模型呢&#xff1f…

【网络进阶】五种IO网络模型(一)

文章目录 1. 阻塞IO2. 非阻塞IO 1. 阻塞IO 在Linux中,默认情况下,所有的套接字(socket)都是阻塞的。典型的读取操作流程如下: 当用户进程调用read系统调用时,内核开始执行I/O的第一个阶段,即…

智慧医院智能化系统设计与能耗管理产品选型

摘要:结合某知名大型三甲综合医院项目的智能化系统设计,提出智慧医院智能化系统的技术解决方案,阐述智慧医院智能化系统方案的总体架构、建设目标、设计宗旨、典型应用及各智能化子系统的设计方案。 关键词:智慧医院;智…

mybatis3源码篇(2)——执行流程

mybatis 版本:v3.3.0 文章目录 执行流程MapperProxyFactoryMapperProxyMapperMethodexecuteconvertArgsToSqlCommandParamResultHandler SqlSessionExecutor(执行器)StatementHandler(声明处理器)ParameterHandler&…

【设计模式】我对设计模式的C语言解读(下)

书接上回 由于内容太多,编辑器太卡了,所以分P了 上P在这里 目录 书接上回备忘录模式观察者模式 备忘录模式 备忘录模式的介绍: https://refactoringguru.cn/design-patterns/memento 备忘录模式的C实现: https://refactoringguru.cn/design-patterns/m…

【数据挖掘与商务智能决策】第十三章 数据降维之PCA 主成分分析

13.1.2 PCA主成分分析代码实现 1.二维空间降维Python代码实现 import numpy as np X np.array([[1, 1], [2, 2], [3, 3]]) Xarray([[1, 1],[2, 2],[3, 3]])# 也可以通过pandas库来构造数据,效果一样 import pandas as pd X pd.DataFrame([[1, 1], [2, 2], [3, 3…

二分查找【数组】

⭐前言⭐ ※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入复习模式。若有错误,请多多指教。更多有趣的代码请移步Gitee 👍 点赞 ⭐ 收藏 📝留言 都是我创作的最大的动力! 题目 70…

接口测试用例设计思路

(我的公众号“墨石测试攻略”,关注获取软件测试相关知识及整套接口测试实战项目!) 接口测试用例的设计,从功能测试角度来说:首先需要分析接口文档。 现在很多公司都使用swagger来管理接口。swagger中可以…

fMRI时间序列振幅和相位对功能连接分析的影响

导读 目的:fMRI领域的一些研究使用瞬时相位(IP)表征(源自BOLD时间序列的解析表征)考察了脑区之间的同步性。本研究假设来自不同脑区的瞬时振幅(IA)表征可以为脑功能网络提供额外的信息。为此,本研究探索了静息态BOLD fMRI信号的这种表征,用于…

SpringBoot AnnotationFormatterFactory接口+自定义注解实现类型转换

参考资料 自定义AnnotationFormatterFactory实现注解方式类型转换Spring MVC 基于AnnotationFormatterFactory接口实现自定义的规则 目录 一. 前期准备1.1. 自定义转换标记注解1.2 入参form 二. 实现AnnotationFormatterFactory接口,构建格式化Factory2.1 code补全…

【7】一篇文章学习 Linux 中一些硬核的常用知识

目录 一、systemctl二、软链接三、日期(date 命令)四、Linux 的时区(1) 修改时区(2) ntp 五、IP 地址六、主机名七、域名解析八、配置 Linux 的固定 IP 地址(1) 在 VMwareWorkstation 中配置 IP 地址网关和网段(IP 地址的范围)(2)…

[陇剑杯 2021]之Misc篇(NSSCTF)刷题记录④

NSSCTF-Misc篇-[陇剑杯 2021] jwt:[陇剑杯 2021]jwt(问1)[陇剑杯 2021]jwt(问2)[陇剑杯 2021]jwt(问3)[陇剑杯 2021]jwt(问4)[陇剑杯 2021]jwt(问5&#xff0…