當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringCloud Nacos 【服务端】服务注册源码解析
生活随笔
收集整理的這篇文章主要介紹了
SpringCloud Nacos 【服务端】服务注册源码解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 環境介紹
nacos版本1.4.12 注冊入口
描述: 查看nacos官網, 請求url為:
/nacos/v1/ns/instance描述: 找到 InstanceController類,register方法。
@CanDistro@PostMapping@Secured(parser = NamingResourceParser.class, action = ActionTypes.WRITE)public String register(HttpServletRequest request) throws Exception {final String namespaceId = WebUtils.optional(request, CommonParams.NAMESPACE_ID, Constants.DEFAULT_NAMESPACE_ID);final String serviceName = WebUtils.required(request, CommonParams.SERVICE_NAME);NamingUtils.checkServiceNameFormat(serviceName);final Instance instance = parseInstance(request);/*** 服務端注冊核心邏輯*/serviceManager.registerInstance(namespaceId, serviceName, instance);return "ok";}3 核心邏輯分析
3.1 ServiceManager
描述: service注冊nacos核心類。
3.2 Nacos 注冊表
描述: nacos注冊表采用雙map結構,一套nacos 可以配置多套項目,其結構可以理解為:
(1) namespace: 用于區分項目。 (2) group: 用于區分環境(dev、release)。 (3) servcieName:微服務名稱. (4) Service:真正的服務。用group::servcieName 確定Service。3.3 Service
描述: Nacos中服務端的服務,存儲服務采用Map結構,其Key 代表集群名稱(可以用于區分地區),Cluster用于存儲服務端的服務。Cluster存儲服務實例又分為持久服務集,臨時服務集。
3.4 registerInstance 方法
描述: ServiceManager類registerInstance方法。
public void registerInstance(String namespaceId, String serviceName, Instance instance) throws NacosException {//創建一個空的servicecreateEmptyService(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);}//添加addInstance(namespaceId, serviceName, instance.isEphemeral(), instance);}3.5 createEmptyService方法
描述: ServiceManager類createEmptyService方法。
3.6 addInstance 方法
描述: ServiceManager類addInstance方法。
public void addInstance(String namespaceId, String serviceName, boolean ephemeral, Instance... ips)throws NacosException {//生成一個keyString key = KeyBuilder.buildInstanceListKey(namespaceId, serviceName, ephemeral);//獲取當前服務Service service = getService(namespaceId, serviceName);synchronized (service) {//ips轉instancesList<Instance> instanceList = addIpAddresses(service, ephemeral, ips);Instances instances = new Instances();instances.setInstanceList(instanceList);//一致性service存放instancesconsistencyService.put(key, instances);}}3.7 DistroConsistencyServiceImpl
描述: put方法。
描述: 客戶端向nacos發送注冊請求,最終在Notifier阻塞隊列中添加了注冊任務。
4 Notifier 分析
描述: 任務啟動,DistroConsistencyServiceImpl類初始化時,會初始化線程池開啟Notifier 方法,并且當前線程corePoolSize為1。
描述: 當前類實現了Runnable接口,直接查看run方法。
4.1 handle方法。
4.2 onChange
描述: Service類onChange方法會調用,updateIPs方法進行服務端ip列表的更新。
4.3 updateIPs
總結
以上是生活随笔為你收集整理的SpringCloud Nacos 【服务端】服务注册源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [滑模控制器浅述] (1) 二阶系统的简
- 下一篇: 锐起无盘服务器只能是什么系统,安装锐起无