SpringCloud中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初始化時,主要是進行了以下操作:
- 初始化命名空間,默認為public
- 初始化服務端地址.xxx:8848
- 初始化naocs 服務端兩個webcontext,"/nacos//v1/ns"和"/nacos//v1/ns//instance"
- 初始化服務實例信息緩存目錄,默認為用戶目錄下"/nacos/naming/public"
- 初始化日志
- 初始化事件分發(fā)器
- 初始化NamingProxy,像服務端發(fā)起請求的代理
- 初始化心跳信息,使用ScheduledThreadPoolExecutor初始化守護線程池,nacos默認5秒像服務端發(fā)起一次心跳,
- 初始化主機信息,默認不使用本地緩存。
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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot AOP對指定敏感字段數(shù)據(jù)加密存儲的實現(xiàn)
本篇文章主要介紹了利用Springboot+AOP對指定的敏感數(shù)據(jù)進行加密存儲以及對數(shù)據(jù)中加密的數(shù)據(jù)的解密的方法,代碼詳細,具有一定的價值,感興趣的小伙伴可以了解一下2021-11-11MybatisPlus3.3.0沒有MybatisPlusInterceptor類問題的解決方法
項目使用的是mybatis-plus-extension3.3.0依賴,然后在我使用分頁插件的時候,發(fā)現(xiàn)無法導入MybatisPlusInterceptor類所以本文給大家介紹了MybatisPlus3.3.0沒有MybatisPlusInterceptor類問題的解決方法,需要的朋友可以參考下2023-12-12Spring中的@ConditionalOnProperty注解詳解
這篇文章主要介紹了Spring中的@ConditionalOnProperty注解詳解,常見的@Conditionalxxx開頭的注解我們稱之為條件注解,常見的條件注解有,簡單來講,一般是在配置類上或者是@Bean修飾的方法上,添加此注解表示一個類是否要被Spring上下文加載,需要的朋友可以參考下2024-01-01