func NewBackServices(poller *zmq.Poller, productName string, topo *zk.Topology) *BackServices { // 创建BackServices result := &BackServices{ Services: make(map[string]*BackService), OfflineServices: make(map[string]*BackService), poller: poller, topo: topo, } var evtbus chan interface{} = make(chan interface{}, 2) servicesPath := topo.ProductServicesPath() path, e1 := topo.CreateDir(servicesPath) // 保证Service目录存在,否则会报错 fmt.Println("Path: ", path, "error: ", e1) services, err := topo.WatchChildren(servicesPath, evtbus) if err != nil { log.Println("Error: ", err) // TODO: 这个地方需要优化 panic("Reading Service List Failed") } go func() { for true { result.Lock() for _, service := range services { log.Println("Service: ", service) if _, ok := result.Services[service]; !ok { result.addBackService(service) } } result.Unlock() // 等待事件 <-evtbus // 读取数据,继续监听(连接过期了就过期了,再次Watch即可) services, err = topo.WatchChildren(servicesPath, evtbus) } }() // 读取zk, 等待 log.Println("ProductName: ", result.topo.ProductName) return result }