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/v42. 创建一个简单的微服务
以下是一个简单服务的示例,展示如何使用 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)
}
}服务端解释
micro.NewService创建服务实例,指定服务名称为greeter。- 注册
Greeter处理器,绑定到proto定义的接口。 - 调用
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.proto5. 服务发现与注册
go-micro 支持多种服务注册中心(如 Consul、etcd)。
使用 Consul
- 安装 Consul:bash
brew install consul - 启动 Consul:bash
consul agent -dev - 配置服务: 在
micro.NewService()中添加Registry:goimport "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 支持插件化,以下是常见插件的使用。
服务注册 使用 etcd 替代 Consul:
bashgo get github.com/go-micro/plugins/v4/registry/etcd配置 etcd 注册:
goimport "github.com/go-micro/plugins/v4/registry/etcd" service := micro.NewService( micro.Registry(etcd.NewRegistry()), )消息队列 使用 NATS 作为消息代理:
bashgo get github.com/go-micro/plugins/v4/broker/nats配置 NATS:
goimport "github.com/go-micro/plugins/v4/broker/nats" service := micro.NewService( micro.Broker(nats.NewBroker()), )分布式追踪 使用 Jaeger 集成:
bashgo get github.com/go-micro/plugins/v4/wrapper/trace/opentracing配置 Jaeger:
goimport "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. 运行服务
- 启动注册中心(如 Consul 或 etcd)。
- 运行服务:bash
go run server.go - 启动客户端:bash
go run client.go
9. 总结
go-micro 是一个功能强大的微服务框架,支持插件化扩展,适合开发分布式系统。主要特点:
- 核心功能:服务注册、发现、负载均衡等。
- 插件支持:可用插件拓展能力。
- 跨协议支持:支持 gRPC、HTTP 等协议。
如果有更多具体需求或疑问,可以随时交流!