etcd 使用小记

bysir · · 6260 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

咱们这不讲安装, 只讲使用.

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, 里面说的也易懂, 等用到了再来小记吧~ 完.


参考

etcd 使用入门
使用consul实现服务的注册和发现

本文来自:简书

感谢作者:bysir

查看原文:etcd 使用小记

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

6260 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传