1。介绍在前面的文章中,我们介绍了protobuf和grpc。在这篇文章中,我们介绍如何使用grpc开发一个“分布式系统”。这里用引号是因为分布式系统是一个很大的概念。在这篇文章中,我们首先介绍在分布式系统中使用grpc开发服务。grpc是google开源的rpc框架,使用grpc可以方便的开发rpc服务;protobuf是一种接口设计语言(IDL),grpc框架使用的IDL就是protobuf。如果有不了解protobuf和grpc的读者,建议先阅读前面的文章。本文介绍使用grpc开发一个实战项目——ToDoList,目的是帮助读者朋友熟悉项目开发流程,实战项目包括服务端服务和客户端服务。服务端主要负责数据操作,客户端主要负责业务逻辑处理。2.server首先我们创建proto目录,创建proto文件,编写protobuf,设计项目的服务,然后创建pb目录,使用protoc编译我们写的proto文件,生成pb文件。然后,我们创建服务目录,在生成的pb文件中写入接口定义的方法。最后,我们创建grpc服务器。服务器目录。├──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";optiongo_package="./todoPb";serviceToDoList{rpcCreateToDoList(ToDoListDetail)returns(CreateToDoListResult){}rpcReadToDoList(ToDoListPage)returns(ReadToDoListByPage){}}messageToDoListDetail{//@inject_tag:form:"id"xorm:"'id'notnullpkautoincr"int64id=1;...完整代码请参考github。生成pb文件接下来,我们使用protoc编译proto文件,生成pb文件。如何使用protoc编译proto文件,在之前的文章中已经详细介绍过了。限于篇幅,本文不再赘述。编译命令如下: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文件中实现接口定义的方法。...typeToDoListstruct{pb.UnimplementedToDoListServer}func(t*ToDoList)CreateToDoList(ctxcontext.Context,in*pb.ToDoListDetail)(*pb.CreateToDoListResult,error){log.Printf("id:%dcontent:%vdatetime:%d\n",in.GetId(),in.GetContent(),in.GetDatetime())记录,err:=dao.Add(ctx,in)data:=&pb.CreateToDoListResult{Record:record}returndata,err}...阅读上面的代码,我们可以发现我们在dao包中设计了与数据库操作相关的代码。在服务中,通过调用dao包的方法来操作数据库。此外,服务中还可以调用其他数据操作组件。完整代码请参考github。创建一个gRPC服务器写好服务代码后,我们创建一个grpc服务器并注册服务。...server:=grpc.NewServer()pb.RegisterToDoListServer(server,new(service.ToDoList))...完整代码参考github。以上就是使用grpc创建rpc服务的大致流程。在生产环境项目中,需要完善一些公共方法,如配置文件读取、错误码定义、参数校验等,为了方便读者理解,本实际项目中不涉及这部分内容。有兴趣的读者可以自己尝试实现这部分。3.clientclient主要负责业务逻辑。本文介绍的实战项目使用了gin框架来实现路由。通常,clientservice的pb文件复制了server服务生成的pb文件。首先我们创建controller目录,调用server服务方法,然后使用gin框架设计路由。客户端目录├──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复制serverservice生成的pb文件客户端直接复制server服务生成的pb文件,不需要写一个proto文件,然后用protoc编译proto文件生成pb文件。编写controller代码,调用server服务的方法在controller目录下创建go文件,编写controller方法,并创建client,使用创建的client调用server服务的方法。funcCreateToDoList(ctx*gin.Context){...cc:=NewToDoListClient()deferfunc(){err:=cc.Close()iferr!=nil{log.Fatalf("conncloseerror=%v",err)}}()cli:=pb.NewToDoListClient(cc)ctx1,cancel:=context.WithTimeout(context.Background(),time.Second)defercancel()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开发服务。阅读本文后,读者可以了解使用grpc开发服务的大致开发流程。推荐有兴趣的读者在项目中实现用户服务的代码编写。
