diff --git a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/pom.xml b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/pom.xml index 4bc2ab72..09c886ab 100644 --- a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/pom.xml +++ b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/pom.xml @@ -64,6 +64,47 @@ true + + com.tencent.polaris + polaris-configuration-factory + ${polaris.version} + true + + + com.tencent.polaris + router-rule + + + com.tencent.polaris + router-nearby + + + com.tencent.polaris + router-metadata + + + com.tencent.polaris + router-canary + + + com.tencent.polaris + router-set + + + com.tencent.polaris + router-isolated + + + com.tencent.polaris + router-healthy + + + io.grpc + grpc-all + + + + org.springframework.boot spring-boot-configuration-processor diff --git a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/config/ConfigHandlerConfiguration.java b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/config/ConfigHandlerConfiguration.java index c77536a8..8cfb4264 100644 --- a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/config/ConfigHandlerConfiguration.java +++ b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/config/ConfigHandlerConfiguration.java @@ -20,9 +20,11 @@ package cn.hippo4j.config.springboot.starter.config; import cn.hippo4j.config.springboot.starter.refresher.*; import com.alibaba.cloud.nacos.NacosConfigManager; import com.alibaba.nacos.api.config.ConfigService; +import com.tencent.polaris.configuration.api.core.ConfigFileService; import io.etcd.jetcd.Client; import lombok.RequiredArgsConstructor; import org.apache.curator.framework.CuratorFramework; + import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -35,68 +37,79 @@ import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) public class ConfigHandlerConfiguration { - private static final String NACOS_CONFIG_MANAGER_KEY = "com.alibaba.cloud.nacos.NacosConfigManager"; + private static final String NACOS_CONFIG_MANAGER_KEY = "com.alibaba.cloud.nacos.NacosConfigManager"; + + private static final String NACOS_DATA_ID_KEY = "nacos.data-id"; + + private static final String APOLLO_NAMESPACE_KEY = "apollo.namespace"; - private static final String NACOS_DATA_ID_KEY = "nacos.data-id"; + private static final String ZOOKEEPER_CONNECT_STR_KEY = "zookeeper.zk-connect-str"; - private static final String APOLLO_NAMESPACE_KEY = "apollo.namespace"; + private static final String ETCD = "etcd.endpoints"; - private static final String ZOOKEEPER_CONNECT_STR_KEY = "zookeeper.zk-connect-str"; + private static final String POLARIS = "config.serverConnector"; - private static final String ETCD = "etcd.endpoints"; + @RequiredArgsConstructor + @ConditionalOnClass(ConfigService.class) + @ConditionalOnMissingClass(NACOS_CONFIG_MANAGER_KEY) + @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = NACOS_DATA_ID_KEY) + static class EmbeddedNacos { - @RequiredArgsConstructor - @ConditionalOnClass(ConfigService.class) - @ConditionalOnMissingClass(NACOS_CONFIG_MANAGER_KEY) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = NACOS_DATA_ID_KEY) - static class EmbeddedNacos { + public final BootstrapConfigProperties bootstrapConfigProperties; - public final BootstrapConfigProperties bootstrapConfigProperties; + @Bean + public NacosRefresherHandler nacosRefresherHandler() { + return new NacosRefresherHandler(bootstrapConfigProperties); + } + } - @Bean - public NacosRefresherHandler nacosRefresherHandler() { - return new NacosRefresherHandler(bootstrapConfigProperties); - } - } + @ConditionalOnClass(NacosConfigManager.class) + @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = NACOS_DATA_ID_KEY) + static class EmbeddedNacosCloud { - @ConditionalOnClass(NacosConfigManager.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = NACOS_DATA_ID_KEY) - static class EmbeddedNacosCloud { + @Bean + public NacosCloudRefresherHandler nacosCloudRefresherHandler() { + return new NacosCloudRefresherHandler(); + } + } - @Bean - public NacosCloudRefresherHandler nacosCloudRefresherHandler() { - return new NacosCloudRefresherHandler(); - } - } + @ConditionalOnClass(com.ctrip.framework.apollo.ConfigService.class) + @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = APOLLO_NAMESPACE_KEY) + static class EmbeddedApollo { - @ConditionalOnClass(com.ctrip.framework.apollo.ConfigService.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = APOLLO_NAMESPACE_KEY) - static class EmbeddedApollo { + @Bean + public ApolloRefresherHandler apolloRefresher() { + return new ApolloRefresherHandler(); + } + } - @Bean - public ApolloRefresherHandler apolloRefresher() { - return new ApolloRefresherHandler(); - } - } + @ConditionalOnClass(CuratorFramework.class) + @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = ZOOKEEPER_CONNECT_STR_KEY) + static class EmbeddedZookeeper { - @ConditionalOnClass(CuratorFramework.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = ZOOKEEPER_CONNECT_STR_KEY) - static class EmbeddedZookeeper { + @Bean + public ZookeeperRefresherHandler zookeeperRefresher() { + return new ZookeeperRefresherHandler(); + } + } - @Bean - public ZookeeperRefresherHandler zookeeperRefresher() { - return new ZookeeperRefresherHandler(); - } - } + @ConditionalOnClass(Client.class) + @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = ETCD) + static class EmbeddedEtcd { - @ConditionalOnClass(Client.class) - @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = ETCD) - static class EmbeddedEtcd { + @Bean + public EtcdRefresherHandler etcdRefresher() { + return new EtcdRefresherHandler(); + } + } - @Bean - public EtcdRefresherHandler etcdRefresher() { - return new EtcdRefresherHandler(); - } - } + @ConditionalOnClass(ConfigFileService.class) + @ConditionalOnProperty(prefix = BootstrapConfigProperties.PREFIX, name = POLARIS) + static class Polaris { + @Bean + public PolarisRefresherHandler polarisRefresher(ConfigFileService configFileService) { + return new PolarisRefresherHandler(configFileService); + } + } } diff --git a/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java new file mode 100644 index 00000000..4be903fd --- /dev/null +++ b/hippo4j-spring-boot/hippo4j-config-spring-boot-starter/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java @@ -0,0 +1,68 @@ +package cn.hippo4j.config.springboot.starter.refresher; + +import java.util.Map; +import java.util.Objects; + +import com.google.common.collect.Maps; +import com.tencent.polaris.configuration.api.core.ConfigFileService; +import com.tencent.polaris.configuration.api.core.ConfigKVFile; +import com.tencent.polaris.configuration.api.core.ConfigKVFileChangeListener; +import com.tencent.polaris.configuration.api.core.ConfigPropertyChangeInfo; +import lombok.RequiredArgsConstructor; + +import org.springframework.beans.factory.annotation.Value; + +/** + *@author : wh + *@date : 2022/10/1 15:24 + *@description: + */ +@RequiredArgsConstructor +public class PolarisRefresherHandler extends AbstractConfigThreadPoolDynamicRefresh { + + private final ConfigFileService configFileService; + + private static final String POLARIS_NAMESPACE = "${spring.dynamic.thread-pool.polaris.namespace:dev}"; + + private static final String POLARIS_FILE_GROUP = "${spring.dynamic.thread-pool.polaris.file.group:dynamic}"; + + private static final String POLARIS_FILE_NAME = "${spring.dynamic.thread-pool.polaris.file.name:root/bootstrap.yaml}"; + + private static final String POLARIS_FILE_TYPE = "${spring.dynamic.thread-pool.polaris.file.type:properties}"; + + @Value(POLARIS_NAMESPACE) + private String namespace; + + @Value(POLARIS_FILE_GROUP) + private String fileGroup; + + @Value(POLARIS_FILE_NAME) + private String fileName; + + + @Override + public String getProperties() { + ConfigKVFile configFile = getConfigKVFile(); + configFile.getContent(); + return configFile.getContent(); + } + + @Override + public void afterPropertiesSet() { + ConfigKVFile configFile = getConfigKVFile(); + configFile.addChangeListener((ConfigKVFileChangeListener) event -> { + String content = configFile.getContent(); + Map newChangeValueMap = Maps.newHashMap(); + for (String key : event.changedKeys()) { + ConfigPropertyChangeInfo changeInfo = event.getChangeInfo(key); + newChangeValueMap.put(key, changeInfo.getNewValue()); + } + dynamicRefresh(content, newChangeValueMap); + }); + } + + private ConfigKVFile getConfigKVFile() { + return Objects.equals(POLARIS_FILE_TYPE, "yaml") ? configFileService.getConfigYamlFile(namespace, fileGroup, fileName) : configFileService.getConfigPropertiesFile(namespace, fileGroup, fileName); + } + +} diff --git a/pom.xml b/pom.xml index 51fd6e3f..66f1ba0b 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,7 @@ 2.3.2.RELEASE 1.9.1 0.7.3 + 1.7.2 2.2.2 4.1.56.Final 9.0.55