Commit 06cbe6ef by Nepxion

支持Apollo配置中间件

parent c1a7d538
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<artifactId>discovery-common-apollo</artifactId>
<name>Nepxion Discovery Common Apollo</name>
<packaging>jar</packaging>
<modelVersion>4.0.0</modelVersion>
<description>Nepxion Discovery is an enhancement for Spring Cloud Discovery</description>
<url>http://www.nepxion.com</url>
<parent>
<groupId>com.nepxion</groupId>
<artifactId>discovery</artifactId>
<version>4.7.7</version>
</parent>
<dependencies>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.nepxion.discovery.common.apollo.configuration;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
import com.nepxion.discovery.common.apollo.constant.ApolloConstant;
import com.nepxion.discovery.common.apollo.operation.ApolloOperation;
@Configuration
public class ApolloAutoConfiguration {
@Autowired
private Environment environment;
@Bean
@ConditionalOnMissingBean
public Config apolloConfig() {
String namespace = environment.getProperty(ApolloConstant.NAMESPACE);
if (StringUtils.isNotEmpty(namespace)) {
return ConfigService.getConfig(namespace);
} else {
return ConfigService.getAppConfig();
}
}
@Bean
public ApolloOperation apolloOperation() {
return new ApolloOperation();
}
}
\ No newline at end of file
package com.nepxion.discovery.common.apollo.constant;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import com.ctrip.framework.apollo.core.ConfigConsts;
public class ApolloConstant implements ConfigConsts {
public static final String NAMESPACE = "apollo.discovery.namespace";
}
\ No newline at end of file
package com.nepxion.discovery.common.apollo.operation;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.beans.factory.annotation.Autowired;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigChangeListener;
import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.google.common.collect.Sets;
public class ApolloOperation {
@Autowired
private Config apolloConfig;
public String getConfig(String group, String serviceId) {
return apolloConfig.getProperty(group + "-" + serviceId, null);
}
public ConfigChangeListener subscribeConfig(String group, String serviceId, ApolloSubscribeCallback subscribeCallback) {
ConfigChangeListener configListener = new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent changeEvent) {
ConfigChange change = changeEvent.getChange(group + "-" + serviceId);
String config = change.getNewValue();
subscribeCallback.callback(config);
}
};
apolloConfig.addChangeListener(configListener, Sets.newHashSet(group + "-" + serviceId));
return configListener;
}
public void unsubscribeConfig(String group, String serviceId, ConfigChangeListener configListener) {
}
}
\ No newline at end of file
package com.nepxion.discovery.common.apollo.operation;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
public interface ApolloSubscribeCallback {
void callback(String config);
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<artifactId>discovery-plugin-config-center-starter-apollo</artifactId>
<name>Nepxion Discovery Plugin Config Center Starter Apollo</name>
<packaging>jar</packaging>
<modelVersion>4.0.0</modelVersion>
<description>Nepxion Discovery is an enhancement for Spring Cloud Discovery</description>
<url>http://www.nepxion.com</url>
<parent>
<groupId>com.nepxion</groupId>
<artifactId>discovery</artifactId>
<version>4.7.7</version>
</parent>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>discovery-plugin-config-center</artifactId>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>discovery-common-apollo</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.nepxion.discovery.plugin.configcenter.apollo.adapter;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import javax.annotation.PostConstruct;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.ctrip.framework.apollo.ConfigChangeListener;
import com.nepxion.discovery.common.apollo.operation.ApolloOperation;
import com.nepxion.discovery.common.apollo.operation.ApolloSubscribeCallback;
import com.nepxion.discovery.common.entity.RuleEntity;
import com.nepxion.discovery.plugin.configcenter.adapter.ConfigAdapter;
import com.nepxion.discovery.plugin.framework.adapter.PluginAdapter;
import com.nepxion.discovery.plugin.framework.context.PluginContextAware;
import com.nepxion.discovery.plugin.framework.event.RuleClearedEvent;
import com.nepxion.discovery.plugin.framework.event.RuleUpdatedEvent;
public class ApolloConfigAdapter extends ConfigAdapter {
private static final Logger LOG = LoggerFactory.getLogger(ApolloConfigAdapter.class);
@Autowired
protected PluginContextAware pluginContextAware;
@Autowired
private PluginAdapter pluginAdapter;
@Autowired
private ApolloOperation apolloOperation;
private ConfigChangeListener partialListener;
private ConfigChangeListener globalListener;
@Override
public String getConfig() throws Exception {
String config = getConfig(false);
if (StringUtils.isNotEmpty(config)) {
return config;
} else {
LOG.info("No partial config is retrieved from Apollo server");
}
config = getConfig(true);
if (StringUtils.isNotEmpty(config)) {
return config;
} else {
LOG.info("No global config is retrieved from Apollo server");
}
return null;
}
private String getConfig(boolean globalConfig) throws Exception {
String groupKey = pluginContextAware.getGroupKey();
String group = pluginAdapter.getGroup();
String serviceId = pluginAdapter.getServiceId();
LOG.info("Get {} config from Apollo server, {}={}, serviceId={}", getConfigType(globalConfig), groupKey, group, serviceId);
return apolloOperation.getConfig(group, globalConfig ? group : serviceId);
}
@PostConstruct
public void subscribeConfig() {
partialListener = subscribeConfig(false);
globalListener = subscribeConfig(true);
}
private ConfigChangeListener subscribeConfig(boolean globalConfig) {
String groupKey = pluginContextAware.getGroupKey();
String group = pluginAdapter.getGroup();
String serviceId = pluginAdapter.getServiceId();
LOG.info("Subscribe {} config from Apollo server, {}={}, serviceId={}", getConfigType(globalConfig), groupKey, group, serviceId);
try {
return apolloOperation.subscribeConfig(group, globalConfig ? group : serviceId, new ApolloSubscribeCallback() {
@Override
public void callback(String config) {
if (StringUtils.isNotEmpty(config)) {
LOG.info("Get {} config updated event from Apollo server, {}={}, serviceId={}", getConfigType(globalConfig), groupKey, group, serviceId);
RuleEntity ruleEntity = pluginAdapter.getRule();
String rule = null;
if (ruleEntity != null) {
rule = ruleEntity.getContent();
}
if (!StringUtils.equals(rule, config)) {
fireRuleUpdated(new RuleUpdatedEvent(config), true);
} else {
LOG.info("Retrieved {} config from Apollo server is same as current config, ignore to update, {}={}, serviceId={}", getConfigType(globalConfig), groupKey, group, serviceId);
}
} else {
LOG.info("Get {} config cleared event from Apollo server, {}={}, serviceId={}", getConfigType(globalConfig), groupKey, group, serviceId);
fireRuleCleared(new RuleClearedEvent(), true);
}
}
});
} catch (Exception e) {
LOG.error("Subscribe " + getConfigType(globalConfig) + " config from Apollo server failed, " + groupKey + "=" + group + ", serviceId=" + serviceId, e);
}
return null;
}
@Override
public void close() {
unsubscribeConfig(partialListener, false);
unsubscribeConfig(globalListener, true);
}
private void unsubscribeConfig(ConfigChangeListener configListener, boolean globalConfig) {
if (configListener == null) {
return;
}
String groupKey = pluginContextAware.getGroupKey();
String group = pluginAdapter.getGroup();
String serviceId = pluginAdapter.getServiceId();
LOG.info("Unsubscribe {} config from Apollo server, {}={}, serviceId={}", getConfigType(globalConfig), groupKey, group, serviceId);
apolloOperation.unsubscribeConfig(group, globalConfig ? group : serviceId, configListener);
}
private String getConfigType(boolean globalConfig) {
return globalConfig ? "global" : "partial";
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.configcenter.apollo.configuration;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.nepxion.discovery.plugin.configcenter.adapter.ConfigAdapter;
import com.nepxion.discovery.plugin.configcenter.apollo.adapter.ApolloConfigAdapter;
@Configuration
public class ApolloConfigAutoConfiguration {
@Bean
public ConfigAdapter configAdapter() {
return new ApolloConfigAdapter();
}
}
\ No newline at end of file
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.nepxion.discovery.common.nacos.configuration.NacosAutoConfiguration,\
com.nepxion.discovery.plugin.configcenter.nacos.configuration.NacosConfigAutoConfiguration
\ No newline at end of file
......@@ -18,9 +18,15 @@ spring.cloud.zookeeper.discovery.preferIpAddress=true
ribbon.ReadTimeout=60000
ribbon.ConnectTimeout=60000
# Apollo config
app.id=${spring.application.name}
apollo.meta=http://localhost:8080
# apollo.discovery.namespace=discovery
# Nacos config
nacos.url=localhost:8080
nacos.timout=30000
# nacos.discovery.namespace=discovery
# nacos.discovery.timout=30000
# Redis config
spring.redis.host=localhost
......
......@@ -18,9 +18,15 @@ spring.cloud.zookeeper.discovery.preferIpAddress=true
ribbon.ReadTimeout=60000
ribbon.ConnectTimeout=60000
# Apollo config
app.id=${spring.application.name}
apollo.meta=http://localhost:8080
# apollo.discovery.namespace=discovery
# Nacos config
nacos.url=localhost:8080
nacos.timout=30000
# nacos.discovery.namespace=discovery
# nacos.discovery.timout=30000
# Redis config
spring.redis.host=localhost
......
......@@ -19,9 +19,15 @@ spring.cloud.zookeeper.discovery.preferIpAddress=true
ribbon.ReadTimeout=60000
ribbon.ConnectTimeout=60000
# Apollo config
app.id=${spring.application.name}
apollo.meta=http://localhost:8080
# apollo.discovery.namespace=discovery
# Nacos config
nacos.url=localhost:8080
nacos.timout=30000
# nacos.discovery.namespace=discovery
# nacos.discovery.timout=30000
# Redis config
spring.redis.host=localhost
......
......@@ -18,9 +18,15 @@ spring.cloud.zookeeper.discovery.preferIpAddress=true
ribbon.ReadTimeout=60000
ribbon.ConnectTimeout=60000
# Apollo config
app.id=${spring.application.name}
apollo.meta=http://localhost:8080
# apollo.discovery.namespace=discovery
# Nacos config
nacos.url=localhost:8080
nacos.timout=30000
# nacos.discovery.namespace=discovery
# nacos.discovery.timout=30000
# Redis config
spring.redis.host=localhost
......
......@@ -12,6 +12,7 @@
<modules>
<module>discovery-common</module>
<module>discovery-common-apollo</module>
<module>discovery-common-nacos</module>
<module>discovery-common-redis</module>
<module>discovery-plugin-framework</module>
......@@ -19,6 +20,7 @@
<module>discovery-plugin-framework-consul</module>
<module>discovery-plugin-framework-zookeeper</module>
<module>discovery-plugin-config-center</module>
<module>discovery-plugin-config-center-starter-apollo</module>
<module>discovery-plugin-config-center-starter-nacos</module>
<module>discovery-plugin-config-center-starter-redis</module>
<module>discovery-plugin-admin-center</module>
......@@ -48,6 +50,7 @@
<commons.collections4.version>4.1</commons.collections4.version>
<commons.io.version>2.5</commons.io.version>
<dom4j.version>1.6.1</dom4j.version>
<apollo.version>1.0.0</apollo.version>
<nacos.version>0.1.0</nacos.version>
<guava.version>26.0-jre</guava.version>
<caffeine.version>2.6.2</caffeine.version>
......@@ -69,6 +72,12 @@
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>discovery-common-apollo</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>discovery-common-nacos</artifactId>
<version>${project.version}</version>
</dependency>
......@@ -111,6 +120,12 @@
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>discovery-plugin-config-center-starter-apollo</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>discovery-plugin-config-center-starter-nacos</artifactId>
<version>${project.version}</version>
</dependency>
......@@ -236,6 +251,12 @@
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>${apollo.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment