micro问题记录:registry/etcdv3

一、micro的registry/etcdv3接收到删除事件时在独立使用时没发送事件

issues: https://github.com/micro/go-plugins/issues/108

原因

go-plugins/registry/etcdv3在单独使用时如果接收到删除事件,会因为没有从cache从取到service 信息而不发送通知,导致watch的地方没有收到通知


func (ew *etcdv3Watcher) Next() (*registry.Result, error) {
    for wresp := range ew.w {
        if wresp.Err() != nil {
            return nil, wresp.Err()
        }
        for _, ev := range wresp.Events {
            service := decode(ev.Kv.Value)
            var action string

            switch ev.Type {
            case clientv3.EventTypePut:
                if ev.IsCreate() {
                    action = "create"
                } else if ev.IsModify() {
                    action = "update"
                }
            case clientv3.EventTypeDelete:
                action = "delete"

                // get the cached value  
                ctx, cancel := context.WithTimeout(context.Background(), ew.timeout)
                defer cancel()

                resp, err := ew.client.Get(ctx, path.Join(cachePrefix, string(ev.Kv.Key)))
                if err != nil {
                    return nil, err
                }

                for _, ev := range resp.Kvs {
                    service = decode(ev.Value)
                }

            }
            if service == nil {
                continue
            }
            return &registry.Result{
                Action:  action,
                Service: service,
            }, nil
        }
    }
    return nil, errors.New("could not get next")
}

@TODO

  • 从ev.Kv.Value里取数据decode到service不成功?
  • ev.Kv.Value是不是删除时的值如果是,应该decode成功才对
    实例证明:删除时ev.Kv.Value取到的值为空

解决办法

watch的时候添加clientv3.WithPrevKV()参数,可以取到上一次的KV


    return &etcdv3Watcher{
        stop:    stop,
        w:       r.client.Watch(ctx, prefix, clientv3.WithPrefix(), clientv3.WithPrevKV()),
        client:  r.client,
        timeout: timeout,
    }, nil

二、如果没有注册服务就watch会报:not found

解决判断

去掉GetService方法里的判断,删除以下代码

    if len(rsp.Kvs) == 0 {
        return nil, registry.ErrNotFound
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,833评论 19 139
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,702评论 7 249
  • 中国式众筹关键点是基于熟人的众筹,是在熟人圈的筹人、筹智、筹资,这也是区别于西方众筹的核心特征。 西方的...
    学到老活得好阅读 1,670评论 0 0
  • 真愛,是基於對方心智心靈成熟所付出的行動!這幾個章節對於真愛的詮釋,現在看來又是一次又一次清晰的過程。 我的案例算...
    粟莎阅读 1,553评论 0 0

友情链接更多精彩内容