Skip to content

go micro

go-micro 是一个插件化的微服务框架,提供了分布式系统开发的核心功能。以下是 go-micro 的常见用法,包括环境设置、服务开发、注册与发现、负载均衡以及插件使用等。


1. 安装与初始化

安装 Go-Micro

确保你已经安装了 Go 和 protoc 编译器。

bash
go install github.com/go-micro/micro/v4/cmd/micro@latest
go get github.com/go-micro/micro/v4

2. 创建一个简单的微服务

以下是一个简单服务的示例,展示如何使用 go-micro 开发服务。

服务定义

go
package main

import (
	"context"
	"fmt"

	"github.com/go-micro/micro/v4"
	proto "github.com/go-micro/micro/v4/examples/service/proto"
)

// 定义服务实现
type Greeter struct{}

// 实现 SayHello 方法
func (g *Greeter) SayHello(ctx context.Context, req *proto.Request, rsp *proto.Response) error {
	rsp.Msg = "Hello, " + req.Name
	return nil
}

func main() {
	// 创建服务
	service := micro.NewService(
		micro.Name("greeter"),
	)

	// 初始化服务
	service.Init()

	// 注册服务处理器
	proto.RegisterGreeterHandler(service.Server(), new(Greeter))

	// 运行服务
	if err := service.Run(); err != nil {
		fmt.Println(err)
	}
}

服务端解释

  1. micro.NewService 创建服务实例,指定服务名称为 greeter
  2. 注册 Greeter 处理器,绑定到 proto 定义的接口。
  3. 调用 service.Run() 启动服务。

3. 调用服务

在另一个服务或客户端调用 greeter 服务。

客户端代码

go
package main

import (
	"context"
	"fmt"

	"github.com/go-micro/micro/v4"
	proto "github.com/go-micro/micro/v4/examples/service/proto"
)

func main() {
	// 创建服务
	service := micro.NewService(micro.Name("client"))
	service.Init()

	// 创建 Greeter 客户端
	greeter := proto.NewGreeterService("greeter", service.Client())

	// 调用 SayHello 方法
	resp, err := greeter.SayHello(context.TODO(), &proto.Request{Name: "Alice"})
	if err != nil {
		fmt.Println(err)
		return
	}

	// 打印响应
	fmt.Println(resp.Msg)
}

4. 使用 Protobuf 定义服务

使用 Protocol Buffers 定义服务接口和消息结构。

定义 .proto 文件

greeter.proto:

proto
syntax = "proto3";

package greeter;

// 服务定义
service Greeter {
  rpc SayHello(Request) returns (Response);
}

// 请求消息
message Request {
  string name = 1;
}

// 响应消息
message Response {
  string msg = 1;
}

生成代码

安装 protoc 插件:

bash
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

生成代码:

bash
protoc --go_out=. --go-grpc_out=. greeter.proto

5. 服务发现与注册

go-micro 支持多种服务注册中心(如 Consul、etcd)。

使用 Consul

  1. 安装 Consul:
    bash
    brew install consul
  2. 启动 Consul:
    bash
    consul agent -dev
  3. 配置服务: 在 micro.NewService() 中添加 Registry
    go
    import "github.com/go-micro/plugins/v4/registry/consul"
    
    service := micro.NewService(
        micro.Name("greeter"),
        micro.Registry(consul.NewRegistry()),
    )

6. 中间件与插件

中间件

可以通过 micro.WrapHandler 添加全局中间件。例如记录每个请求的日志:

go
import (
	"context"
	"fmt"
	"github.com/go-micro/micro/v4/server"
)

func logWrapper(fn server.HandlerFunc) server.HandlerFunc {
	return func(ctx context.Context, req server.Request, rsp interface{}) error {
		fmt.Println("Request received:", req.Endpoint())
		return fn(ctx, req, rsp)
	}
}

service := micro.NewService(
    micro.Name("greeter"),
    micro.WrapHandler(logWrapper),
)

插件系统

go-micro 支持插件化,以下是常见插件的使用。

  1. 服务注册 使用 etcd 替代 Consul:

    bash
    go get github.com/go-micro/plugins/v4/registry/etcd

    配置 etcd 注册:

    go
    import "github.com/go-micro/plugins/v4/registry/etcd"
    
    service := micro.NewService(
        micro.Registry(etcd.NewRegistry()),
    )
  2. 消息队列 使用 NATS 作为消息代理:

    bash
    go get github.com/go-micro/plugins/v4/broker/nats

    配置 NATS:

    go
    import "github.com/go-micro/plugins/v4/broker/nats"
    
    service := micro.NewService(
        micro.Broker(nats.NewBroker()),
    )
  3. 分布式追踪 使用 Jaeger 集成:

    bash
    go get github.com/go-micro/plugins/v4/wrapper/trace/opentracing

    配置 Jaeger:

    go
    import "github.com/go-micro/plugins/v4/wrapper/trace/opentracing"
    
    service := micro.NewService(
        micro.WrapHandler(opentracing.NewHandlerWrapper()),
    )

7. 负载均衡与重试

负载均衡

go-micro 内置了客户端负载均衡策略,可以通过配置自定义策略:

go
service := micro.NewService(
    micro.Name("client"),
    micro.Selector(selector.NewSelector(
        selector.SetStrategy(selector.RoundRobin),
    )),
)

重试机制

配置客户端调用的重试次数和超时时间:

go
service := micro.NewService(
    micro.Name("client"),
    micro.Retry(retry.NewRetry(retry.Max(3))),
)

8. 运行服务

  1. 启动注册中心(如 Consul 或 etcd)。
  2. 运行服务:
    bash
    go run server.go
  3. 启动客户端:
    bash
    go run client.go

9. 总结

go-micro 是一个功能强大的微服务框架,支持插件化扩展,适合开发分布式系统。主要特点:

  • 核心功能:服务注册、发现、负载均衡等。
  • 插件支持:可用插件拓展能力。
  • 跨协议支持:支持 gRPC、HTTP 等协议。

如果有更多具体需求或疑问,可以随时交流!