1)我是在windows10下运行,golang1.13.8
问题描述:
frontend在运行时,总是提示无法查找到key,经检查代码发现使用zrpcclient在创建etcd客户端时候莫名的错误,
估计与使用的库有关。
解决方案:多创建几次,保证成功:
// 所有的调用都使用"brpc"
func NewZRpcClient(protoName string, conf *ZRpcClientConfig, cb ZPpcClientCallBack) *ZRpcClient {
clients := map[string][]string{}
c := &ZRpcClient{
callback: cb,
}
// 这里传进去一个空值,应该后面在watcher中addclient中添加到cgm中
c.clients = net2.NewTcpClientGroupManager(protoName, clients, c)
// Check name
for i := 0; i < len(conf.Clients); i++ {
// service discovery
etcdConfg := clientv3.Config{
Endpoints: conf.Clients[i].EtcdAddrs,
}
watcher := &Watcher{
name: conf.Clients[i].Name,
}
// 这里的意思是本地的变量watcher里的 *watcher2.ClientWatcher类型watcher,
watcher.watcher, _ = watcher2.NewClientWatcher("/nebulaim", conf.Clients[i].Name, etcdConfg, c.clients)
// 之前这里的值在后面用的时候发现是空值
k := 0
for ; k <= 10 && watcher.watcher == nil; {
fmt.Printf("出现了问题,连接etcd错误, 重试第 %d 次 \n", k+2)
time.Sleep(1 * time.Second)
watcher.watcher, _ = watcher2.NewClientWatcher("/nebulaim", conf.Clients[i].Name, etcdConfg, c.clients)
k = k + 1
}
if k >= 10 {
fmt.Println("NewClientWatcher中etcd错误,试了10次还不行,重启一次试试")
}
if conf.Clients[i].Balancer == "ketama" {
watcher.ketama = load_balancer.NewKetama(10, nil)
} else {
watcher.ketama = nil
}
c.watchers = append(c.watchers, watcher)
}
return c
}
后面发现,多试一次基本就好了,有人提示在前面加Sleep也可以。
2)待续