日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringCloud Nacos 【服务端】服务注册源码解析

發布時間:2024/8/1 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringCloud Nacos 【服务端】服务注册源码解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 環境介紹

nacos版本1.4.1

2 注冊入口

描述: 查看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方法。

public void createServiceIfAbsent(String namespaceId, String serviceName, boolean local, Cluster cluster)throws NacosException {//從注冊表中獲取服務Service service = getService(namespaceId, serviceName);//服務為空if (service == null) {Loggers.SRV_LOG.info("creating empty service {}:{}", namespaceId, serviceName);//創建服務,初始化相關屬性service = new Service();service.setName(serviceName);service.setNamespaceId(namespaceId);service.setGroupName(NamingUtils.getGroupName(serviceName));// now validate the service. if failed, exception will be thrownservice.setLastModifiedMillis(System.currentTimeMillis());service.recalculateChecksum();if (cluster != null) {cluster.setService(service);service.getClusterMap().put(cluster.getName(), cluster);}service.validate();//添加服務到注冊表中,并且初始化心跳檢測putServiceAndInit(service);if (!local) {addOrReplaceService(service);}}} private void putServiceAndInit(Service service) throws NacosException {//雙重檢測加入nacos注冊表中putService(service);//采用scheduleWithFixedDelay定期檢測心跳service.init();consistencyService.listen(KeyBuilder.buildInstanceListKey(service.getNamespaceId(), service.getName(), true), service);consistencyService.listen(KeyBuilder.buildInstanceListKey(service.getNamespaceId(), service.getName(), false), service);Loggers.SRV_LOG.info("[NEW-SERVICE] {}", service.toJson());}

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方法。

@Overridepublic void run() {Loggers.DISTRO.info("distro notifier started");//自旋for (; ; ) {try {//從阻塞隊列中獲取任務Pair<String, DataOperation> pair = tasks.take();//處理handle(pair);} catch (Throwable e) {Loggers.DISTRO.error("[NACOS-DISTRO] Error while handling notifying task", e);}}}

4.1 handle方法。

4.2 onChange

描述: Service類onChange方法會調用,updateIPs方法進行服務端ip列表的更新。

4.3 updateIPs


總結

以上是生活随笔為你收集整理的SpringCloud Nacos 【服务端】服务注册源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。