Golang 语言编写 gRPC 实战项目

本文我们介绍怎么使用 grpc 开发“分布式系统”。这里使用引号是因为分布式系统是一个大概念,本文我们先介绍使用 grpc 开发分布式系统中的 service。 2021-09-26 10:20:06 开发Golang代码 详解 Cookie 新增的 SameParty 属性 各大主流浏览器正在逐步禁用 三方Cookie ,之前笔者也在下面这篇文章中分析了全面禁用 三方Cookie 后对我们的网站带来的一些影响。

本文我们介绍怎么使用 grpc 开发“分布式系统”。这里使用引号是因为分布式系统是一个大概念,本文我们先介绍使用 grpc 开发分布式系统中的 service。

[[425759]]

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 目录

  1. .
  2. ├──dao
  3. │├──mysql.go
  4. │└──toDoList.go
  5. ├──main.go
  6. ├──pb
  7. │├──todoPb
  8. ││├──toDoList.pb.go
  9. ││└──toDoList_grpc.pb.go
  10. │└──userPb
  11. │├──user.pb.go
  12. │└──user_grpc.pb.go
  13. ├──proto
  14. │├──toDoList.proto
  15. │└──user.proto
  16. └──service
  17. └──toDoList.go

编写 proto 文件

读者朋友们如果还不熟悉 protobuf,建议翻阅之前介绍 protobuf 的文章,限于篇幅,本文不再赘述。示例代码如下:

  1. syntax="proto3";
  2. optiongo_package="./todoPb";
  3. serviceToDoList{
  4. rpcCreateToDoList(ToDoListDetail)returns(CreateToDoListResult){}
  5. rpcReadToDoList(ToDoListPage)returns(ReadToDoListByPage){}
  6. }
  7. messageToDoListDetail{
  8. //@inject_tag:form:"id"xorm:"'id'notnullpkautoincr"
  9. int64id=1;
  10. ...

完整代码,请查阅 github。

生成 pb 文件

接着,我们使用 protoc 编译 proto 文件,生成 pb 文件,关于怎么使用 protoc 编译 proto 文件,在之前的文章已经详细介绍,限于篇幅,本文不再赘述,编译命令如下:

  1. protoc--go_out=./pb--go-grpc_out=./pbproto/*&&protoc-go-inject-tag-XXX_skip=xorm-input=./pb/todoPb/toDoList.pb.go

执行以上命令,将在 pb 目录中自动生成 pb 文件。

编写接口定义的方法

至此,我们开始编写 golang 代码,在 service 目录中创建 go 文件,实现生成的 pb 文件中接口定义的方法。

  1. ...
  2. typeToDoListstruct{
  3. pb.UnimplementedToDoListServer
  4. }
  5. func(t*ToDoList)CreateToDoList(ctxcontext.Context,in*pb.ToDoListDetail)(*pb.CreateToDoListResult,error){
  6. log.Printf("id:%dcontent:%vdatetime:%d\n",in.GetId(),in.GetContent(),in.GetDatetime())
  7. record,err:=dao.Add(ctx,in)
  8. data:=&pb.CreateToDoListResult{Record:record}
  9. returndata,err
  10. }
  11. ...

阅读上面这段代码,可以发现我们把数据库操作相关代码设计在 dao 包中。service 中通过调用 dao 包的方法操作数据库,另外,其他数据操作组件也可以在 service 中调用。

完整代码,请查阅 github。

创建 gRPC 服务器

在完成 service 代码编写之后,我们创建 grpc server,然后注册服务。

  1. ...
  2. server:=grpc.NewServer()
  3. pb.RegisterToDoListServer(server,new(service.ToDoList))
  4. ...

完整代码,请查阅 github。

以上就是使用 grpc 创建 rpc service 的一般流程,在生产环境项目中,还需要完善一些公共方法,比如配置文件读取、错误码定义、参数验证等。为了读者朋友们容易理解,该实战项目中未涉及这部分内容,感兴趣的读者朋友们可以尝试自己实现该部分内容。

3、client

client 主要负责业务逻辑,本文介绍的实战项目使用 gin 框架实现路由。通常,client service 的 pb 文件拷贝 server service 生成的 pb 文件。

首先,我们创建 controller 目录,调用 server service 的方法,然后,使用 gin 框架设计路由。

client 目录

  1. .
  2. ├──controller
  3. │└──toDoList.go
  4. ├──main.go
  5. ├──pb
  6. │├──todoPb
  7. ││├──toDoList.pb.go
  8. ││└──toDoList_grpc.pb.go
  9. │└──userPb
  10. │├──user.pb.go
  11. │└──user_grpc.pb.go
  12. └──router
  13. └──router.go

拷贝 serverservice生成的 pb 文件

client 直接拷贝 server service 生成的 pb 文件,不需要编写 proto 文件,然后使用 protoc 编译 proto 文件,生成 pb 文件。

编写 controller 代码,调用 server service的方法

在 controller 目录中创建 go 文件,编写 controller 方法,并创建客户端,使用创建的客户端调用 server service 的方法。

  1. funcCreateToDoList(ctx*gin.Context){
  2. ...
  3. cc:=NewToDoListClient()
  4. deferfunc(){
  5. err:=cc.Close()
  6. iferr!=nil{
  7. log.Fatalf("conncloseerror=%v",err)
  8. }
  9. }()
  10. cli:=pb.NewToDoListClient(cc)
  11. ctx1,cancel:=context.WithTimeout(context.Background(),time.Second)
  12. defercancel()
  13. res,err:=cli.CreateToDoList(ctx1,param)
  14. ...

完整代码,请查阅 github。

创建 gin 路由

编写完 controller 之后,创建 router 目录,在 router 目录中创建 gin 路由,用于访问 controller 中的方法。

  1. ...
  2. r:=gin.Default()
  3. apiV1:=r.Group("/v1")
  4. todolist:=apiV1.Group("/todolist")
  5. {
  6. todolist.POST("/add",controller.CreateToDoList)
  7. ...

完整代码,请查阅 github。

4、总结

本文我们介绍了怎么使用 grpc 开发 service。读者朋友们阅读完本文,可以了解使用 grpc 开发 service 的一般开发流程,建议感兴趣的读者朋友们,实现项目中 user service 的代码编写。

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月5日 18:24
下一篇 2023年5月5日 18:24

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信