您现在的位置是:亿华云 > 数据库
Golang 语言编写 gRPC 实战项目
亿华云2025-10-08 23:27:33【数据库】3人已围观
简介1、介绍在之前的几篇文章中,我们介绍了 protobuf 和 grpc,本文我们介绍怎么使用 grpc 开发“分布式系统”。这里使用引号是因为分布式系统是一个大概念,本文我们先介绍使用 grpc 开发
1、编写介绍
在之前的实战几篇文章中,我们介绍了 protobuf 和 grpc,项目本文我们介绍怎么使用 grpc 开发“分布式系统”。编写这里使用引号是实战因为分布式系统是一个大概念,本文我们先介绍使用 grpc 开发分布式系统中的项目 service。
grpc 是编写 google 开源的 rpc 框架,使用 grpc 可以方便开发 rpc service;protobuf 是实战一种接口设计语言(IDL),grpc 框架使用的项目 IDL 是 protobuf。如果有读者朋友还不了解 protobuf 和 grpc,编写建议先翻阅之前的实战几篇文章。
本文是项目介绍使用 grpc 开发一个实战项目 - ToDoList,目标是编写帮助读者朋友们熟悉项目开发流程,该实战项目包含 server service 和 client service。实战server 主要负责数据操作,项目client 主要负责业务逻辑处理。
2、server
首先,我们创建 proto 目录,并创建 proto 文件,编写 protobuf,设计项目的亿华云计算 service,接着创建 pb 目录,使用 protoc 编译我们编写好的 proto 文件,生成 pb 文件。然后,我们创建 service 目录,编写生成的 pb 文件中接口定义的方法。最后,我们创建 grpc 服务器。
server 目录 . ├── dao │ ├── mysql.go │ └── toDoList.go ├── main.go ├── pb │ ├── todoPb │ │ ├── toDoList.pb.go │ │ └── toDoList_grpc.pb.go │ └── userPb │ ├── user.pb.go │ └── user_grpc.pb.go ├── proto │ ├── toDoList.proto │ └── user.proto └── service └── toDoList.go 编写 proto 文件读者朋友们如果还不熟悉 protobuf,建议翻阅之前介绍 protobuf 的文章,限于篇幅,本文不再赘述。示例代码如下:
syntax = "proto3"; option go_package = "./todoPb"; service ToDoList { rpc CreateToDoList (ToDoListDetail) returns (CreateToDoListResult) { } rpc ReadToDoList (ToDoListPage) returns (ReadToDoListByPage) { } } message ToDoListDetail { // @inject_tag: form:"id" xorm:"id not null pk autoincr" int64 id = 1; ...完整代码,请查阅 github。
生成 pb 文件接着,我们使用 protoc 编译 proto 文件,生成 pb 文件,关于怎么使用 protoc 编译 proto 文件,在之前的文章已经详细介绍,限于篇幅,本文不再赘述,编译命令如下:
protoc --go_out=./pb --go-grpc_out=./pb proto/* && protoc-go-inject-tag -XXX_skip=xorm -input=./pb/todoPb/toDoList.pb.go执行以上命令,将在 pb 目录中自动生成 pb 文件。
编写接口定义的方法至此,我们开始编写 golang 代码,在 service 目录中创建 go 文件,云服务器提供商实现生成的 pb 文件中接口定义的方法。
... type ToDoList struct { pb.UnimplementedToDoListServer } func (t *ToDoList) CreateToDoList(ctx context.Context, in *pb.ToDoListDetail) (*pb.CreateToDoListResult, error) { log.Printf("id: %d content:%v datetime:%d\n", in.GetId(), in.GetContent(), in.GetDatetime()) record, err := dao.Add(ctx, in) data := &pb.CreateToDoListResult{ Record: record} return data, err } ...阅读上面这段代码,可以发现我们把数据库操作相关代码设计在 dao 包中。service 中通过调用 dao 包的方法操作数据库,另外,其他数据操作组件也可以在 service 中调用。
完整代码,请查阅 github。
创建 gRPC 服务器在完成 service 代码编写之后,我们创建 grpc server,然后注册服务。
... server := grpc.NewServer() pb.RegisterToDoListServer(server, new(service.ToDoList)) ...完整代码,请查阅 github。
以上就是使用 grpc 创建 rpc service 的一般流程,在生产环境项目中,还需要完善一些公共方法,比如配置文件读取、错误码定义、参数验证等。为了读者朋友们容易理解,该实战项目中未涉及这部分内容,感兴趣的读者朋友们可以尝试自己实现该部分内容。
3、client
client 主要负责业务逻辑,本文介绍的实战项目使用 gin 框架实现路由。通常,b2b供应网client service 的 pb 文件拷贝 server service 生成的 pb 文件。
首先,我们创建 controller 目录,调用 server service 的方法,然后,使用 gin 框架设计路由。
client 目录 . ├── controller │ └── toDoList.go ├── main.go ├── pb │ ├── todoPb │ │ ├── toDoList.pb.go │ │ └── toDoList_grpc.pb.go │ └── userPb │ ├── user.pb.go │ └── user_grpc.pb.go └── router └── router.go 拷贝 server service 生成的 pb 文件client 直接拷贝 server service 生成的 pb 文件,不需要编写 proto 文件,然后使用 protoc 编译 proto 文件,生成 pb 文件。
编写 controller 代码,调用 server service 的方法在 controller 目录中创建 go 文件,编写 controller 方法,并创建客户端,使用创建的客户端调用 server service 的方法。
func CreateToDoList(ctx *gin.Context) { ... cc := NewToDoListClient() defer func() { err := cc.Close() if err != nil { log.Fatalf("conn close error=%v", err) } }() cli := pb.NewToDoListClient(cc) ctx1, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() res, err := cli.CreateToDoList(ctx1, param) ...完整代码,请查阅 github。
创建 gin 路由编写完 controller 之后,创建 router 目录,在 router 目录中创建 gin 路由,用于访问 controller 中的方法。
... r := gin.Default() apiV1 := r.Group("/v1") todolist := apiV1.Group("/todolist") { todolist.POST("/add", controller.CreateToDoList) ...完整代码,请查阅 github。
4、总结
本文我们介绍了怎么使用 grpc 开发 service。读者朋友们阅读完本文,可以了解使用 grpc 开发 service 的一般开发流程,建议感兴趣的读者朋友们,实现项目中 user service 的代码编写。
很赞哦!(719)