美文网首页
spring-cloud-starter-alibaba-nac

spring-cloud-starter-alibaba-nac

作者: skipper_shou | 来源:发表于2020-10-23 17:35 被阅读0次

    spring-cloud-starter-alibaba-nacos-discovery

    查看源码可知,自动将配置以下配置都加载到当前SpringBoot创建并使用的IoC容器
    将各个bean注入到容器中,以便于后期完成注册

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
      com.alibaba.cloud.nacos.ribbon.RibbonNacosAutoConfiguration,\
      com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\
      com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\
      com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
      com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\
      com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\
      com.alibaba.cloud.nacos.NacosServiceAutoConfiguration
    org.springframework.cloud.bootstrap.BootstrapConfiguration=\
      com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration
    

    com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration

    /**
     * 配置nacos服务发现的自动化配置
     * 注入NacosDiscoveryProperties、NacosServiceDiscovery
     * @author <a href="mailto:echooy.mxq@gmail.com">echooymxq</a>
     **/
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnDiscoveryEnabled
    @ConditionalOnNacosDiscoveryEnabled
    public class NacosDiscoveryAutoConfiguration {
    
        //注入对应的配置项,处理配置项null的数据为"",判断并设置ip,并从环境中覆盖nacos发现配置
        //如果是nacos服务信息发生变化,则发布事件NacosDiscoveryInfoChangedEvent
        @Bean
        @ConditionalOnMissingBean
        public NacosDiscoveryProperties nacosProperties() {
            return new NacosDiscoveryProperties();
        }
    
        //注入服务发现类
        @Bean
        @ConditionalOnMissingBean
        public NacosServiceDiscovery nacosServiceDiscovery(
                NacosDiscoveryProperties discoveryProperties,
                NacosServiceManager nacosServiceManager) {
            return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager);
        }
    }
    

    将NacosDiscoveryProperties、NacosServiceDiscovery注入到容器中,其中nacosServiceDiscovery需要先自动配置NacosServiceAutoConfiguration注入NacosServiceManager再运行

    com.alibaba.cloud.nacos.NacosServiceAutoConfiguration

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnDiscoveryEnabled
    @ConditionalOnNacosDiscoveryEnabled
    public class NacosServiceAutoConfiguration {
    
        //注入nacos服务管理,并设置监听事件InstancePreRegisteredEvent,监听服务注册之前的事件发布
        @Bean
        public NacosServiceManager nacosServiceManager() {
            return new NacosServiceManager();
        }
    
    }
    

    注入NacosServiceManager

    com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration

    @Configuration(proxyBeanMethods = false)
    @EnableConfigurationProperties
    @ConditionalOnNacosDiscoveryEnabled
    @ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
            matchIfMissing = true)
    @AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
            AutoServiceRegistrationAutoConfiguration.class,
            NacosDiscoveryAutoConfiguration.class })
    public class NacosServiceRegistryAutoConfiguration {
    
        //注入nacos服务注册中心
        @Bean
        public NacosServiceRegistry nacosServiceRegistry(
                NacosDiscoveryProperties nacosDiscoveryProperties) {
            return new NacosServiceRegistry(nacosDiscoveryProperties);
        }
    
        //注入nacos注册配置,初始化元数据,并且提供自定义元数据的修改方式
        @Bean
        @ConditionalOnBean(AutoServiceRegistrationProperties.class)
        public NacosRegistration nacosRegistration(
                ObjectProvider<List<NacosRegistrationCustomizer>> registrationCustomizers,
                NacosDiscoveryProperties nacosDiscoveryProperties,
                ApplicationContext context) {
            return new NacosRegistration(registrationCustomizers.getIfAvailable(),
                    nacosDiscoveryProperties, context);
        }
    
        //注入nacos自动服务注册类,并监听事件NacosDiscoveryInfoChangedEvent,该事件在NacosDiscoveryProperties中进行的发布配置
        @Bean
        @ConditionalOnBean(AutoServiceRegistrationProperties.class)
        public NacosAutoServiceRegistration nacosAutoServiceRegistration(
                NacosServiceRegistry registry,
                AutoServiceRegistrationProperties autoServiceRegistrationProperties,
                NacosRegistration registration) {
            return new NacosAutoServiceRegistration(registry,
                    autoServiceRegistrationProperties, registration);
        }
    
    }
    
    

    com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration

    /**
     * Nacos反应式发现客户端配置
     **/
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnDiscoveryEnabled
    @ConditionalOnReactiveDiscoveryEnabled
    @ConditionalOnNacosDiscoveryEnabled
    @AutoConfigureAfter({ NacosDiscoveryAutoConfiguration.class,
            ReactiveCompositeDiscoveryClientAutoConfiguration.class })
    @AutoConfigureBefore({ ReactiveCommonsClientAutoConfiguration.class })
    public class NacosReactiveDiscoveryClientConfiguration {
    
        //注入nacos反应式服务发现客户端
        @Bean
        @ConditionalOnMissingBean
        public NacosReactiveDiscoveryClient nacosReactiveDiscoveryClient(
                NacosServiceDiscovery nacosServiceDiscovery) {
            return new NacosReactiveDiscoveryClient(nacosServiceDiscovery);
        }
    
    }
    

    com.alibaba.cloud.nacos.ribbon.RibbonNacosAutoConfiguration

    配置ribbon客户端
    @Configuration(proxyBeanMethods = false)
    @EnableConfigurationProperties
    @ConditionalOnBean(SpringClientFactory.class)
    @ConditionalOnRibbonNacos
    @ConditionalOnNacosDiscoveryEnabled
    @AutoConfigureAfter(RibbonAutoConfiguration.class)
    @RibbonClients(defaultConfiguration = NacosRibbonClientConfiguration.class)
    public class RibbonNacosAutoConfiguration {
    
    }
    
    ------------------------------
    
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnRibbonNacos
    public class NacosRibbonClientConfiguration {
    
        @Autowired
        private PropertiesFactory propertiesFactory;
    
        //注入服务列表
        @Bean
        @ConditionalOnMissingBean
        public ServerList<?> ribbonServerList(IClientConfig config,
                NacosDiscoveryProperties nacosDiscoveryProperties) {
            if (this.propertiesFactory.isSet(ServerList.class, config.getClientName())) {
                ServerList serverList = this.propertiesFactory.get(ServerList.class, config,
                        config.getClientName());
                return serverList;
            }
            NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties);
            serverList.initWithNiwsConfig(config);
            return serverList;
        }
    
        //注入Nacos服务器自检器
        @Bean
        @ConditionalOnMissingBean
        public NacosServerIntrospector nacosServerIntrospector() {
            return new NacosServerIntrospector();
        }
    
    }
    

    由于ribbonNacos需要在RibbonAutoConfiguration配置完成之后才进行自动配置,而RibbonAutoConfiguration又需要在org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration完成配置之后才会进行自动配置,默认不带这eureka相关jar包,所以,在默认情况下,不会进行ribbon

    com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration

    /**
     * The AutoConfiguration class for Nacos Discovery's Endpoints.
     * 暴露nacos服务发现的端点,包括NacosDiscoveryProperties和subscribe
     * @author xiaojing
     * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
     */
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(Endpoint.class)
    @ConditionalOnNacosDiscoveryEnabled
    public class NacosDiscoveryEndpointAutoConfiguration {
    
        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnAvailableEndpoint
        public NacosDiscoveryEndpoint nacosDiscoveryEndpoint(
                NacosServiceManager nacosServiceManager,
                NacosDiscoveryProperties nacosDiscoveryProperties) {
            return new NacosDiscoveryEndpoint(nacosServiceManager, nacosDiscoveryProperties);
        }
    
        @Bean
        @ConditionalOnEnabledHealthIndicator("nacos-discovery")
        public HealthIndicator nacosDiscoveryHealthIndicator(
                NacosServiceManager nacosServiceManager,
                NacosDiscoveryProperties nacosDiscoveryProperties) {
            Properties nacosProperties = nacosDiscoveryProperties.getNacosProperties();
            return new NacosDiscoveryHealthIndicator(
                    nacosServiceManager.getNamingService(nacosProperties));
        }
    
    }
    

    其中NacosDiscoveryEndpoint通过EndpointReadOperation两个注解将该方法通过JMX自动公开,并且在web应用程序中也通过http get方式公开,通过actuator来暴露对应的端点

    com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnDiscoveryEnabled
    @ConditionalOnBlockingDiscoveryEnabled
    @ConditionalOnNacosDiscoveryEnabled
    @AutoConfigureBefore({ SimpleDiscoveryClientAutoConfiguration.class,
            CommonsClientAutoConfiguration.class })
    @AutoConfigureAfter(NacosDiscoveryAutoConfiguration.class)
    public class NacosDiscoveryClientConfiguration {
    
    //注入nacos服务发现客户端
        @Bean
        public DiscoveryClient nacosDiscoveryClient(
                NacosServiceDiscovery nacosServiceDiscovery) {
            return new NacosDiscoveryClient(nacosServiceDiscovery);
        }
    
        //输入nacoswatch,该类在ApplicationContext启动后扫描到lifeCycle的实现类并调用start,订阅EventListener,如果是NamingEvent,则在需要的情况下重置元数据,另外,此类还会发布一次心跳HeartbeatEvent
        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled",
                matchIfMissing = true)
        public NacosWatch nacosWatch(NacosServiceManager nacosServiceManager,
                NacosDiscoveryProperties nacosDiscoveryProperties,
                ObjectProvider<TaskScheduler> taskExecutorObjectProvider) {
            return new NacosWatch(nacosServiceManager, nacosDiscoveryProperties,
                    taskExecutorObjectProvider);
        }
    
    }
    

    com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration

    /**
     * Extra configuration for config server if it happens to be registered with Nacos.
     * 如果配置服务器恰巧已在Nacos中注册,则需要对配置服务器进行额外的配置
     *
     * @author JevonYang
     */
    @Configuration(proxyBeanMethods = false)
    @EnableConfigurationProperties
    @ConditionalOnClass({NacosDiscoveryProperties.class, ConfigServerProperties.class})
    public class NacosConfigServerAutoConfiguration {
    
        @Autowired(required = false)
        private NacosDiscoveryProperties properties;
    
        @Autowired(required = false)
        private ConfigServerProperties server;
    
        @PostConstruct
        public void init() {
            if (this.properties == null || this.server == null) {
                return;
            }
            String prefix = this.server.getPrefix();
            if (StringUtils.hasText(prefix) && !StringUtils
                    .hasText(this.properties.getMetadata().get("configPath"))) {
                this.properties.getMetadata().put("configPath", prefix);
            }
        }
    
    }
    

    com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration

    @ConditionalOnClass(ConfigServicePropertySourceLocator.class)
    @ConditionalOnProperty(value = "spring.cloud.config.discovery.enabled",
            matchIfMissing = false)
    @Configuration(proxyBeanMethods = false)
    @ImportAutoConfiguration({ NacosDiscoveryAutoConfiguration.class,
            NacosDiscoveryClientConfiguration.class,
            NacosReactiveDiscoveryClientConfiguration.class })
    public class NacosDiscoveryClientConfigServiceBootstrapConfiguration {
    
    }
    

    NacosDiscoveryAutoConfiguration.class,NacosDiscoveryClientConfiguration.class,NacosReactiveDiscoveryClientConfiguration.class注入到Bootstrap容器中

    相关文章

      网友评论

          本文标题:spring-cloud-starter-alibaba-nac

          本文链接:https://www.haomeiwen.com/subject/tkevmktx.html