system column十三Tech
← 返回技术专栏
TECH

go-zero 微服务实战:集成 Consul 作为服务注册中心

go-zero 默认使用 etcd 作为注册中心,但企业环境中 Consul 更为常见。本文详解如何在 go-zero 中替换为 Consul,涵盖 RPC 服务端注册与 API 网关调用的完整配置流程。

Go微服务

在构建 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 作为基础设施,这套方案可以无缝接入现有的服务网格体系。

参考文档