下面我将详细讲解 "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/binprotoc-gen-goprotoc-gen-go_micro
使用

go-micro 支持通过 proto 文件来定义服务,下面将介绍如何使用 proto 文件定义和生成服务代码。

定义 proto 文件

proto.protouserService
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_out--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)
    }
}
UserServicego-micromicro.NewServiceservice

服务启动后,可以通过以下命令在注册中心注册服务:

$ micro --registry=etcdv3 register --node_id=testNode1 --address=:8080 --name=userService --version=latest

至此,我们已经讲解了 "go micro微服务proto开发安装及使用规则" 的完整攻略,希望对你有所帮助。