SpringCloud中NacosNamingService的作用詳解
NacosNamingService初始化
NacosNamingService類完成服務(wù)實(shí)例注冊(cè),撤銷與獲取服務(wù)實(shí)例操作。
生成方式:NacosNamingService初始化采用單例模式,使用反射生成。
NacosServiceRegistry bean初始化時(shí),在構(gòu)造中,根據(jù)nacos的屬性配置文件,通過(guò)反射,初始化了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初始化過(guò)程
NacosNamingService初始化時(shí),主要是進(jìn)行了以下操作:
- 初始化命名空間,默認(rèn)為public
- 初始化服務(wù)端地址.xxx:8848
- 初始化naocs 服務(wù)端兩個(gè)webcontext,"/nacos//v1/ns"和"/nacos//v1/ns//instance"
- 初始化服務(wù)實(shí)例信息緩存目錄,默認(rèn)為用戶目錄下"/nacos/naming/public"
- 初始化日志
- 初始化事件分發(fā)器
- 初始化NamingProxy,像服務(wù)端發(fā)起請(qǐng)求的代理
- 初始化心跳信息,使用ScheduledThreadPoolExecutor初始化守護(hù)線程池,nacos默認(rèn)5秒像服務(wù)端發(fā)起一次心跳,
- 初始化主機(jī)信息,默認(rèn)不使用本地緩存。
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心跳啟動(dòng)
客戶端向服務(wù)端發(fā)起請(qǐng)求時(shí),會(huì)先通過(guò)定時(shí)任務(wù)啟動(dòng)心跳,默認(rèn)心跳為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); //啟動(dòng)心跳任務(wù) 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);//開(kāi)啟定時(shí)心跳任務(wù) executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS); MetricsMonitor.getDom2BeatSizeMonitor().set(dom2Beat.size()); }
獲取服務(wù)實(shí)例
@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, ","));//遠(yuǎn)程服務(wù)獲取 } List<Instance> list; if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) { return new ArrayList<Instance>(); } return list; }
服務(wù)實(shí)例注銷
@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); }
到此這篇關(guān)于SpringCloud中NacosNamingService的作用詳解的文章就介紹到這了,更多相關(guān)NacosNamingService的作用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud實(shí)現(xiàn)全鏈路灰度發(fā)布的示例詳解
- SpringCloud中的Eureka注冊(cè)中心詳細(xì)解讀
- SpringCloud中的Ribbon負(fù)載均衡詳細(xì)解讀
- SpringCloud?Gateway實(shí)現(xiàn)請(qǐng)求解密和響應(yīng)加密的過(guò)程解析
- SpringCloud中的OpenFeign調(diào)用解讀
- SpringCloudAlibaba Nacos開(kāi)啟鑒權(quán)解決跳過(guò)登錄頁(yè)面問(wèn)題
- SpringCloud?Feign集成AOP的常見(jiàn)問(wèn)題與解決
相關(guān)文章
Springboot AOP對(duì)指定敏感字段數(shù)據(jù)加密存儲(chǔ)的實(shí)現(xiàn)
本篇文章主要介紹了利用Springboot+AOP對(duì)指定的敏感數(shù)據(jù)進(jìn)行加密存儲(chǔ)以及對(duì)數(shù)據(jù)中加密的數(shù)據(jù)的解密的方法,代碼詳細(xì),具有一定的價(jià)值,感興趣的小伙伴可以了解一下2021-11-11Java特性?Lambda?表達(dá)式和函數(shù)式接口
這篇文章主要介紹了Java特性?Lambda?表達(dá)式和函數(shù)式接口,Lambda表達(dá)式基于函數(shù)式編程思想,也可以稱為閉包,是Java?8引入的重要新特性,?Lambda允許把函數(shù)作為一個(gè)方法的參數(shù)2022-06-06劍指Offer之Java算法習(xí)題精講鏈表專項(xiàng)訓(xùn)練
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03MybatisPlus3.3.0沒(méi)有MybatisPlusInterceptor類問(wèn)題的解決方法
項(xiàng)目使用的是mybatis-plus-extension3.3.0依賴,然后在我使用分頁(yè)插件的時(shí)候,發(fā)現(xiàn)無(wú)法導(dǎo)入MybatisPlusInterceptor類所以本文給大家介紹了MybatisPlus3.3.0沒(méi)有MybatisPlusInterceptor類問(wèn)題的解決方法,需要的朋友可以參考下2023-12-12Spring中的@ConditionalOnProperty注解詳解
這篇文章主要介紹了Spring中的@ConditionalOnProperty注解詳解,常見(jiàn)的@Conditionalxxx開(kāi)頭的注解我們稱之為條件注解,常見(jiàn)的條件注解有,簡(jiǎn)單來(lái)講,一般是在配置類上或者是@Bean修飾的方法上,添加此注解表示一個(gè)類是否要被Spring上下文加載,需要的朋友可以參考下2024-01-01