如何在Golang中使用gRPC网关转换REST请求


答案:在Golang中通过gRPC网关将REST转为gRPC调用需定义带google.api.http注解的proto文件,生成gRPC和服务代码后分别启动gRPC服务器和HTTP网关,实现RESTful API到内部gRPC的自动转换。

如何在golang中使用grpc网关转换rest请求

在Golang中使用gRPC网关将REST请求转换为gRPC调用,是构建现代微服务API的常见做法。它允许你通过HTTP/JSON对外提供RESTful接口,同时内部使用高性能的gRPC进行服务间通信。整个流程依赖于Protocol Buffers定义服务,并借助grpc-gateway生成反向代理代码。

定义Protocol Buffer服务

要启用gRPC网关,首先需要在.proto文件中定义gRPC服务,并添加特定的google.api.http注解来映射REST路径。

安装必要的proto插件:

go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

编写service.proto文件:

syntax = "proto3";

package example;

import "google/api/annotations.proto";

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloResponse) {
    option (google.api.http) = {
      get: "/v1/hello/{name}"
    };
  }
}

这里option (google.api.http)SayHello方法绑定到GET /v1/hello/{name},URL中的{name}会自动映射到请求字段。

生成gRPC和gRPC-Gateway代码

运行protoc命令生成Go代码:

protoc \
  --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 \
  service.proto

这会生成三个文件:

  • service.pb.go:基础结构体和gRPC客户端/服务接口
  • service_grpc.pb.go:gRPC服务实现桩代码
  • service.pb.gw.go:gRPC网关的HTTP处理器,负责将REST转为gRPC调用

启动gRPC服务与HTTP网关

你需要同时运行gRPC服务器和HTTP网关。通常gRPC监听本地端口,而HTTP网关作为前端代理转发请求。

实现gRPC服务:

芝士饼 芝士饼

芝士饼是一个一站式AI原生应用开发平台,简单几步即可完成应用的创建与发布。

芝士饼 84 查看详情 芝士饼 type server struct{}

func (s *server) SayHello(ctx context.Context, req *example.HelloRequest) (*example.HelloResponse, error) {
  return &example.HelloResponse{Message: "Hello " + req.Name}, nil
}

启动gRPC服务器:

lis, _ := net.Listen("tcp", ":50051")
s := grpc.NewServer()
example.RegisterGreeterServer(s, &server{})
s.Serve(lis)

启动HTTP网关(反向代理):

ctx := context.Background()
mux := runtime.NewServeMux()
opts := []grpc.DialOption{grpc.WithInsecure()}
_ = example.RegisterGreeterHandlerFromEndpoint(ctx, mux, "localhost:50051", opts)

http.ListenAndServe(":8080", mux)

现在你可以通过GET /v1/hello/world访问服务,网关会将其转换为gRPC调用并返回JSON响应。

处理复杂路由和方法

除了GET,你还可以映射POST、PUT等方法,并指定body字段:

rpc CreateBook(CreateBookRequest) returns (CreateBookResponse) {
  option (google.api.http) = {
    post: "/v1/shelves/{shelf_id}/books"
    body: "book"
  };
}

这表示POST数据到/v1/shelves/123/books,请求体中的JSON会被解析到book字段。

确保你的proto文件导入google/api/annotations.protogoogle/api/http.proto,可通过buf或手动下载管理依赖。

基本上就这些。只要定义好proto注解,生成代码并正确启动两个服务,gRPC网关就能自动完成REST到gRPC的转换,无需手动写HTTP handler。这种方式统一了API契约,便于维护和文档生成。不复杂但容易忽略的是注解语法和生成命令的参数顺序。

以上就是如何在Golang中使用gRPC网关转换REST请求的详细内容,更多请关注其它相关文章!


# 前端  # 抖音seo排名方式途径  # 福州抖音推广营销公司  # 网站推广域名  # seo分析网站流量  # 新沂网站推广价格  # 文件压缩  # 加载  # 动态网页  # 是一个  # 的是  # 资源管理  # 如何实现  # 转换为  # 芝士  # js  # git  # json  # go  # github  # golang  # 处理器  # 端口  # 路由  # google  # restful api  # 如何在  # 长沙神马seo优化  # 江西seo快排哪家好  # 网站建设的指标  # 揭阳在哪建设网站  # 海口seo服务方案 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: PHP中获取HTTP响应状态消息:方法与限制  WooCommerce购物车:强制显示所有交叉销售商品教程  《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐  《腾讯相册管家》注销账号方法  windows10怎么关闭自动安装应用_windows10禁止推广应用下载  抖音网页版地址直接进入_抖音网页版在线观看入口  HTML Canvas文本样式定制指南:解决外部字体加载与应用难题  J*aScript模块加载器_RequireJS原理分析  外卖小程序对接第三方配送  todesk如何添加信任设备_todesk信任设备设置教程  《下一站江湖2》心法融合技巧  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  VS Code的时间线(Timeline)视图:您的代码时光机  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  GBA模拟器手柄按键设置  diskgenius分区工具如何设置Bios启动项  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  小红书网页版怎么进 小红书网页版通用入口  AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  银信通自动开通原因揭秘  TikTok网页版入口快速访问 TikTok官网账号登录方法  excel怎么计算平均值 excel平均函数*ERAGE使用教学  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  铁路12306怎么申请退票_铁路12306退票申请操作流程  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?  电子白板帮助菜单使用指南  J*aScript实现网页表单实时输入字段比较与验证教程  mysql中如何配置字符集和排序规则_mysql字符集排序配置  windows10怎么更改下载路径_windows10默认存储位置修改教程  解决SQLAlchemy模型跨文件关联的Linter兼容性指南  《单词速记宝》设置学习计划方法  不吃碳水化合物是健康减肥的好办法吗  QQ邮箱注册地址 免费获取QQ邮箱账号  折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】  123平台官方登录入口 123邮箱网页端在线沟通工具  微信步数怎么刷_微信步数快速提升技巧  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】  《猎聘》筛选猎头岗位方法  邮编号码查询app有哪些_邮编号码查询推荐app及使用体验  OTT月报 | 2025年9月智能电视大数据报告  在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程  《幻兽帕鲁》手游帕鲁捕捉技巧分享  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  学习通网页版个人登录_学习通网页版个人账户登录入口  多多买菜门店端app订单查看方法  《友玩*》创建群聊方法  Golang如何实现HTTP请求重试机制_Golang HTTP请求错误处理策略  《下一站江湖2》独孤剑诀习得方法 

 2025-11-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.