首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊NacosConfigEndpointAutoConfiguration

聊聊NacosConfigEndpointAutoConfiguration

作者头像
code4it
发布2019-09-29 20:12:25
6740
发布2019-09-29 20:12:25
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下NacosConfigEndpointAutoConfiguration

NacosConfigEndpointAutoConfiguration

nacos-spring-boot-project/nacos-config-spring-boot-actuator/src/main/java/com/alibaba/boot/nacos/actuate/autoconfigure/NacosConfigEndpointAutoConfiguration.java

@Configuration
public class NacosConfigEndpointAutoConfiguration {

@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
public NacosConfigEndpoint nacosEndpoint() {
        return new NacosConfigEndpoint();
}

}
  • NacosConfigEndpointAutoConfiguration创建了NacosConfigEndpoint

NacosConfigEndpoint

nacos-spring-boot-project/nacos-config-spring-boot-actuator/src/main/java/com/alibaba/boot/nacos/actuate/endpoint/NacosConfigEndpoint.java

@Endpoint(id = NacosConfigConstants.ENDPOINT_PREFIX)
public class NacosConfigEndpoint
        implements ApplicationListener<NacosConfigMetadataEvent> {

@Autowired
private ApplicationContext applicationContext;

private Map<String, JSONObject> nacosConfigMetadataMap = new HashMap<>();

@ReadOperation
public Map<String, Object> invoke() {
        Map<String, Object> result = new HashMap<>();

        if (!(ClassUtils.isAssignable(applicationContext.getEnvironment().getClass(),
                ConfigurableEnvironment.class))) {
            result.put("error", "environment type not match ConfigurableEnvironment: "
                    + applicationContext.getEnvironment().getClass().getName());
        }
        else {

            result.put("nacosConfigMetadata", nacosConfigMetadataMap.values());

            result.put("nacosConfigGlobalProperties",
                    PropertiesUtils.extractSafeProperties(applicationContext.getBean(
                            CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME, Properties.class)));
        }

        return result;
}

@Override
public void onApplicationEvent(NacosConfigMetadataEvent event) {
        String key = buildMetadataKey(event);
        if (StringUtils.isNotEmpty(key) && !nacosConfigMetadataMap.containsKey(key)) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("groupId", event.getGroupId());
            jsonObject.put("dataId", event.getDataId());
            if (ClassUtils.isAssignable(event.getSource().getClass(),
                    AnnotationMetadata.class)) {
                jsonObject.put("origin", "NacosPropertySource");
                jsonObject.put("target",
                        ((AnnotationMetadata) event.getSource()).getClassName());
            }
            else if (ClassUtils.isAssignable(event.getSource().getClass(),
                    NacosConfigListener.class)) {
                jsonObject.put("origin", "NacosConfigListener");
                Method configListenerMethod = (Method) event.getAnnotatedElement();
                jsonObject.put("target",
                        configListenerMethod.getDeclaringClass().getName() + ":"
                                + configListenerMethod.toString());
            }
            else if (ClassUtils.isAssignable(event.getSource().getClass(),
                    NacosConfigurationProperties.class)) {
                jsonObject.put("origin", "NacosConfigurationProperties");
                jsonObject.put("target", event.getBeanType().getName());
            }
            else if (ClassUtils.isAssignable(event.getSource().getClass(),
                    Element.class)) {
                jsonObject.put("origin", "NacosPropertySource");
                jsonObject.put("target", event.getXmlResource().toString());
            }
            else {
                throw new RuntimeException("unknown NacosConfigMetadataEvent");
            }
            nacosConfigMetadataMap.put(key, jsonObject);
        }
}

private String buildMetadataKey(NacosConfigMetadataEvent event) {
        if (event.getXmlResource() != null) {
            return event.getGroupId() + NacosUtils.SEPARATOR + event.getDataId()
                    + NacosUtils.SEPARATOR + event.getXmlResource();
        }
        else {
            if (event.getBeanType() == null && event.getAnnotatedElement() == null) {
                return StringUtils.EMPTY;
            }
            return event.getGroupId() + NacosUtils.SEPARATOR + event.getDataId()
                    + NacosUtils.SEPARATOR + event.getBeanType() + NacosUtils.SEPARATOR
                    + event.getAnnotatedElement();
        }
}

}
  • NacosConfigEndpoint实现了ApplicationListener;其响应了NacosConfigMetadataEvent,它会判断nacosConfigMetadataMap是否存在指定key的信息,没有则解析event的数据构造该key的config metadata,然后放到nacosConfigMetadataMap;它还提供了ReadOperation的invoke方法,返回的map包含nacosConfigMetadata及nacosConfigGlobalProperties信息

小结

NacosConfigEndpointAutoConfiguration创建了NacosConfigEndpoint;NacosConfigEndpoint实现了ApplicationListener;其响应了NacosConfigMetadataEvent,它会判断nacosConfigMetadataMap是否存在指定key的信息,没有则解析event的数据构造该key的config metadata,然后放到nacosConfigMetadataMap;它还提供了ReadOperation的invoke方法,返回的map包含nacosConfigMetadata及nacosConfigGlobalProperties信息

doc

  • NacosConfigEndpointAutoConfiguration
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

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