咱们这不讲安装, 只讲使用.
etcd,consul 都是分布式KV, 一般用于服务发现;
1 注册服务
这里使用 etcd.clientv3搞事情, GoDoc在 这, 以下是伪代码
// key 随你制定, 只要能标识是那个服务器(比如 root/game/node_1)即可. value 可以包含addr, 状态, 优先度等信息
client.OpPut(key,value)
这里的小提示: 最好实现健康检查, 再好的代码也有跑不动的一天, 好像etcd的健康检查只支持ttl(服务向etcd定时重新PUT), 所以记得设置TTL并整一个Tick定时执行以上代码吧.
不过consul支持两种健康检查, 一种是ttl, 一种是consul主动去检查服务状态(详情看最底下 ↓ 的参考), 个人更喜欢consul. 因为我更喜欢年轻(=无限可能)的东西, 就像Golang一样.
TTL?
// ttl: 10s
resp, _:= cli.Grant(context.TODO(), 10)
ctx, _:= context.WithTimeout(context.Background(), 5*time.Second)
rsp,err:=cli.Put(ctx,"root/game/node-2",`{"addr":"192.168.1.1:9999"}`,clientv3.WithLease(resp.ID))
现在root/game/node-2在10s后就会自动移除
哦 就这么简单
2 获取服务
你可以看到上面的key是用/分层级的, 就像文件目录一样. 不过其实这个结构不是必须的, 只是推荐吧~.
获取一个value只需要:
rsp,_ := cli.Get(ctx,"root/game/node_1")
log.Print(rsp)
那么你要获取root下的所有kv怎么办呢? 这样:
// clientv3.WithPrefix() 这个option的意思就是以前缀获取,就是只要有这个前缀的key都返回. 现在明白了吧, 为什么推荐用/分割key, 是不是很优雅?
// 将返回一个数组
rsp,_ := cli.Get(ctx,"root/",clientv3.WithPrefix())
log.Print(rsp)
哦 就这么简单
3 watch
刚刚我说设置了TTL将在10s后删除key, 这么确定删除了呢? 那就是watch.
watch的作用就是在新服务改变(重新注册,下线等)后, 告知各个服务执行相应的逻辑(重新连接新服务,报警等).
ctx := context.TODO()
ch := cli.Watch(ctx, "root/", clientv3.WithPrefix())
for {
log.Print("rev")
select {
case c := <-ch:
for _, e := range c.Events {
log.Printf("%+v", e)
}
}
}
以上代码在root/下的key有变化就会打印出相应的变化.
Consul我也没用过, 这里给个链接consul api, 里面说的也易懂, 等用到了再来小记吧~ 完.
参考
有疑问加站长微信联系(非本文作者)