用go-micro搭建基础微服务最省事:v2版本为稳定起点,三步初始化服务,mdns适合开发,etcd用于生产,需注意版本兼容与配置细节,proto定义接口并生成stub,注册成功需验证etcd数据。
go-micro 是目前 Golang 生态中对新手最友好的微服务开发框架,它把服务注册、发现、RPC 调用、编解码这些底层逻辑封装成可插拔组件,不用自己手写 etcd client 或 gRPC server。但注意:v2+ 版本已转向模块化设计,github.com/micro/go-micro/v2 是稳定起点,别用 v3(还在 alpha 阶段且 API 不稳定)。
初始化一个服务只需三步:
micro new hello 生成项目骨架(需提前装好 micro CLI 工具)main.go 中调用 service.Init() 和 service.Run()
handle
r/hello.go 里的 Hello.Call 方法注册为 RPC handler默认使用 mdns 做本地服务发现,适合开发阶段——不用起 etcd,改代码后直接 go run main.go 就能被其他服务看到。
mdns 只支持局域网广播,跨机器或容器部署必须换注册中心。etcd 是最常用选择,go-micro 对它有原生支持,但要注意版本兼容性:v2 默认适配 etcd v3 API,但不支持 etcd v3.5+ 的 gRPC gateway 认证方式。
立即学习“go语言免费学习笔记(深入)”;
启动 etcd 后,在服务初始化时显式指定注册中心:
import "github.com/micro/go-micro/v2/registry/etcd"
func main() {
r := etcd.NewRegistry(func(options *registry.Options) {
options.Addrs = []string{"http://127.0.0.1:2379"}
})
service := micro.NewService(
micro.Name("go.micro.srv.hello"),
micro.Registry(r),
)
service.Init()
// ...
}
常见错误:
registry: register node: context deadline exceeded → etcd 地址写成 http://localhost:2379(Docker 容器内无法解析 localhost)401 Unauthorized → 没关掉 etcd 的 auth 模式,或没传 Username/Password 参数go-micro 默认用 Protobuf 做序列化和接口契约,不是可选项——哪怕你只传 map,底层也会转成 protobuf 编码。所以必须写 .proto 文件,并用 protoc 生成 Go 代码。
例如定义 hello.proto:
syntax = "proto3";
package hello;
service Hello {
rpc Call(Request) returns (Response) {}
}
message Request {
string name = 1;
}
message Response {
string msg = 1;
}
生成命令(需安装 protoc-gen-go 和 protoc-gen-micro):
protoc --go_out=plugins=micro:. --micro_out=. hello.proto
生成的 hello.pb.go 里会包含 HelloService 接口,客户端直接 new 一个就能调用:
client := hello.NewHelloService("go.micro.srv.hello", service.Client())
rsp, err := client.Call(context.TODO(), &hello.Request{Name: "John"})
注意:NewHelloService 第二个参数必须是 service.Client(),不是 micro.Client()——后者不会自动走服务发现。
服务跑起来不代表注册成功。最直接的验证方式是查 etcd 数据:
ETCDCTL_API=3 etcdctl --endpoints=http://127.0.0.1:2379 get /micro/ --prefix --keys-only
如果看到类似 /micro/go.micro.srv.hello/192.168.1.100:59257 的 key,说明注册成功。否则检查:
Registering node: go.micro.srv.hello-192.168.1.100:59257
http://127.0.0.1:2379(不是 127.0.0.1:2379 加了 https)另一个容易被忽略的点:go-micro 的 registry 默认 30 秒续租一次,如果服务卡住或 GC 停顿太久,etcd 会自动剔除该节点——调试时别只看第一次注册结果。