您好,登錄后才能下訂單哦!
這篇文章主要介紹“nacos ServiceManager的removeInstance有什么作用”,在日常操作中,相信很多人在nacos ServiceManager的removeInstance有什么作用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”nacos ServiceManager的removeInstance有什么作用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
本文主要研究一下nacos ServiceManager的removeInstance
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中移除
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
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有什么作用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。