in pkg/adapter/springcloud/servicediscovery/zookeeper/service_listener.go [110:152]
func (asl *applicationServiceListener) handleEvent(children []string) {
fetchChildren, err := asl.ds.getClient().GetChildren(asl.servicePath)
if err != nil {
// todo refactor gost zk, make it return the definite err
if strings.Contains(err.Error(), "none children") {
logger.Debugf("%s get nodes from zookeeper fail: %s", common.ZKLogDiscovery, err.Error())
} else {
logger.Warnf("%s Error when retrieving service node [%s] in path: %s, Error:%s", common.ZKLogDiscovery, asl.serviceName, asl.servicePath, err.Error())
}
}
discovery := asl.ds
serviceMap := discovery.getServiceMap()
instanceMap := discovery.instanceMap
func() {
for _, id := range fetchChildren {
serviceInstance, err := discovery.queryForInstance(asl.serviceName, id)
if err != nil {
logger.Errorf("add service: %s, instance: %s has error: ", asl.serviceName, id, err.Error())
continue
}
if instanceMap[id] == nil {
_, _ = discovery.addServiceInstance(serviceInstance)
} else {
_, _ = discovery.updateServiceInstance(serviceInstance)
}
}
}()
func() {
serviceInstances := serviceMap[asl.serviceName]
oldInsId := []string{}
for _, instance := range serviceInstances {
oldInsId = append(oldInsId, instance.ID)
}
if delInstanceIds := Diff(oldInsId, fetchChildren); delInstanceIds != nil {
for _, id := range delInstanceIds {
_, _ = discovery.delServiceInstance(instanceMap[id])
}
}
}()
}