首先部署三节点etcd集群,配置各节点名称、IP及集群信息,通过systemd管理服务;然后使用Go的etcd客户端实现服务注册与发现,注册时创建租约并定期续租,发现时从etcd前缀路径获取服务列表,结合KeepAlive和Watch机制实现高可用服务管理。

搭建基于 etcd 的 Golang 服务注册中心,核心是部署高可用的 etcd 集群,并通过 Go 程序实现服务的注册与发现。下面分步骤说明如何完成整个流程。
etcd 集群部署(三节点示例)
etcd 是一个高可用的分布式键值存储系统,常用于服务发现、配置共享和分布式协调。建议至少使用三个节点来保证容错能力。
环境准备:
假设三台机器 IP 分别为:
192.168.1.10(node1)192.168.1.11(node2)192.168.1.12(node3)
在每台机器上执行以下操作:
1. 下载并安装 etcd
立即学习“go语言免费学习笔记(深入)”;
以 Linux 为例:
wget https://github.com/etcd-io/etcd/releases/download/v3.5.12/etcd-v3.5.12-linux-amd64.tar.gztar xzvf etcd-v3.5.12-linux-amd64.tar.gzcd etcd-v3.5.12-linux-amd64sudo mv etcd etcdctl /usr/local/bin/
2. 创建 etcd 配置文件(systemd 方式)
创建配置文件 /etc/etcd/config.env:
# 节点唯一名称ETCD_NAME=node1# 本机 IPETCD_ADVERTISE_CLIENT_URLS=http://192.168.1.10:2379ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380ETCD_ADVERTISE_PEER_URLS=http://192.168.1.10:2380# 集群配置ETCD_INITIAL_ADVERTISE_PEER_URLS=http://192.168.1.10:2380ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1ETCD_INITIAL_CLUSTER=node1=http://192.168.1.10:2380,node2=http://192.168.1.11:2380,node3=http://192.168.1.12:2380ETCD_INITIAL_CLUSTER_STATE=new
注意:每台机器的
ETCD_NAME
和 IP 地址要对应修改。
3. 创建 systemd 服务文件
/etc/systemd/system/etcd.service
[Unit]Description=etcdAfter=network.target[Service]Type=notifyEnvironmentFile=/etc/etcd/config.envExecStart=/usr/local/bin/etcdRestart=on-failureLimitNOFILE=65536
[Install]WantedBy=multi-user.target
4. 启动服务
sudo systemctl daemon-reexecsudo systemctl enable etcdsudo systemctl start etcd
5. 验证集群状态
任选一个节点执行:
etcdctl --endpoints=http://192.168.1.10:2379,http://192.168.1.11:2379,http://192.168.1.12:2379 endpoint status --write-out=table
输出应显示三个成员,状态正常。
Go 服务注册与发现实现
使用 Go 客户端
go.etcd.io/etcd/clientv3
与 etcd 交互。
1. 安装依赖
go get go.etcd.io/etcd/clientv3
2. 服务注册逻辑
服务启动时向 etcd 写入自身信息,并周期性发送心跳(租约续期)。
package mainimport ( "context" "log" "time" "go.etcd.io/etcd/clientv3")const serviceKey = "/services/user-service/192.168.1.10:8080"func registerService(etcdEndpoints []string) { cli, err := clientv3.New(clientv3.Config{ Endpoints: etcdEndpoints, DialTimeout: 5 * time.Second, }) if err != nil { log.Fatal("连接 etcd 失败:", err) } defer cli.Close() // 创建一个 10 秒的租约 resp, err := cli.Grant(context.TODO(), 10) if err != nil { log.Fatal("创建租约失败:", err) } // 注册服务 _, err = cli.Put(context.TODO(), serviceKey, "http://192.168.1.10:8080", clientv3.WithLease(resp.ID)) if err != nil { log.Fatal("服务注册失败:", err) } log.Println("服务注册成功,开始续租") // 定期续租(KeepAlive) keepAlive, err := cli.KeepAlive(context.TODO(), resp.ID) if err != nil { log.Fatal("续租失败:", err) } // 持续监听续租响应 for range keepAlive { // 接收心跳响应,维持租约 }}
3. 服务发现逻辑
客户端从 etcd 获取当前可用的服务地址列表。
func getServiceList(cli *clientv3.Client) { resp, err := cli.Get(context.Background(), "/services/user-service/", clientv3.WithPrefix()) if err != nil { log.Println("获取服务列表失败:", err) return } log.Println("当前可用服务:") for _, kv := range resp.Kvs { log.Printf("%s -> %s", kv.Key, kv.Value) }}
4. 主函数调用示例
func main() { etcdEndpoints := []string{"http://192.168.1.10:2379", "http://192.168.1.11:2379", "http://192.168.1.12:2379"} // 启动注册(建议放到 goroutine) go registerService(etcdEndpoints) // 模拟服务运行 ticker := time.NewTicker(30 * time.Second) for range ticker.C { cli, _ := clientv3.New(clientv3.Config{Endpoints: etcdEndpoints}) getServiceList(cli) cli.Close() }}
关键注意事项
租约(Lease)时间要合理设置,通常为 10~30 秒,心跳频率应小于租约时间。服务关闭时应主动撤销租约或删除 key,避免残留。生产环境建议启用 etcd 的 HTTPS 和用户认证。Go 客户端应复用
*clientv3.Client
实例,避免频繁创建连接。监听服务变化可使用
Watch
机制实现动态更新。
基本上就这些。etcd 集群搭建完成后,配合 Go 的租约机制,就能实现一个轻量级、高可用的服务注册与发现中心。
以上就是Golang服务注册中心 etcd集群搭建的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1400440.html
微信扫一扫
支付宝扫一扫