下面我将详细讲解 "go micro微服务proto开发安装及使用规则" 的完整攻略。
什么是 go micro
go-micro 是一套微服务框架,使用 Go 编程语言实现,简化了构建复杂分布式系统的过程。它封装了服务注册与发现、负载均衡、消息传递、服务治理、数据传输等基本功能,让开发人员可以更加专注于业务逻辑的实现。此外,go-micro 还支持多种协议和编解码器,后续还会支持更多的协议和插件模式。
proto
proto 是 Google 开源的一种语言中立、平台中立、可扩展的序列化数据的方式。它可以快速高效地生成各种语言的数据访问代码,支持跨语言的数据交互,因此在微服务架构中使用广泛。protobuf 通过 .proto 文件来描述数据结构和服务,然后通过 protoc 工具生成各个语言的代码。
安装
首先需要安装 protobuf 和 protoc 编译器。可以从以下链接下载适合自己系统的版本:
安装后,可以执行以下命令检查版本号是否正确:
$ protoc --version
libprotoc 3.15.8
接下来需要安装 go 的插件。可以使用 Go Modules 来管理项目依赖,命令如下:
$ go get github.com/golang/protobuf/proto
$ go get github.com/golang/protobuf/protoc-gen-go
$ go get github.com/micro/micro/v2/cmd/protoc-gen-go_micro
安装成功后,可以在 $GOPATH/bin
目录下找到 protoc-gen-go
和 protoc-gen-go_micro
这两个可执行文件。
使用
go-micro 支持通过 proto 文件来定义服务,下面将介绍如何使用 proto 文件定义和生成服务代码。
定义 proto 文件
首先,需要在项目的根目录下创建一个名为 proto
的目录,并在该目录下创建 .proto
格式的文件,以便定义服务的数据类型和方法。例如,我们可以定义一个 userService
服务,如下所示:"
syntax = "proto3";
// 定义包名和所在Go包的uri
package userService;
option go_package = "github.com/username/project/proto/userService";
// 需要依赖的其它proto文件
import "google/api/annotations.proto";
import "github.com/micro/go-micro/v2/proto/service.proto";
// 定义一个用户信息
message User {
int64 id = 1;
string name = 2;
string email = 3;
}
// 定义用户服务
service UserService {
// 注册
rpc Register(User) returns (RegisterResponse) {
option (google.api.http) = {
post: "/register"
body: "*"
};
}
// 获取用户列表
rpc ListUsers(ListUsersRequest) returns (ListUsersResponse) {}
}
// 注册返回信息
message RegisterResponse {
int64 ret_code = 1;
string ret_msg = 2;
}
// 获取用户列表请求信息
message ListUsersRequest {
int64 page = 1;
int64 page_size = 2;
}
// 获取用户列表返回信息
message ListUsersResponse {
repeated User users = 1;
int64 total_count = 2;
}
生成 go 代码
执行以下命令生成 go 代码:
$ protoc --proto_path=proto \
--go_out=plugins=grpc:. \
--go_opt=paths=source_relative \
--go_micro_out=. \
--go_micro_opt=paths=source_relative \
proto/*.proto
该命令将在 proto
目录下查找所有 .proto
文件,并生成相应的 go 代码。其中 --go_out
参数指定生成的代码类型为 grpc,--go_opt
参数指定编译器使用相对路径。
在服务中使用
现在,可以在 Go 中使用生成的代码来编写服务。代码示例:
package main
import (
"context"
"log"
"github.com/micro/go-micro/v2"
pb "github.com/username/project/proto/userService"
)
type userServiceHandler struct{}
func (s *userServiceHandler) Register(ctx context.Context, req *pb.User, rsp *pb.RegisterResponse) error {
log.Printf("Got user id: %d, name: %s, email: %s\n", req.GetId(), req.GetName(), req.GetEmail())
rsp.RetCode = 0
rsp.RetMsg = "ok"
return nil
}
func (s *userServiceHandler) ListUsers(ctx context.Context, req *pb.ListUsersRequest, rsp *pb.ListUsersResponse) error {
log.Printf("Got request: page=%d, page_size=%d\n", req.GetPage(), req.GetPageSize())
u1 := &pb.User{
Id: 1,
Name: "Tom",
Email: "tom@example.com",
}
u2 := &pb.User{
Id: 2,
Name: "Jerry",
Email: "jerry@example.com",
}
rsp.Users = append(rsp.Users, u1)
rsp.Users = append(rsp.Users, u2)
rsp.TotalCount = 2
return nil
}
func main() {
service := micro.NewService(micro.Name("userService"))
service.Init()
pb.RegisterUserServiceHandler(service.Server(), new(userServiceHandler))
if err := service.Run(); err != nil {
log.Fatalf("Failed to run: %v", err)
}
}
在该示例中,我们实现了 UserService
接口的两个方法,并使用 go-micro
框架的 micro.NewService
函数来创建一个微服务 service
对象。
服务启动后,可以通过以下命令在注册中心注册服务:
$ micro --registry=etcdv3 register --node_id=testNode1 --address=:8080 --name=userService --version=latest
至此,我们已经讲解了 "go micro微服务proto开发安装及使用规则" 的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:go micro微服务proto开发安装及使用规则 - Python技术站