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