温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

nacos ServiceManager的removeInstance有什么作用

发布时间:2021-06-23 09:30:30 来源:亿速云 阅读:236 作者:chen 栏目:大数据

这篇文章主要介绍“nacos ServiceManager的removeInstance有什么作用”,在日常操作中,相信很多人在nacos ServiceManager的removeInstance有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nacos ServiceManager的removeInstance有什么作用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

本文主要研究一下nacos ServiceManager的removeInstance

ServiceManager

nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java

@Component @DependsOn("nacosApplicationContext") public class ServiceManager implements RecordListener<Service> {     /**      * Map<namespace, Map<group::serviceName, Service>>      */     private Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>();     private LinkedBlockingDeque<ServiceKey> toBeUpdatedServicesQueue = new LinkedBlockingDeque<>(1024 * 1024);     private Synchronizer synchronizer = new ServiceStatusSynchronizer();     private final Lock lock = new ReentrantLock();     @Resource(name = "consistencyDelegate")     private ConsistencyService consistencyService;     @Autowired     private SwitchDomain switchDomain;     @Autowired     private DistroMapper distroMapper;     @Autowired     private ServerListManager serverListManager;     @Autowired     private PushService pushService;     private final Object putServiceLock = new Object();     //......     public void removeInstance(String namespaceId, String serviceName, boolean ephemeral, Instance... ips) throws NacosException {         Service service = getService(namespaceId, serviceName);         removeInstance(namespaceId, serviceName, ephemeral, service, ips);     }     public void removeInstance(String namespaceId, String serviceName, boolean ephemeral, Service service, Instance... ips) throws NacosException {         String key = KeyBuilder.buildInstanceListKey(namespaceId, serviceName, ephemeral);         List<Instance> instanceList = substractIpAddresses(service, ephemeral, ips);         Instances instances = new Instances();         instances.setInstanceList(instanceList);         consistencyService.put(key, instances);     }     public List<Instance> substractIpAddresses(Service service, boolean ephemeral, Instance... ips) throws NacosException {         return updateIpAddresses(service, UtilsAndCommons.UPDATE_INSTANCE_ACTION_REMOVE, ephemeral, ips);     }     public List<Instance> updateIpAddresses(Service service, String action, boolean ephemeral, Instance... ips) throws NacosException {         Datum datum = consistencyService.get(KeyBuilder.buildInstanceListKey(service.getNamespaceId(), service.getName(), ephemeral));         Map<String, Instance> oldInstanceMap = new HashMap<>(16);         List<Instance> currentIPs = service.allIPs(ephemeral);         Map<String, Instance> map = new ConcurrentHashMap<>(currentIPs.size());         for (Instance instance : currentIPs) {             map.put(instance.toIPAddr(), instance);         }         if (datum != null) {             oldInstanceMap = setValid(((Instances) datum.value).getInstanceList(), map);         }         // use HashMap for deep copy:         HashMap<String, Instance> instanceMap = new HashMap<>(oldInstanceMap.size());         instanceMap.putAll(oldInstanceMap);         for (Instance instance : ips) {             if (!service.getClusterMap().containsKey(instance.getClusterName())) {                 Cluster cluster = new Cluster(instance.getClusterName(), service);                 cluster.init();                 service.getClusterMap().put(instance.getClusterName(), cluster);                 Loggers.SRV_LOG.warn("cluster: {} not found, ip: {}, will create new cluster with default configuration.",                     instance.getClusterName(), instance.toJSON());             }             if (UtilsAndCommons.UPDATE_INSTANCE_ACTION_REMOVE.equals(action)) {                 instanceMap.remove(instance.getDatumKey());             } else {                 instanceMap.put(instance.getDatumKey(), instance);             }         }         if (instanceMap.size() <= 0 && UtilsAndCommons.UPDATE_INSTANCE_ACTION_ADD.equals(action)) {             throw new IllegalArgumentException("ip list can not be empty, service: " + service.getName() + ", ip list: "                 + JSON.toJSONString(instanceMap.values()));         }         return new ArrayList<>(instanceMap.values());     }     //...... }
  • removeInstance方法通过substractIpAddresses获取移除执行instances之后的instanceList,然后通过consistencyService.put方法进行更新;substractIpAddresses方法执行updateIpAddresses方法,其action参数值为UtilsAndCommons.UPDATE_INSTANCE_ACTION_REMOVE,它先使用service.allIPs(ephemeral)获取instance列表,针对remove动作会根据instance.getDatumKey()将其从instanceMap中移除

Service.allIPs

nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/Service.java

public class Service extends com.alibaba.nacos.api.naming.pojo.Service implements Record, RecordListener<Instances> {     private static final String SERVICE_NAME_SYNTAX = "[0-9a-zA-Z@\\.:_-]+";     @JSONField(serialize = false)     private ClientBeatCheckTask clientBeatCheckTask = new ClientBeatCheckTask(this);     private String token;     private List<String> owners = new ArrayList<>();     private Boolean resetWeight = false;     private Boolean enabled = true;     private Selector selector = new NoneSelector();     private String namespaceId;     /**      * IP will be deleted if it has not send beat for some time, default timeout is 30 seconds.      */     private long ipDeleteTimeout = 30 * 1000;     private volatile long lastModifiedMillis = 0L;     private volatile String checksum;     /**      * TODO set customized push expire time:      */     private long pushCacheMillis = 0L;     private Map<String, Cluster> clusterMap = new HashMap<>();     //......     public List<Instance> allIPs(boolean ephemeral) {         List<Instance> allIPs = new ArrayList<>();         for (Map.Entry<String, Cluster> entry : clusterMap.entrySet()) {             allIPs.addAll(entry.getValue().allIPs(ephemeral));         }         return allIPs;     }     //...... }
  • Service的allIPs方法会遍历clusterMap,然后通过Cluster.allIPs(ephemeral)收集Instance

Cluster.allIPs

nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/Cluster.java

public class Cluster extends com.alibaba.nacos.api.naming.pojo.Cluster implements Cloneable {     private static final String CLUSTER_NAME_SYNTAX = "[0-9a-zA-Z-]+";     /**      * a addition for same site routing, can group multiple sites into a region, like Hangzhou, Shanghai, etc.      */     private String sitegroup = StringUtils.EMPTY;     private int defCkport = 80;     private int defIPPort = -1;     @JSONField(serialize = false)     private HealthCheckTask checkTask;     @JSONField(serialize = false)     private Set<Instance> persistentInstances = new HashSet<>();     @JSONField(serialize = false)     private Set<Instance> ephemeralInstances = new HashSet<>();     @JSONField(serialize = false)     private Service service;     @JSONField(serialize = false)     private volatile boolean inited = false;     private Map<String, String> metadata = new ConcurrentHashMap<>();     //......     public List<Instance> allIPs(boolean ephemeral) {         return ephemeral ? new ArrayList<>(ephemeralInstances) : new ArrayList<>(persistentInstances);     }     //...... }
  • Cluster的allIPs方法根据ephemeral来返回ephemeralInstances或者persistentInstances

小结

ServiceManager的removeInstance方法通过substractIpAddresses获取移除执行instances之后的instanceList,然后通过consistencyService.put方法进行更新;substractIpAddresses方法执行updateIpAddresses方法,其action参数值为UtilsAndCommons.UPDATE_INSTANCE_ACTION_REMOVE,它先使用service.allIPs(ephemeral)获取instance列表,针对remove动作会根据instance.getDatumKey()将其从instanceMap中移除

到此,关于“nacos ServiceManager的removeInstance有什么作用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI