当前位置: 首页 > 科技观察

Golang语言如何使用go-micro和gin开发微服务?

时间:2023-03-13 02:38:26 科技观察

01简介GoMicro是一个分布式系统开发框架。GoMicro提供了分布式系统开发的核心需求,包括RPC和事件驱动通信。Gin是一个用Golang编写的Web框架。本文首先介绍如何使用go-micro和go-grpc构建微服务,然后介绍如何集成gin和go-micro。我们使用的go-micro版本是v1.18.0,golang版本是v1.13,gin版本是v1.7.2。02使用go-micro和go-grpc搭建微服务在开始使用go-micro之前,我们还需要提前做一些准备工作。安装protoc、protoc-gen-go和protoc-gen-micro。读者朋友们可以参考官方文档进行安装。我们在之前的文章中也有介绍过。限于篇幅,本文不再赘述。其实我们可以使用GoMicro工具集以命令的形式快速生成模板文件,但是由于本文不打算介绍工具集的相关内容,所以我们采用手动创建文件的方式。下面我们正式开始介绍如何搭建服务,包括服务端服务和客户端服务。服务器服务器代码目录:├──go.mod├──go.sum├──handler│└──user│└──user.go├──main.go└──proto└──user├──user.pb.go├──user.pb.micro.go└──user.proto构建服务端,分为以下几个步骤:编写protobuf文件第一步是编写protobuf文件,它将一般将不同包的protobuf文件存放在单独的文件目录下。文件路径:proto/user/user.protosyntax="proto3";packageuser;serviceUser{rpcLogin(LoginRequest)returns(LoginResponse){}}messageLoginRequest{stringemail=1;stringpassword=2;}messageLoginResponse{stringusername=1;}read在上面的代码中,我们在定义的user.proto文件中创建了一个rpc服务。生成文件的第二步是生成文件。使用命令:protoc--proto_path=.--micro_out=.--go_out=.user.proto执行上面的命令,会自动生成两个文件,分别是user.pb.go和user.micro.go。阅读user.micro.go文件,可以发现该文件中已经自动生成了客户端和服务端的代码。编写处理程序第三步是在服务器端编写处理程序代码。文件路径:handler/user/user.gotypeUserstruct{}func(u*User)Login(ctxcontext.Context,req*protoUser.LoginRequest,rsp*protoUser.LoginResponse)error{ifreq.Email!="gopher@88.com"||req.Password!="123456"{rsp.Username="Sorry"+req.Emailreturnnil}rsp.Username="Welcome"+req.Emailreturnnil}定义服务器服务第四步定义服务器服务,你需要注意这里使用了grpc。在main.go文件中写入如下代码:文件路径:main.gofuncmain(){//创建服务service:=grpc.NewService(micro.Name("go.micro.srv.demo"),micro.Version("v0.0.0"),micro.RegisterTTL(time.Second*10),micro.RegisterInterval(time.Second*5),)//注册处理器err:=protoUser.RegisterUserHandler(service.Server(),new(user.User))iferr!=nil{log.Fatal(err)}//运行服务iferr=service.Run();err!=nil{log.Fatal(err)}}完成以上4步后,我们将服务端rpc服务实现。接下来,我们开始编写客户端代码。client客户端代码目录:├──go.mod├──go.sum├──main.go├──proto│└──user│├──user.pb.go│├──user.pb.micro.go│└──user.proto└──router├──router.go└──v1└──user.go构建客户端服务,分为以下几个步骤:复制proto文件,生成文件第一步是复制服务端的proto文件和生成文件,保证服务端和客户端的类型一致。定义客户端服务第二步定义客户端:文件路径:router/v1/user.gofuncNewUserClient()protoUser.UserService{//创建服务service:=grpc.NewService()//创建客户端userClient:=protoUser.NewUserService("go.micro.srv.demo",service.Client())returnuserClient}rpc调用远程服务的方法第三步是rpc调用远程服务的方法:文件路径:router/v1/user。goclient:=NewUserClient()//rpc调用远程服务方法resp,err:=client.Login(context.TODO(),&protoUser.LoginRequest{Email:param.Email,Password:param.Password})iferr!=nil{fmt.Println(err)}完成以上3步,客户端代码就基本写完了。03Gin和go-micro集成接下来介绍如何集成gin和go-micro。这部分代码也在客户端,需要两步。创建路由文件路径:router/router.gofuncNewRouter()*gin.Engine{r:=gin.New()userControllerV1:=new(v1.User)//路由组v1:=r.Group("/v1"){v1.Use(gin.Logger(),gin.Recovery())userV1:=v1.Group("/user"){userV1.POST("/login",userControllerV1.Login)}}returnr}开始(监听)服务文件路径:main.gofuncmain(){r:=router.NewRouter()server:=&http.Server{Addr:":8080",Handler:r,ReadTimeout:time.Second*10,WriteTimeout:time.Second*10,MaxHeaderBytes:1<<20,}iferr:=server.ListenAndServe();err!=nil{log.Fatal(err)}}至此我们完成了gin和go-micro的集成,并启动服务clientservice和clientservice后,我们可以使用如下命令进行cURL测试:curl--location--requestPOST'http://127.0.0.1:8080/v1/user/login'\--header'Content-Type:application/json'\--data-raw'{"email":"gopher@88.com","password":"123456"}'04总结本文主要介绍如何使用go-micro和go-grpc构建微服务,以及如何集成gin和go-micro,不介绍如何使用gin和go-micro。如果读者不了解gin和go-micro,建议先阅读官方的gin和go-micro。文档,也可以参考之前公众号推的gin的文章