一、docker-compsoe.yml文件如下
version: "3.5"
services:
etcd:
hostname: etcd
image: bitnami/etcd:latest
deploy:
replicas: 1
restart_policy:
condition: on-failure
privileged: true
volumes:
# 持久化 etcd 数据到宿主机
- "/app/apisix/etcd/data:/bitnami/etcd/data"
environment:
# 客户端广播地址
- "ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379"
# 客户端监听地址
- "ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379"
# 节点间通信地址
- "ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380"
- "ETCD_INITIAL_ADVERTISE_PEER_URLS=http://0.0.0.0:2380"
# 设置初始集群信息
- "ETCD_INITIAL_CLUSTER=node1=http://0.0.0.0:2380"
- "ETCD_NAME=node1"
- "ETCD_DATA_DIR=/opt/bitnami/etcd/data"
# 👇 开启权限认证(必须配置密码)
- "ETCD_AUTH_ENABLED=true"
- "ETCD_ROOT_PASSWORD=123456"
ports:
- "2379:2379" # 客户端通信端口
- "2380:2380" # 节点间通信端口
networks:
- etcdnet
networks:
etcdnet:
name: etcdnet
安装完成之后,进入容器中,使用如下命令,测试连接
etcdctl --user root:123456 endpoint health
二、go项目中安装依赖
go get go.etcd.io/etcd/client/v3
go get github.com/go-kratos/kratos/contrib/registry/etcd/v2
三、main.go中注册服务
func newApp(logger log.Logger, gs *grpc.Server, hs *http.Server) *kratos.App {
client, err := clientv3.New(clientv3.Config{
Endpoints: []string{"127.0.0.1:2379"},
})
reg := etcd.New(client)
if err != nil {
panic(err)
}
return kratos.New(
kratos.ID(id),
kratos.Name(Name),
kratos.Version(Version),
kratos.Metadata(map[string]string{}),
kratos.Logger(logger),
kratos.Server(
gs,
hs,
),
kratos.Registrar(reg),
)
}
四、启动项目,成功之后,进入容器查看
etcdctl --user root:123456 endpoint health
## print: 127.0.0.1:2379 is healthy: successfully committed proposal: took = 1.728868ms