github.com/nacos-group/nacos-sdk-go@v1.1.4/clients/naming_client/subscribe_callback.go (about)

     1  /*
     2   * Copyright 1999-2020 Alibaba Group Holding Ltd.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *      http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package naming_client
    18  
    19  import (
    20  	"errors"
    21  
    22  	"github.com/nacos-group/nacos-sdk-go/clients/cache"
    23  	"github.com/nacos-group/nacos-sdk-go/common/logger"
    24  	"github.com/nacos-group/nacos-sdk-go/model"
    25  	"github.com/nacos-group/nacos-sdk-go/util"
    26  )
    27  
    28  type SubscribeCallback struct {
    29  	callbackFuncsMap cache.ConcurrentMap
    30  }
    31  
    32  func NewSubscribeCallback() SubscribeCallback {
    33  	ed := SubscribeCallback{}
    34  	ed.callbackFuncsMap = cache.NewConcurrentMap()
    35  	return ed
    36  }
    37  
    38  func (ed *SubscribeCallback) AddCallbackFuncs(serviceName string, clusters string, callbackFunc *func(services []model.SubscribeService, err error)) {
    39  	logger.Info("adding " + serviceName + " with " + clusters + " to listener map")
    40  	key := util.GetServiceCacheKey(serviceName, clusters)
    41  	var funcs []*func(services []model.SubscribeService, err error)
    42  	old, ok := ed.callbackFuncsMap.Get(key)
    43  	if ok {
    44  		funcs = append(funcs, old.([]*func(services []model.SubscribeService, err error))...)
    45  	}
    46  	funcs = append(funcs, callbackFunc)
    47  	ed.callbackFuncsMap.Set(key, funcs)
    48  }
    49  
    50  func (ed *SubscribeCallback) RemoveCallbackFuncs(serviceName string, clusters string, callbackFunc *func(services []model.SubscribeService, err error)) {
    51  	logger.Info("removing " + serviceName + " with " + clusters + " to listener map")
    52  	key := util.GetServiceCacheKey(serviceName, clusters)
    53  	funcs, ok := ed.callbackFuncsMap.Get(key)
    54  	if ok && funcs != nil {
    55  		var newFuncs []*func(services []model.SubscribeService, err error)
    56  		for _, funcItem := range funcs.([]*func(services []model.SubscribeService, err error)) {
    57  			if funcItem != callbackFunc {
    58  				newFuncs = append(newFuncs, funcItem)
    59  			}
    60  		}
    61  		ed.callbackFuncsMap.Set(key, newFuncs)
    62  	}
    63  
    64  }
    65  
    66  func (ed *SubscribeCallback) ServiceChanged(service *model.Service) {
    67  	if service == nil || service.Name == "" {
    68  		return
    69  	}
    70  	key := util.GetServiceCacheKey(service.Name, service.Clusters)
    71  	funcs, ok := ed.callbackFuncsMap.Get(key)
    72  	if ok {
    73  		for _, funcItem := range funcs.([]*func(services []model.SubscribeService, err error)) {
    74  			var subscribeServices []model.SubscribeService
    75  			if len(service.Hosts) == 0 {
    76  				(*funcItem)(subscribeServices, errors.New("[client.Subscribe] subscribe failed,hosts is empty"))
    77  				return
    78  			}
    79  			for _, host := range service.Hosts {
    80  				subscribeService := model.SubscribeService{
    81  					Valid:       host.Valid,
    82  					Port:        host.Port,
    83  					Ip:          host.Ip,
    84  					Metadata:    host.Metadata,
    85  					ServiceName: host.ServiceName,
    86  					ClusterName: host.ClusterName,
    87  					Weight:      host.Weight,
    88  					InstanceId:  host.InstanceId,
    89  					Enable:      host.Enable,
    90  					Healthy:     host.Healthy,
    91  				}
    92  				subscribeServices = append(subscribeServices, subscribeService)
    93  			}
    94  			(*funcItem)(subscribeServices, nil)
    95  		}
    96  	}
    97  }