go任务调度7(etcd的watch的用法)

栏目: Go · 发布时间: 6年前

内容简介:监听etcd中的kv变化,常用来做集群中的配置下发、状态同步,非常有价值。输出:[root@bogon etcd]# go run demo8.go

监听etcd中的kv变化,常用来做集群中的配置下发、状态同步,非常有价值。

package main

import (
    "go.etcd.io/etcd/clientv3"
    "time"
    "fmt"
    "context"
    "go.etcd.io/etcd/mvcc/mvccpb"
)

func main() {
    var (
        config clientv3.Config
        client *clientv3.Client
        err error
        kv clientv3.KV
        watcher clientv3.Watcher
        getResp *clientv3.GetResponse
        watchStartRevision int64
        watchRespChan <-chan clientv3.WatchResponse
        watchResp clientv3.WatchResponse
        event *clientv3.Event
    )

    // 客户端配置
    config = clientv3.Config{
        Endpoints: []string{"0.0.0.0:2379"},
        DialTimeout: 5 * time.Second,
    }

    // 建立连接
    if client, err = clientv3.New(config); err != nil {
        fmt.Println(err)
        return
    }

    // KV
    kv = clientv3.NewKV(client)

    // 模拟etcd中KV的变化
    go func() {
        for {
            kv.Put(context.TODO(), "/cron/jobs/job7", "i am job7")

            kv.Delete(context.TODO(), "/cron/jobs/job7")

            time.Sleep(1 * time.Second)
        }
    }()

    // 先GET到当前的值,并监听后续变化
    if getResp, err = kv.Get(context.TODO(), "/cron/jobs/job7"); err != nil {
        fmt.Println(err)
        return
    }

    // 现在key是存在的
    if len(getResp.Kvs) != 0 {
        fmt.Println("当前值:", string(getResp.Kvs[0].Value))
    }

    // 当前etcd集群事务ID, 单调递增的(监听/cron/jobs/job7后续的变化,也就是通过监听版本变化)
    watchStartRevision = getResp.Header.Revision + 1

    // 创建一个watcher(监听器)
    watcher = clientv3.NewWatcher(client)

    // 启动监听
    fmt.Println("从该版本向后监听:", watchStartRevision)

    ctx, cancelFunc := context.WithCancel(context.TODO())
    //5秒钟后取消
    time.AfterFunc(5 * time.Second, func() {
        cancelFunc()
    })
    //这里ctx感知到cancel则会关闭watcher
    watchRespChan = watcher.Watch(ctx, "/cron/jobs/job7", clientv3.WithRev(watchStartRevision))

    // 处理kv变化事件
    for watchResp = range watchRespChan {
        for _, event = range watchResp.Events {
            switch event.Type {
            case mvccpb.PUT:
                fmt.Println("修改为:", string(event.Kv.Value), "Revision:", event.Kv.CreateRevision, event.Kv.ModRevision)
            case mvccpb.DELETE:
                fmt.Println("删除了", "Revision:", event.Kv.ModRevision)
            }
        }
    }
}

输出:

[root@bogon etcd]# go run demo8.go

当前值: i am job7

从该版本向后监听: 33

删除了 Revision: 33

修改为: i am job7 Revision: 34 34

删除了 Revision: 35

修改为: i am job7 Revision: 36 36

删除了 Revision: 37

修改为: i am job7 Revision: 38 38

删除了 Revision: 39

修改为: i am job7 Revision: 40 40

删除了 Revision: 41

[root@bogon etcd]#


以上所述就是小编给大家介绍的《go任务调度7(etcd的watch的用法)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro JavaScript Techniques

Pro JavaScript Techniques

John Resig / Apress / 2006-12-13 / USD 44.99

Pro JavaScript Techniques is the ultimate JavaScript book for the modern web developer. It provides everything you need to know about modern JavaScript, and shows what JavaScript can do for your web s......一起来看看 《Pro JavaScript Techniques》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具