Go语言高级编程:gRPC网关开发,提供RESTful接口的终极指南
2026/5/8 4:43:40 网站建设 项目流程

Go语言高级编程:gRPC网关开发,提供RESTful接口的终极指南

【免费下载链接】advanced-go-programming-book:books: 《Go语言高级编程》开源图书,涵盖CGO、Go汇编语言、RPC实现、Protobuf插件实现、Web框架实现、分布式系统等高阶主题(完稿)项目地址: https://gitcode.com/gh_mirrors/ad/advanced-go-programming-book

《Go语言高级编程》开源图书是一本涵盖CGO、Go汇编语言、RPC实现、Protobuf插件实现、Web框架实现、分布式系统等高阶主题的完稿书籍。本文将详细介绍如何使用gRPC网关开发,为你的gRPC服务提供RESTful接口,让前端JavaScript与后端交互更加便捷。

为什么需要gRPC网关?

gRPC服务一般用于集群内部通信,如果需要对外暴露服务一般会提供等价的REST接口。通过REST接口比较方便前端JavaScript和后端交互。开源社区中的 grpc-gateway 项目就实现了将 gRPC 服务转为 REST 服务的能力。

grpc-gateway工作原理

grpc-gateway 的工作原理如下图:

通过在 Protobuf 文件中添加路由相关的元信息,通过自定义的代码插件生成路由相关的处理代码,最终将 REST 请求转给更后端的 gRPC 服务处理。

实战步骤:使用grpc-gateway

1. 定义Protobuf文件

路由扩展元信息通过 Protobuf 的元数据扩展用法提供:

syntax = "proto3"; package main; import "google/api/annotations.proto"; message StringMessage { string value = 1; } service RestService { rpc Get(StringMessage) returns (StringMessage) { option (google.api.http) = { get: "/get/{value}" }; } rpc Post(StringMessage) returns (StringMessage) { option (google.api.http) = { post: "/post" body: "*" }; } }

2. 安装protoc-gen-grpc-gateway插件

通过以下命令安装 protoc-gen-grpc-gateway 插件:

go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway

3. 生成路由处理代码

通过插件生成 grpc-gateway 必须的路由处理代码,项目中的Makefile示例如下:

gen: protoc \ -I=. -I=../../../github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ --go_out=plugins=grpc:. \ helloworld.proto protoc \ -I=. -I=../../../github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ --grpc-gateway_out=. \ helloworld.proto protoc \ -I=. -I=../../../github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ --swagger_out=. \ helloworld.proto

4. 实现gRPC服务

启动 grpc 服务,端口 5000:

type RestServiceImpl struct{} func (r *RestServiceImpl) Get(ctx context.Context, message *StringMessage) (*StringMessage, error) { return &StringMessage{Value: "Get hi:" + message.Value + "#"}, nil } func (r *RestServiceImpl) Post(ctx context.Context, message *StringMessage) (*StringMessage, error) { return &StringMessage{Value: "Post hi:" + message.Value + "@"}, nil } func main() { grpcServer := grpc.NewServer() RegisterRestServiceServer(grpcServer, new(RestServiceImpl)) lis, _ := net.Listen("tcp", ":5000") grpcServer.Serve(lis) }

5. 注册路由处理函数并启动Web服务

注册路由处理函数之后就可以启动 Web 服务了:

func main() { ctx := context.Background() ctx, cancel := context.WithCancel(ctx) defer cancel() mux := runtime.NewServeMux() err := RegisterRestServiceHandlerFromEndpoint( ctx, mux, "localhost:5000", []grpc.DialOption{grpc.WithInsecure()}, ) if err != nil { log.Fatal(err) } http.ListenAndServe(":8080", mux) }

6. 测试REST接口

当 gRPC 和 REST 服务全部启动之后,就可以用 curl 请求 REST 服务了:

$ curl localhost:8080/get/gopher {"value":"Get: gopher"} $ curl localhost:8080/post -X POST --data '{"value":"grpc"}' {"value":"Post: grpc"}

生成Swagger文档

在对外公布 REST 接口时,我们一般还会提供一个 Swagger 格式的文件用于描述这个接口规范。

$ go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger $ protoc -I. \ -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ --swagger_out=. \ hello.proto

然后会生成一个 hello.swagger.json 文件。这样的话就可以通过 swagger-ui 这个项目,在网页中提供 REST 接口的文档和测试等功能。

总结

通过grpc-gateway,我们可以轻松地为gRPC服务提供RESTful接口,实现前后端的便捷交互。本文介绍的方法是《Go语言高级编程》中推荐的最佳实践,更多详细内容可以参考书籍中的ch4-rpc/ch4-06-grpc-ext.md章节。

如果你想深入学习gRPC网关开发,可以克隆项目仓库进行实践:https://gitcode.com/gh_mirrors/ad/advanced-go-programming-book

【免费下载链接】advanced-go-programming-book:books: 《Go语言高级编程》开源图书,涵盖CGO、Go汇编语言、RPC实现、Protobuf插件实现、Web框架实现、分布式系统等高阶主题(完稿)项目地址: https://gitcode.com/gh_mirrors/ad/advanced-go-programming-book

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询