micro問(wèn)題記錄:registry/etcdv3

一、micro的registry/etcdv3接收到刪除事件時(shí)在獨(dú)立使用時(shí)沒發(fā)送事件

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

原因

go-plugins/registry/etcdv3在單獨(dú)使用時(shí)如果接收到刪除事件,會(huì)因?yàn)闆]有從cache從取到service 信息而不發(fā)送通知,導(dǎo)致watch的地方?jīng)]有收到通知


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里取數(shù)據(jù)decode到service不成功?
  • ev.Kv.Value是不是刪除時(shí)的值如果是,應(yīng)該decode成功才對(duì)
    實(shí)例證明:刪除時(shí)ev.Kv.Value取到的值為空

解決辦法

watch的時(shí)候添加clientv3.WithPrevKV()參數(shù),可以取到上一次的KV


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

二、如果沒有注冊(cè)服務(wù)就watch會(huì)報(bào):not found

解決判斷

去掉GetService方法里的判斷,刪除以下代碼

    if len(rsp.Kvs) == 0 {
        return nil, registry.ErrNotFound
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,139評(píng)論 7 249
  • 中國(guó)式眾籌關(guān)鍵點(diǎn)是基于熟人的眾籌,是在熟人圈的籌人、籌智、籌資,這也是區(qū)別于西方眾籌的核心特征。 西方的...
    學(xué)到老活得好閱讀 256評(píng)論 0 0
  • 真愛,是基於對(duì)方心智心靈成熟所付出的行動(dòng)!這幾個(gè)章節(jié)對(duì)於真愛的詮釋,現(xiàn)在看來(lái)又是一次又一次清晰的過(guò)程。 我的案例算...
    粟莎閱讀 242評(píng)論 0 0

友情鏈接更多精彩內(nèi)容