SpringBoot集成Nacos服务注册发现

发布于:2024-07-26 ⋅ 阅读:(149) ⋅ 点赞:(0)

参考文档

springboot集成nacos服务注册发现中心_nacos-discovery-spring-boot-starter-CSDN博客

依赖

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-discovery-spring-boot-starter</artifactId>
            <version>0.2.8</version>
        </dependency>

配置

nacos:
  discovery:
    server-addr: xxx
    auto-register: true

源码简析

注册

NacosDiscoveryAutoConfiguration
NacosDiscoveryAutoRegister

    @NacosInjected
    private NamingService namingService;

    @Override
    public void onApplicationEvent(WebServerInitializedEvent event) {
        // 是否开启了服务自动注册
        if (!discoveryProperties.isAutoRegister()) {
            return;
        }
        // 获取注册配置
        Register register = discoveryProperties.getRegister();

        if (StringUtils.isEmpty(register.getIp())) {
            register.setIp(NetUtils.localIP());
        }

        if (register.getPort() == 0) {
            register.setPort(event.getWebServer().getPort());
        }

        register.getMetadata().put("preserved.register.source", "SPRING_BOOT");

        register.setInstanceId("");
        // 服务名默认是应用名
        String serviceName = register.getServiceName();

        if (StringUtils.isEmpty(serviceName)){
            if (StringUtils.isEmpty(applicationName)){
                throw new AutoRegisterException("serviceName notNull");
            }
            serviceName = applicationName;
        }

        try {
            // 注册实例
            namingService.registerInstance(serviceName, register.getGroupName(),
                    register);
            logger.info("Finished auto register service : {}, ip : {}, port : {}",
                    serviceName, register.getIp(), register.getPort());
        } catch (NacosException e) {
            throw new AutoRegisterException(e);
        }
    }

NamingService如何注入?通过注解

@EnableNacosDiscovery

@Import(NacosDiscoveryBeanDefinitionRegistrar.class)

NacosDiscoveryBeanDefinitionRegistrar#registerBeanDefinitions

NacosBeanUtils#registerNacosCommonBeans

NacosBeanUtils#registerAnnotationNacosInjectedBeanPostProcessor

CacheableEventPublishingNacosServiceFactory.NamingCreateWorker#run

注入的是DelegatingNamingService

接着看是如何注入的

 NacosNamingService

    @Override
    public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
        NamingUtils.checkInstanceIsLegal(instance);
        String groupedServiceName = NamingUtils.getGroupedName(serviceName, groupName);
        if (instance.isEphemeral()) {
            BeatInfo beatInfo = beatReactor.buildBeatInfo(groupedServiceName, instance);
            beatReactor.addBeatInfo(groupedServiceName, beatInfo);
        }
        serverProxy.registerService(groupedServiceName, groupName, instance);
    }

NamingProxy

    public void registerService(String serviceName, String groupName, Instance instance) throws NacosException {
        
        NAMING_LOGGER.info("[REGISTER-SERVICE] {} registering service {} with instance: {}", namespaceId, serviceName,
                instance);
        
        final Map<String, String> params = new HashMap<String, String>(16);
        params.put(CommonParams.NAMESPACE_ID, namespaceId);
        params.put(CommonParams.SERVICE_NAME, serviceName);
        params.put(CommonParams.GROUP_NAME, groupName);
        params.put(CommonParams.CLUSTER_NAME, instance.getClusterName());
        params.put("ip", instance.getIp());
        params.put("port", String.valueOf(instance.getPort()));
        params.put("weight", String.valueOf(instance.getWeight()));
        params.put("enable", String.valueOf(instance.isEnabled()));
        params.put("healthy", String.valueOf(instance.isHealthy()));
        params.put("ephemeral", String.valueOf(instance.isEphemeral()));
        params.put("metadata", JacksonUtils.toJson(instance.getMetadata()));    
        // 调服务端接口注册
        reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.POST);
        
    }

发现


网站公告

今日签到

点亮在社区的每一天
去签到