最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud中NacosNamingService的作用詳解

 更新時間:2023年11月15日 08:54:23   作者:阿孟呀  
這篇文章主要介紹了SpringCloud中NacosNamingService的作用詳解,NacosNamingService類完成服務實例注冊,撤銷與獲取服務實例操作,NacosNamingService初始化采用單例模式,使用反射生成,需要的朋友可以參考下

NacosNamingService初始化

NacosNamingService類完成服務實例注冊,撤銷與獲取服務實例操作。

生成方式:NacosNamingService初始化采用單例模式,使用反射生成。

NacosServiceRegistry bean初始化時,在構(gòu)造中,根據(jù)nacos的屬性配置文件,通過反射,初始化了NacosNamingService。

NacosServiceRegistry

public NacosServiceRegistry(NacosDiscoveryProperties nacosDiscoveryProperties) {
		this.nacosDiscoveryProperties = nacosDiscoveryProperties;
		this.namingService = nacosDiscoveryProperties.namingServiceInstance();
	}
NacosDiscoveryProperties
public NamingService namingServiceInstance() {
 
		if (null != namingService) {
			return namingService;
		}
 
		try {
			namingService = NacosFactory.createNamingService(getNacosProperties());
		}
		catch (Exception e) {
			log.error("create naming service error!properties={},e=,", this, e);
			return null;
		}
		return namingService;
	}

NamingFactory

public static NamingService createNamingService(Properties properties) throws NacosException {
        try {
            Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
            Constructor constructor = driverImplClass.getConstructor(Properties.class);
            NamingService vendorImpl = (NamingService)constructor.newInstance(properties);
            return vendorImpl;
        } catch (Throwable e) {
            throw new NacosException(NacosException.CLIENT_INVALID_PARAM, e);
        }
    }

NacosNamingService初始化過程

NacosNamingService初始化時,主要是進行了以下操作:

  1. 初始化命名空間,默認為public
  2. 初始化服務端地址.xxx:8848
  3. 初始化naocs 服務端兩個webcontext,"/nacos//v1/ns"和"/nacos//v1/ns//instance"
  4. 初始化服務實例信息緩存目錄,默認為用戶目錄下"/nacos/naming/public"
  5. 初始化日志
  6. 初始化事件分發(fā)器
  7. 初始化NamingProxy,像服務端發(fā)起請求的代理
  8. 初始化心跳信息,使用ScheduledThreadPoolExecutor初始化守護線程池,nacos默認5秒像服務端發(fā)起一次心跳,
  9. 初始化主機信息,默認不使用本地緩存。
public NacosNamingService(Properties properties) {
        init(properties);
    }
 
    private void init(Properties properties) {
        namespace = InitUtils.initNamespaceForNaming(properties);
        initServerAddr(properties);
        InitUtils.initWebRootContext();
        initCacheDir();
        initLogName(properties);
 
        eventDispatcher = new EventDispatcher();
        serverProxy = new NamingProxy(namespace, endpoint, serverList);
        serverProxy.setProperties(properties);
        beatReactor = new BeatReactor(serverProxy, initClientBeatThreadCount(properties));
        hostReactor = new HostReactor(eventDispatcher, serverProxy, cacheDir, isLoadCacheAtStart(properties), initPollingThreadCount(properties));
    }

NacosNamingService心跳啟動

客戶端向服務端發(fā)起請求時,會先通過定時任務啟動心跳,默認心跳為5秒一次

public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
 
        if (instance.isEphemeral()) {
            BeatInfo beatInfo = new BeatInfo();
            beatInfo.setServiceName(NamingUtils.getGroupedName(serviceName, groupName));
            beatInfo.setIp(instance.getIp());
            beatInfo.setPort(instance.getPort());
            beatInfo.setCluster(instance.getClusterName());
            beatInfo.setWeight(instance.getWeight());
            beatInfo.setMetadata(instance.getMetadata());
            beatInfo.setScheduled(false);
            long instanceInterval = instance.getInstanceHeartBeatInterval();
            beatInfo.setPeriod(instanceInterval == 0 ? DEFAULT_HEART_BEAT_INTERVAL : instanceInterval);
               //啟動心跳任務
            beatReactor.addBeatInfo(NamingUtils.getGroupedName(serviceName, groupName), beatInfo);
        }
 
        serverProxy.registerService(NamingUtils.getGroupedName(serviceName, groupName), groupName, instance);
    }
public void addBeatInfo(String serviceName, BeatInfo beatInfo) {
        NAMING_LOGGER.info("[BEAT] adding beat: {} to beat map.", beatInfo);
        String key = buildKey(serviceName, beatInfo.getIp(), beatInfo.getPort());
        BeatInfo existBeat = null;
        //fix #1733
        if ((existBeat = dom2Beat.remove(key)) != null) {
            existBeat.setStopped(true);
        }
        dom2Beat.put(key, beatInfo);//開啟定時心跳任務
        executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS);
        MetricsMonitor.getDom2BeatSizeMonitor().set(dom2Beat.size());
    }

獲取服務實例

@Override
    public List<Instance> getAllInstances(String serviceName, String groupName, List<String> clusters, boolean subscribe) throws NacosException {
 
        ServiceInfo serviceInfo;
        if (subscribe) {
            serviceInfo = hostReactor.getServiceInfo(NamingUtils.getGroupedName(serviceName, groupName), StringUtils.join(clusters, ","));//本地map獲取
        } else {
            serviceInfo = hostReactor.getServiceInfoDirectlyFromServer(NamingUtils.getGroupedName(serviceName, groupName), StringUtils.join(clusters, ","));//遠程服務獲取
        }
        List<Instance> list;
        if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
            return new ArrayList<Instance>();
        }
        return list;
    }

服務實例注銷

@Override
    public void deregisterInstance(String serviceName, String groupName, Instance instance) throws NacosException {
        if (instance.isEphemeral()) {
            beatReactor.removeBeatInfo(NamingUtils.getGroupedName(serviceName, groupName), instance.getIp(), instance.getPort());
        }
        serverProxy.deregisterService(NamingUtils.getGroupedName(serviceName, groupName), instance);
    }

到此這篇關于SpringCloud中NacosNamingService的作用詳解的文章就介紹到這了,更多相關NacosNamingService的作用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決ApplicationContext獲取不到Bean的問題

    解決ApplicationContext獲取不到Bean的問題

    這篇文章主要介紹了解決ApplicationContext獲取不到Bean的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 如果你想寫自己的Benchmark框架(推薦)

    如果你想寫自己的Benchmark框架(推薦)

    這篇文章主要介紹了如果你想寫自己的Benchmark框架,本文通過給大家分享八條軍規(guī),幫助大家理解,需要的朋友可以參考下
    2020-07-07
  • springboot swagger不顯示接口的問題及解決

    springboot swagger不顯示接口的問題及解決

    這篇文章主要介紹了springboot swagger不顯示接口的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java獲取一個類的隱藏屬性的幾種方法

    Java獲取一個類的隱藏屬性的幾種方法

    這篇文章主要討論了在Java中如何訪問或修改類的私有字段,包括使用公共的getter和setter方法、反射、繼承和序列化機制,文章強調(diào)了尊重類的封裝性,感興趣的小伙伴跟著小編一起來看看吧
    2025-02-02
  • 淺析Java中的動態(tài)代理

    淺析Java中的動態(tài)代理

    動態(tài)代理指代理類和目標類的關系在程序運行的時候確定的,客戶通過代理類來調(diào)用目標對象的方法。本文將通過案例詳細講解一下Java動態(tài)代理的原理及實現(xiàn),需要的可以參考一下
    2022-09-09
  • SpringBoot 使用Mybatis分頁插件實現(xiàn)詳解

    SpringBoot 使用Mybatis分頁插件實現(xiàn)詳解

    這篇文章主要介紹了SpringBoot 使用Mybatis分頁插件實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • idea報錯:程序包org.springframework.web.bind.annotation不存在

    idea報錯:程序包org.springframework.web.bind.annotation不存在

    在用本地的maven倉庫的時候會org.springframework.web.bind.annotation不存在的錯誤,本文就詳細的介紹一下解決方法,感興趣的可以了解下
    2023-08-08
  • 使用Runtime 調(diào)用Process.waitfor導致的阻塞問題

    使用Runtime 調(diào)用Process.waitfor導致的阻塞問題

    這篇文章主要介紹了使用Runtime 調(diào)用Process.waitfor導致的阻塞問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • JavaFx?Tooltip懸浮提示使用及自定義代碼詳解

    JavaFx?Tooltip懸浮提示使用及自定義代碼詳解

    本篇是基于TornadoFx框架對Tooltip組件進行講解,使用Kotlin語言,和傳統(tǒng)Java使用有所區(qū)別,本章節(jié)包括對tooltip的樣式定制化以及指定窗口顯示,對JavaFx?Tooltip懸浮提示使用及自定義相關知識感興趣的朋友一起看看吧
    2021-12-12
  • 適用于Java初學者的學習路線圖

    適用于Java初學者的學習路線圖

    這篇文章主要介紹了學習Java的路線圖的五個必經(jīng)階段,還有一些作者的想法分享給大家,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評論

宜君县| 台南县| 牙克石市| 河源市| 古丈县| 麻城市| 罗城| 老河口市| 江川县| 溧阳市| 阳西县| 行唐县| 句容市| 凤阳县| 大邑县| 万盛区| 镶黄旗| 黔东| 玛沁县| 西青区| 永善县| 岳阳市| 灵台县| 平武县| 长春市| 岱山县| 普兰店市| 宜川县| 茂名市| 清水县| 永丰县| 长泰县| 祁连县| 绵竹市| 汽车| 大英县| 吉林省| 长宁区| 霍城县| 隆化县| 宝应县|