在构建 go-zero 微服务集群时,服务注册与发现是核心基础设施之一。go-zero 默认使用 etcd 作为注册中心,但在许多企业级环境中,Consul 因其完善的服务网格生态和友好的 UI 而被广泛采用。在十三Tech 的实际项目中,我们多次遇到需要替换注册中心的需求。本文将手把手带你完成 go-zero 与 Consul 的集成,覆盖 RPC 服务注册和 API 服务调用两大核心环节。
服务端:RPC 服务注册到 Consul
1. 安装 Consul 注册模块
首先,在 RPC 服务中引入 zero-contrib 提供的 Consul 扩展包:
go get -u github.com/zeromicro/zero-contrib/zrpc/registry/consul
2. 修改 RPC 配置文件
将 etc/*.yaml 中的 etcd 配置注释掉,替换为 Consul 配置:
Name: transform.rpc
ListenOn: 0.0.0.0:8080
#Etcd:
# Hosts:
# - 127.0.0.1:2379
# Key: transform.rpc
Consul:
Host: 127.0.0.1:8500
Key: transform.rpc
Meta:
Protocol: grpc
Tag:
- tag
- rpc
3. 扩展 Config 结构
在 config/config.go 中增加 Consul 配置字段:
package config
import (
"github.com/zeromicro/go-zero/zrpc"
"github.com/zeromicro/zero-contrib/zrpc/registry/consul"
)
type Config struct {
zrpc.RpcServerConf
Consul consul.Conf
}
4. 启动时注册服务
在 main.go 中添加服务注册逻辑:
func main() {
flag.Parse()
var c config.Config
conf.MustLoad(*configFile, &c)
ctx := svc.NewServiceContext(c)
s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
transform.RegisterTransformServer(grpcServer, server.NewTransformServer(ctx))
if c.Mode == service.DevMode || c.Mode == service.TestMode {
reflection.Register(grpcServer)
}
})
defer s.Stop()
// 将服务注册到 Consul
_ = consul.RegisterService(c.ListenOn, c.Consul)
fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
s.Start()
}
服务启动后,即可在 Consul UI 中查看到对应的服务实例:
客户端:API 网关调用 Consul 注册的服务
修改 API 配置文件
在 API 服务的 etc/*.yaml 中,将 etcd 的服务发现地址替换为 Consul 的地址:
Name: shorturl-api
Host: 0.0.0.0
Port: 8888
Transform:
Target: consul://localhost:8500/transform.rpc?wait=14s
#Transform:
# Etcd:
# Hosts:
# - localhost:8500
# Key: transform.rpc
引入 Consul 解析器
在 API 服务的 main.go 中,通过匿名导入注册 Consul 解析器:
import _ "github.com/zeromicro/zero-contrib/zrpc/registry/consul"
这行导入的作用是将 Consul 的 gRPC resolver 注册到 go-zero 内部,使得 consul:// 协议的 Target 能够被正确解析。
总结
go-zero 通过 zero-contrib 生态提供了灵活可插拔的注册中心扩展能力。从 etcd 切换到 Consul 的核心步骤可以归纳为:服务端引入 consul.Conf 并调用 RegisterService,客户端引入 Consul resolver 并修改 Target 协议头。在十三Tech 的项目落地过程中,我们发现 Consul 的 UI 可视化能力对运维排查非常友好,如果你的团队已经在使用 Consul 作为基础设施,这套方案可以无缝接入现有的服务网格体系。