#1550 流程调通

This commit is contained in:
rushsky518 2019-08-15 17:37:03 +08:00
parent 192610b4c9
commit 1877e7d307
8 changed files with 273 additions and 26 deletions

View File

@ -50,7 +50,12 @@ public enum ConfigType {
/** /**
* config type is "yaml" * config type is "yaml"
*/ */
YAML("yaml"); YAML("yaml"),
/**
* config type is "yaml"
*/
YML("yml");
String type; String type;

View File

@ -116,6 +116,10 @@
<artifactId>mockito-core</artifactId> <artifactId>mockito-core</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
</dependencies> </dependencies>

View File

@ -16,7 +16,9 @@
package com.alibaba.nacos.client.config.impl; package com.alibaba.nacos.client.config.impl;
import com.alibaba.nacos.api.common.Constants; import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.listener.AbstractSharedListener; import com.alibaba.nacos.api.config.listener.AbstractSharedListener;
import com.alibaba.nacos.client.config.listener.impl.ConfigChangeListener;
import com.alibaba.nacos.api.config.listener.Listener; import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.client.config.filter.impl.ConfigFilterChainManager; import com.alibaba.nacos.client.config.filter.impl.ConfigFilterChainManager;
@ -60,6 +62,7 @@ public class CacheData {
} }
public void setContent(String newContent) { public void setContent(String newContent) {
this.lastContent = this.content;
this.content = newContent; this.content = newContent;
this.md5 = getMd5String(content); this.md5 = getMd5String(content);
} }
@ -188,6 +191,15 @@ public class CacheData {
configFilterChainManager.doFilter(null, cr); configFilterChainManager.doFilter(null, cr);
String contentTmp = cr.getContent(); String contentTmp = cr.getContent();
listener.receiveConfigInfo(contentTmp); listener.receiveConfigInfo(contentTmp);
if (listener instanceof ConfigChangeListener) {
if (dataId.endsWith(ConfigType.YAML.getType()) || dataId.endsWith(ConfigType.YML.getType())
|| dataId.endsWith(ConfigType.PROPERTIES.getType())) {
// compare lastContent and content
ConfigChangeEvent event = new ConfigChangeEvent(dataId, lastContent, content);
((ConfigChangeListener)listener).receiveConfigChange(event);
}
}
listenerWrap.lastCallMd5 = md5; listenerWrap.lastCallMd5 = md5;
LOGGER.info("[{}] [notify-ok] dataId={}, group={}, md5={}, listener={} ", name, dataId, group, md5, LOGGER.info("[{}] [notify-ok] dataId={}, group={}, md5={}, listener={} ", name, dataId, group, md5,
listener); listener);
@ -279,6 +291,7 @@ public class CacheData {
* last modify time * last modify time
*/ */
private volatile long localConfigLastModified; private volatile long localConfigLastModified;
private volatile String lastContent;
private volatile String content; private volatile String content;
private int taskId; private int taskId;
private volatile boolean isInitializing = true; private volatile boolean isInitializing = true;

View File

@ -0,0 +1,99 @@
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.nacos.client.config.impl;
import com.alibaba.nacos.api.config.ConfigType;
import org.yaml.snakeyaml.Yaml;
import java.io.IOException;
import java.io.StringReader;
import java.util.*;
/**
* ConfigChangeEvent
*
* @author rushsky518
*/
public class ConfigChangeEvent {
private Map<String, ConfigChangeItem> result;
public ConfigChangeEvent(String dataId, String oldContent, String content) {
init(dataId, oldContent, content);
}
public ConfigChangeItem getChangeItem(String key) {
return result.get(key);
}
public Collection<ConfigChangeItem> getChangeItems() {
return result.values();
}
private void init(String dataId, String oldContent, String content) {
result = new HashMap<String, ConfigChangeItem>(32);
if (dataId.endsWith(ConfigType.PROPERTIES.getType())) {
Properties oldProp = new Properties();
Properties newProp = new Properties();
try {
oldProp.load(new StringReader(oldContent));
newProp.load(new StringReader(content));
filterData(oldProp, newProp);
} catch (IOException e) {
e.printStackTrace();
}
}
if (dataId.endsWith(ConfigType.YML.getType()) || dataId.endsWith(ConfigType.YAML.getType())) {
Yaml oldYaml = new Yaml();
Yaml newYaml = new Yaml();
Map<String, Object> oldMap = oldYaml.load(oldContent);
Map<String, Object> newMap = newYaml.load(content);
filterData(oldMap, newMap);
}
}
private void filterData(Map oldMap, Map newMap) {
for (Iterator<Map.Entry<String, Object>> entryItr = oldMap.entrySet().iterator(); entryItr.hasNext();) {
Map.Entry<String, Object> e = entryItr.next();
ConfigChangeItem cci = null;
if (newMap.containsKey(e.getKey())) {
if (e.getValue().equals(newMap.get(e.getKey()))) {
continue;
}
cci = new ConfigChangeItem(e.getKey(), e.getValue().toString(), newMap.get(e.getKey()).toString());
cci.setType(ConfigChangeItem.PropertyChangeType.MODIFIED);
} else {
cci = new ConfigChangeItem(e.getKey(), e.getValue().toString(), null);
cci.setType(ConfigChangeItem.PropertyChangeType.DELETED);
}
result.put(e.getKey(), cci);
}
for (Iterator<Map.Entry<String, Object>> entryItr = newMap.entrySet().iterator(); entryItr.hasNext();) {
Map.Entry<String, Object> e = entryItr.next();
if (!oldMap.containsKey(e.getKey())) {
ConfigChangeItem cci = new ConfigChangeItem(e.getKey(), null, e.getValue().toString());
cci.setType(ConfigChangeItem.PropertyChangeType.ADDED);
result.put(e.getKey(), cci);
}
}
}
}

View File

@ -0,0 +1,85 @@
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.nacos.client.config.impl;
/**
* ConfigChangeItem
*
* @author rushsky518
*/
public class ConfigChangeItem {
private String key;
private String oldValue;
private String newValue;
private PropertyChangeType type;
public enum PropertyChangeType {
/** add */
ADDED,
/** modified */
MODIFIED,
/** deleted */
DELETED
}
public ConfigChangeItem(String key, String oldValue, String newValue) {
this.key = key;
this.oldValue = oldValue;
this.newValue = newValue;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getOldValue() {
return oldValue;
}
public void setOldValue(String oldValue) {
this.oldValue = oldValue;
}
public String getNewValue() {
return newValue;
}
public void setNewValue(String newValue) {
this.newValue = newValue;
}
public PropertyChangeType getType() {
return type;
}
public void setType(PropertyChangeType type) {
this.type = type;
}
@Override
public String toString() {
return "ConfigChangeItem{" +
"key='" + key + '\'' +
", oldValue='" + oldValue + '\'' +
", newValue='" + newValue + '\'' +
", type=" + type +
'}';
}
}

View File

@ -0,0 +1,37 @@
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.nacos.client.config.listener.impl;
import com.alibaba.nacos.api.config.listener.AbstractListener;
import com.alibaba.nacos.client.config.impl.ConfigChangeEvent;
/**
* ConfigChangeListener
*
* @author rushsky518
*/
@SuppressWarnings("PMD.AbstractClassShouldStartWithAbstractNamingRule")
public abstract class ConfigChangeListener extends AbstractListener {
/**
* handle config change
* @param event
*/
public abstract void receiveConfigChange(final ConfigChangeEvent event);
@Override
public void receiveConfigInfo(final String configInfo) {}
}

View File

@ -38,3 +38,9 @@ server.tomcat.basedir=
#nacos.security.ignore.urls=/** #nacos.security.ignore.urls=/**
nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/** nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

View File

@ -16,11 +16,12 @@
package com.alibaba.nacos.example; package com.alibaba.nacos.example;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.Executor; import java.util.concurrent.locks.LockSupport;
import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.client.config.impl.ConfigChangeEvent;
import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener; import com.alibaba.nacos.client.config.listener.impl.ConfigChangeListener;
import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.exception.NacosException;
/** /**
@ -32,39 +33,36 @@ public class ConfigExample {
public static void main(String[] args) throws NacosException, InterruptedException { public static void main(String[] args) throws NacosException, InterruptedException {
String serverAddr = "localhost"; String serverAddr = "localhost";
String dataId = "test"; String dataId = "redis.properties";
String group = "DEFAULT_GROUP"; String group = "multi-data-ids";
Properties properties = new Properties(); Properties properties = new Properties();
properties.put("serverAddr", serverAddr); properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties); ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000); String content = configService.getConfig(dataId, group, 5000);
System.out.println(content); System.out.println(content);
configService.addListener(dataId, group, new Listener() { configService.addListener(dataId, group, new ConfigChangeListener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("receive:" + configInfo);
}
@Override @Override
public Executor getExecutor() { public void receiveConfigChange(final ConfigChangeEvent event) {
return null; System.out.println(event.getChangeItems());
} }
}); });
boolean isPublishOk = configService.publishConfig(dataId, group, "content"); LockSupport.park();
System.out.println(isPublishOk); // boolean isPublishOk = configService.publishConfig(dataId, group, "content");
// System.out.println(isPublishOk);
Thread.sleep(3000); //
content = configService.getConfig(dataId, group, 5000); // Thread.sleep(3000);
System.out.println(content); // content = configService.getConfig(dataId, group, 5000);
// System.out.println(content);
boolean isRemoveOk = configService.removeConfig(dataId, group); //
System.out.println(isRemoveOk); // boolean isRemoveOk = configService.removeConfig(dataId, group);
Thread.sleep(3000); // System.out.println(isRemoveOk);
// Thread.sleep(3000);
content = configService.getConfig(dataId, group, 5000); //
System.out.println(content); // content = configService.getConfig(dataId, group, 5000);
Thread.sleep(300000); // System.out.println(content);
// Thread.sleep(300000);
} }
} }