前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊NacosDiscoveryEndpointsAutoConfiguration

聊聊NacosDiscoveryEndpointsAutoConfiguration

原创
作者头像
code4it
修改2019-09-25 10:00:00
5470
修改2019-09-25 10:00:00
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下NacosDiscoveryEndpointsAutoConfiguration

NacosDiscoveryEndpointsAutoConfiguration

nacos-spring-boot-project/nacos-discovery-spring-boot-actuator/src/main/java/com/alibaba/boot/nacos/discovery/actuate/autoconfigure/NacosDiscoveryEndpointsAutoConfiguration.java

代码语言:javascript
复制
@Configuration
public class NacosDiscoveryEndpointsAutoConfiguration {
​
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnEnabledEndpoint
    public NacosDiscoveryEndpoint nacosDiscoveryEndpoint() {
        return new NacosDiscoveryEndpoint();
    }
​
}
  • NacosDiscoveryEndpointsAutoConfiguration注册了NacosDiscoveryEndpoint

NacosDiscoveryEndpoint

nacos-spring-boot-project/nacos-discovery-spring-boot-actuator/src/main/java/com/alibaba/boot/nacos/discovery/actuate/endpoint/NacosDiscoveryEndpoint.java

代码语言:javascript
复制
@Endpoint(id = NacosDiscoveryConstants.ENDPOINT_PREFIX)
public class NacosDiscoveryEndpoint {
​
    @Autowired
    private ApplicationContext applicationContext;
​
    private static final Integer PAGE_SIZE = 100;
​
    @ReadOperation
    public Map<String, Object> invoke() {
        Map<String, Object> result = new HashMap<>();
​
        result.put("nacosDiscoveryGlobalProperties",
                PropertiesUtils.extractSafeProperties(applicationContext.getBean(
                        DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME, Properties.class)));
​
        NacosServiceFactory nacosServiceFactory = CacheableEventPublishingNacosServiceFactory.getSingleton();
​
        JSONArray array = new JSONArray();
        for (NamingService namingService : nacosServiceFactory.getNamingServices()) {
            JSONObject jsonObject = new JSONObject();
            try {
                jsonObject.put("servicesOfServer",
                        namingService.getServicesOfServer(0, PAGE_SIZE));
                jsonObject.put("subscribeServices", namingService.getSubscribeServices());
                array.add(jsonObject);
            }
            catch (Exception e) {
                jsonObject.put("serverStatus", namingService.getServerStatus() + ": "
                         + NacosUtils.SEPARATOR + e.getMessage());
            }
        }
​
        result.put("namingServersStatus", array);
        return result;
    }
​
}
  • NacosDiscoveryEndpoint提供了一个ReadOperation,它返回的map里头会有nacosDiscoveryGlobalProperties及namingServersStatus;namingServersStatus是个JSONArray,每个JSONArray的元素是个JSONObject,JSONObject有servicesOfServer、subscribeServices;其中servicesOfServer通过namingService.getServicesOfServer(0, PAGE_SIZE)获取,PAGE_SIZE为100

NacosDiscoveryBeanDefinitionRegistrar

nacos-spring-context-0.3.3-sources.jar!/com/alibaba/nacos/spring/context/annotation/discovery/NacosDiscoveryBeanDefinitionRegistrar.java

代码语言:javascript
复制
public class NacosDiscoveryBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar, EnvironmentAware {
​
    private Environment environment;
​
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AnnotationAttributes attributes = AnnotationAttributes.fromMap(
                importingClassMetadata.getAnnotationAttributes(EnableNacosDiscovery.class.getName()));
        // Register Global Nacos Properties Bean
        registerGlobalNacosProperties(attributes, registry, environment, DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME);
        // Register Nacos Common Beans
        registerNacosCommonBeans(registry);
        // Register Nacos Discovery Beans
        registerNacosDiscoveryBeans(registry);
    }
​
    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }
}
  • NacosDiscoveryBeanDefinitionRegistrar实现了ImportBeanDefinitionRegistrar, EnvironmentAware接口,其registerBeanDefinitions从importingClassMetadata获取EnableNacosDiscovery的attributes,然后通过registerGlobalNacosProperties方法注册DISCOVERY_GLOBAL_NACOS_PROPERTIES_BEAN_NAME

NacosBeanUtils

nacos-spring-context-0.3.3-sources.jar!/com/alibaba/nacos/spring/util/NacosBeanUtils.java

代码语言:javascript
复制
public abstract class NacosBeanUtils {
​
    //......
​
    public static void registerGlobalNacosProperties(AnnotationAttributes attributes,
                                                     BeanDefinitionRegistry registry,
                                                     PropertyResolver propertyResolver,
                                                     String beanName) {
        if (attributes == null) {
            return; // Compatible with null
        }
        AnnotationAttributes globalPropertiesAttributes = attributes.getAnnotation("globalProperties");
        registerGlobalNacosProperties((Map<?, ?>) globalPropertiesAttributes, registry, propertyResolver,
                beanName);
    }
​
    public static void registerGlobalNacosProperties(Map<?, ?> globalPropertiesAttributes,
                                                     BeanDefinitionRegistry registry,
                                                     PropertyResolver propertyResolver,
                                                     String beanName) {
        Properties globalProperties = resolveProperties(globalPropertiesAttributes, propertyResolver);
        registerSingleton(registry, beanName, globalProperties);
    }
​
    public static void registerSingleton(BeanDefinitionRegistry registry, String beanName, Object singletonObject) {
        SingletonBeanRegistry beanRegistry = null;
        if (registry instanceof SingletonBeanRegistry) {
            beanRegistry = (SingletonBeanRegistry) registry;
        } else if (registry instanceof AbstractApplicationContext) {
            // Maybe AbstractApplicationContext or its sub-classes
            beanRegistry = ((AbstractApplicationContext) registry).getBeanFactory();
        }
        // Register Singleton Object if possible
        if (beanRegistry != null) {
            // Determine in advance whether injected with beans
            if (!beanRegistry.containsSingleton(beanName)) {
                beanRegistry.registerSingleton(beanName, singletonObject);
            }
        }
    }
​
    //......
}
  • NacosBeanUtils的registerGlobalNacosProperties方法从AnnotationAttributes获取globalProperties的AnnotationAttributes,然后通过registerGlobalNacosProperties解析AnnotationAttributes的属性,最后registerSingleton

小结

NacosDiscoveryEndpointsAutoConfiguration注册了NacosDiscoveryEndpoint;NacosDiscoveryEndpoint提供了一个ReadOperation,它返回的map里头会有nacosDiscoveryGlobalProperties及namingServersStatus;namingServersStatus是个JSONArray,每个JSONArray的元素是个JSONObject,JSONObject有servicesOfServer、subscribeServices;其中servicesOfServer通过namingService.getServicesOfServer(0, PAGE_SIZE)获取,PAGE_SIZE为100

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NacosDiscoveryEndpointsAutoConfiguration
  • NacosDiscoveryEndpoint
  • NacosDiscoveryBeanDefinitionRegistrar
  • NacosBeanUtils
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档