Nacos源码ServiceManager
生活随笔
收集整理的這篇文章主要介紹了
Nacos源码ServiceManager
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ServiceManager就是Nacos中管理服務、實例信息的核心API,其中就包含Nacos的服務注冊表:
?
而其中的registerInstance方法就是注冊服務實例的方法:
/*** Register an instance to a service in AP mode.** <p>This method creates service or cluster silently if they don't exist.** @param namespaceId id of namespace* @param serviceName service name* @param instance instance to register* @throws Exception any error occurred in the process*/ public void registerInstance(String namespaceId, String serviceName, Instance instance) throws NacosException {// 創建一個空的service(如果是第一次來注冊實例,要先創建一個空service出來,放入注冊表)// 此時不包含實例信息createEmptyService(namespaceId, serviceName, instance.isEphemeral());// 拿到創建好的serviceService service = getService(namespaceId, serviceName);// 拿不到則拋異常if (service == null) {throw new NacosException(NacosException.INVALID_PARAM,"service not found, namespace: " + namespaceId + ", service: " + serviceName);}// 添加要注冊的實例到service中addInstance(namespaceId, serviceName, instance.isEphemeral(), instance); }創建好了服務,接下來就要添加實例到服務中:
/*** Add instance to service.** @param namespaceId namespace* @param serviceName service name* @param ephemeral whether instance is ephemeral* @param ips instances* @throws NacosException nacos exception*/ public void addInstance(String namespaceId, String serviceName, boolean ephemeral, Instance... ips)throws NacosException {// 監聽服務列表用到的key,服務唯一標識,例如:com.alibaba.nacos.naming.iplist.ephemeral.public##DEFAULT_GROUP@@order-serviceString key = KeyBuilder.buildInstanceListKey(namespaceId, serviceName, ephemeral);// 獲取服務Service service = getService(namespaceId, serviceName);// 同步鎖,避免并發修改的安全問題synchronized (service) {// 1)獲取要更新的實例列表List<Instance> instanceList = addIpAddresses(service, ephemeral, ips);// 2)封裝實例列表到Instances對象Instances instances = new Instances();instances.setInstanceList(instanceList);// 3)完成 注冊表更新 以及 Nacos集群的數據同步consistencyService.put(key, instances);} }該方法中對修改服務列表的動作加鎖處理,確保線程安全。而在同步代碼塊中,包含下面幾步:
-
1)先獲取要更新的實例列表,addIpAddresses(service, ephemeral, ips);
-
2)然后將更新后的數據封裝到Instances對象中,后面更新注冊表時使用
-
3)最后,調用consistencyService.put()方法完成Nacos集群的數據同步,保證集群一致性。
注意:在第1步的addIPAddress中,會拷貝舊的實例列表,添加新實例到列表中。在第3步中,完成對實例狀態更新后,則會用新列表直接覆蓋舊實例列表。而在更新過程中,舊實例列表不受影響,用戶依然可以讀取。
這樣在更新列表狀態過程中,無需阻塞用戶的讀操作,也不會導致用戶讀取到臟數據,性能比較好。這種方案稱為CopyOnWrite方案。
總結
以上是生活随笔為你收集整理的Nacos源码ServiceManager的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nacos如何支撑阿里内部数十万服务注册
- 下一篇: Nacos源码更服务列表