SpringCloud中NacosNamingService的作用详解

 更新时间:2023年11月15日 08:54:23   作者:阿孟呀  
这篇文章主要介绍了SpringCloud中NacosNamingService的作用详解,NacosNamingService类完成服务实例注册,撤销与获取服务实例操作,NacosNamingService初始化采用单例模式,使用反射生成,需要的朋友可以参考下

NacosNamingService初始化

NacosNamingService类完成服务实例注册,撤销与获取服务实例操作。

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

NacosServiceRegistry bean初始化时,在构造中,根据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. 初始化事件分发器
  7. 初始化NamingProxy,像服务端发起请求的代理
  8. 初始化心跳信息,使用ScheduledThreadPoolExecutor初始化守护线程池,nacos默认5秒像服务端发起一次心跳,
  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心跳启动

客户端向服务端发起请求时,会先通过定时任务启动心跳,默认心跳为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的作用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现Excel文件加密解密的示例代码

    Java实现Excel文件加密解密的示例代码

    设置excel文件保护时,通常可选择对整个工作簿进行加密保护。无需设置文档保护时,可撤销密码保护,即解密文档。本文将通过java程序演示以上加密、解密方法的实现,感兴趣的可以了解一下
    2022-05-05
  • SpringBoot常用计量与bean属性校验和进制数据转换规则全面分析

    SpringBoot常用计量与bean属性校验和进制数据转换规则全面分析

    这篇文章主要介绍了SpringBoot常用计量、bean属性校验与进制数据转换规则,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • SpringBoot4.5.2 整合HikariCP 数据库连接池操作

    SpringBoot4.5.2 整合HikariCP 数据库连接池操作

    这篇文章主要介绍了SpringBoot4.5.2 整合HikariCP 数据库连接池操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • JAVA不使用线程池来处理的异步的方法详解

    JAVA不使用线程池来处理的异步的方法详解

    这篇文章主要介绍了JAVA不使用线程池来处理的异步的方法,在这个示例中,asyncTask方法创建了一个新的线程来执行异步任务,这个新线程会立即开始执行,而主线程则会继续执行后续的代码,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Java数据结构之AC自动机算法的实现

    Java数据结构之AC自动机算法的实现

    AC自动机算法常被认为是Trie树+KMP算法的结合体,它是一个多模式匹配算法,在模式匹配领域被广泛应用。本文将详细为大家介绍AC自动机的原理与实现方法,感兴趣的可以了解一下
    2022-12-12
  • Java调用.dll文件的方法

    Java调用.dll文件的方法

    因为项目的需求,要在JAVA项目中调用Windows的Dll(动态链接库)文件,之前用Jni调用过C写的Dll文件,比较麻烦,这里不多说,网上也有很多这方面的文档。在网上找到一个开源的组件JNative,使用后感觉比较方便
    2013-04-04
  • mybatisPlus更新策略导致更新失败问题

    mybatisPlus更新策略导致更新失败问题

    这篇文章主要介绍了mybatisPlus更新策略导致更新失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • java中为何重写equals时必须重写hashCode方法详解

    java中为何重写equals时必须重写hashCode方法详解

    这篇文章主要给大家介绍了关于java中为什么重写equals时必须重写hashCode方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Java面向对象基础教学(一)

    Java面向对象基础教学(一)

    这篇文章主要介绍了Java的面相对象编程思想,包括类对象方法和封装继承多态等各个方面的OOP基本要素,非常推荐,需要的朋友可以参考下,希望可以对你有所帮助
    2021-07-07
  • Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)

    Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)

    这篇文章主要介绍了Eclipse+Java+Swing+Mysql实现电影购票系统并附详细的代码详解,需要的小伙伴可以参考一下
    2022-01-01

最新评论