如何使用Go-Micro和Gin进行Golang语言开发微服务?
01
简介
Go Micro 是一个分布式系统开发框架。 Go Micro提供了分布式系统开发的核心需求,包括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。至于如何安装,读者朋友可以参考官方文档。我们在之前的文章中也介绍过。由于篇幅限制,本文不再赘述。
其实我们可以使用Go Micro工具集以命令的形式快速生成模板文件,但由于本文不介绍工具集的相关内容,所以我们采用手动创建文件的方法。
现在正式介绍如何构建服务,包括服务器端服务和客户端服务。
服务器端
服务器端代码目录:
├── go.mod
├── go.sum
├── handler
│ └── user
│ └── user.go
├── main.go
└── proto
└── user
├── user.pb.go
├── user.pb.micro.go
└── user.proto
构建服务器端服务分为以下步骤:
- 编写protobuf文件
├── go.mod ├── go.sum ├── handler │ └── user │ └── user.go ├── main.go └── proto └── user ├── user.pb.go ├── user.pb.micro.go └── user.proto
第一步是组合文件,protouf包Protobuf文件存储在单独的文件目录中。
文件路径:
proto/user/user.proto
syntax = "proto3"; package user; service User { rpc Login(LoginRequest) returns (LoginResponse) {} } message LoginRequest { string email = 1; string password = 2; } message LoginResponse { string username = 1; }
阅读上面的代码,我们在定义的
user.proto文件中创建了一个rpc服务。
- 生成文件
第二步是生成文件。使用命令:
protoc --proto_path=. --micro_out=. --go_out=. user.proto
执行上述命令会自动生成两个文件,分别是
user.pb.go
和user.micro.go
。阅读
user.micro.go
文件,可以看到该文件中自动生成了客户端和服务端代码。 - 编写Handler
第三步是编写服务器端Handler代码。
文件路径:
handler/user/user.go
type User struct{} func (u *User) Login(ctx context.Context, req *protoUser.LoginRequest, rsp *protoUser.LoginResponse) error { if req.Email != "gopher@88.com" || req.Password != "123456" { rsp.Username = "Sorry " + req.Email return nil } rsp.Username = "Welcome " + req.Email return nil }
- 定义服务器服务
第四步,定义服务器服务。需要注意的是,这里使用的是grpc。在
main.go
文件中写入以下代码:文件路径:
main.go
func main() { // 创建服务 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)) if err !=nil { log.Fatal(err) } // 运行服务 if err = service.Run(); err != nil { log.Fatal(err) } }
完成以上4步后,我们就实现了服务器cp页面。接下来我们开始编写客户端代码。 ?生成文件的目的是保证服务器和客户端之间的类型一致性。
第二步定义客户端:
文件路径:router/v1/user.go
func NewUserClient() protoUser.UserService {
// 创建服务
service := grpc.NewService()
// 创建客户端
userClient := protoUser.NewUserService("go.micro.srv.demo", service.Client())
return userClient
}
文件路径:router/v1/user.go
client := NewUserClient()
// rpc 调用远程服务的方法
resp, err := client.Login(context.TODO(), &protoUser.LoginRequest{Email: param.Email, Password: param.Password})
if err != nil {
fmt.Println(err)
}
完成上面3步之后,我们基本上就写完了客户端代码。
03
Gin 和 Go-Micro 的集成
接下来我们介绍如何集成 Gin 和 Go-Micro。这部分代码也在客户端,一共需要两步。 ?而go-micro,启动服务端服务和客户端服务后,我们可以使用如下命令来运行cURL测试:
curl --location --request POST '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来进行cURL测试构建微服务,以及如何集成Gin和Go-Micro并没有介绍Gin和Go-Micro的使用。如果读者的朋友不了解Gin和Go-Micro,建议先阅读Gin和Go-Micro的官方文档。您也可以参考公众号之前发表的有关杜松子酒的文章。
参考资料:
https://github.com/asim/go-micro
https://gin-gonic.com/zh-cn/docs/introduction/
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。