美文网首页
etcd 使用小记

etcd 使用小记

作者: bysir | 来源:发表于2017-06-07 13:53 被阅读0次

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

    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实现服务的注册和发现

    相关文章

      网友评论

          本文标题:etcd 使用小记

          本文链接:https://www.haomeiwen.com/subject/qleofxtx.html