Commit 7415f908 by Nepxion

优化过滤算法

parent 661238d1
......@@ -10,6 +10,7 @@ package com.nepxion.discovery.plugin.configcenter;
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
......@@ -24,11 +25,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.nepxion.discovery.plugin.configcenter.constant.ConfigConstant;
import com.nepxion.discovery.plugin.configcenter.xml.Dom4JParser;
import com.nepxion.discovery.plugin.framework.constant.PluginConstant;
import com.nepxion.discovery.plugin.framework.entity.DiscoveryEntity;
import com.nepxion.discovery.plugin.framework.entity.DiscoveryServiceEntity;
import com.nepxion.discovery.plugin.framework.entity.RuleEntity;
import com.nepxion.discovery.plugin.framework.entity.RegisterEntity;
import com.nepxion.discovery.plugin.framework.entity.RegisterFilterType;
import com.nepxion.discovery.plugin.framework.entity.RuleEntity;
import com.nepxion.discovery.plugin.framework.exception.PluginException;
public class ConfigParser extends Dom4JParser {
......@@ -43,7 +45,7 @@ public class ConfigParser extends Dom4JParser {
@SuppressWarnings("rawtypes")
@Override
protected void parseRoot(Element element) {
LOG.info("Start to parse plugin xml...");
LOG.info("Start to parse rule xml...");
int registerElementCount = element.elements(ConfigConstant.REGISTER_ELEMENT_NAME).size();
if (registerElementCount > 1) {
......@@ -96,10 +98,11 @@ public class ConfigParser extends Dom4JParser {
Attribute globalFilterAttribute = element.attribute(ConfigConstant.FILTER_VALUE_ATTRIBUTE_NAME);
if (globalFilterAttribute != null) {
String globalFilterValue = globalFilterAttribute.getData().toString().trim();
registerEntity.setFilterValue(globalFilterValue);
List<String> globalFilterValueList = parseList(globalFilterValue);
registerEntity.setFilterValueList(globalFilterValueList);
}
Map<String, String> filterMap = registerEntity.getFilterMap();
Map<String, List<String>> filterMap = registerEntity.getFilterMap();
for (Iterator elementIterator = element.elementIterator(); elementIterator.hasNext();) {
Object childElementObject = elementIterator.next();
......@@ -113,11 +116,12 @@ public class ConfigParser extends Dom4JParser {
String serviceName = serviceNameAttribute.getData().toString().trim();
Attribute filterValueAttribute = childElement.attribute(ConfigConstant.FILTER_VALUE_ATTRIBUTE_NAME);
String filterValue = null;
List<String> filterValueList = null;
if (filterValueAttribute != null) {
filterValue = filterValueAttribute.getData().toString().trim();
String filterValue = filterValueAttribute.getData().toString().trim();
filterValueList = parseList(filterValue);
}
filterMap.put(serviceName, filterValue);
filterMap.put(serviceName, filterValueList);
}
}
}
......@@ -149,13 +153,15 @@ public class ConfigParser extends Dom4JParser {
Attribute consumerVersionValueAttribute = childElement.attribute(ConfigConstant.CONSUMER_VERSION_VALUE_ATTRIBUTE_NAME);
if (consumerVersionValueAttribute != null) {
String consumerVersionValue = consumerVersionValueAttribute.getData().toString().trim();
serviceEntity.setConsumerVersionValue(consumerVersionValue);
List<String> consumerVersionValueList = parseList(consumerVersionValue);
serviceEntity.setConsumerVersionValueList(consumerVersionValueList);
}
Attribute providerVersionValueAttribute = childElement.attribute(ConfigConstant.PROVIDER_VERSION_VALUE_ATTRIBUTE_NAME);
if (providerVersionValueAttribute != null) {
String providerVersionValue = providerVersionValueAttribute.getData().toString().trim();
serviceEntity.setProviderVersionValue(providerVersionValue);
List<String> providerVersionValueList = parseList(providerVersionValue);
serviceEntity.setProviderVersionValueList(providerVersionValueList);
}
List<DiscoveryServiceEntity> serviceEntityList = serviceEntityMap.get(consumerServiceName);
......@@ -168,4 +174,14 @@ public class ConfigParser extends Dom4JParser {
}
}
}
private List<String> parseList(String value) {
if (StringUtils.isEmpty(value)) {
return null;
}
String[] valueArray = StringUtils.split(value, PluginConstant.SEPARATE);
return Arrays.asList(valueArray);
}
}
\ No newline at end of file
......@@ -10,6 +10,7 @@ package com.nepxion.discovery.plugin.framework.entity;
*/
import java.io.Serializable;
import java.util.List;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
......@@ -21,8 +22,8 @@ public class DiscoveryServiceEntity implements Serializable {
private String consumerServiceName;
private String providerServiceName;
private String consumerVersionValue;
private String providerVersionValue;
private List<String> consumerVersionValueList;
private List<String> providerVersionValueList;
public DiscoveryServiceEntity() {
......@@ -44,20 +45,20 @@ public class DiscoveryServiceEntity implements Serializable {
this.providerServiceName = providerServiceName;
}
public String getConsumerVersionValue() {
return consumerVersionValue;
public List<String> getConsumerVersionValueList() {
return consumerVersionValueList;
}
public void setConsumerVersionValue(String consumerVersionValue) {
this.consumerVersionValue = consumerVersionValue;
public void setConsumerVersionValueList(List<String> consumerVersionValueList) {
this.consumerVersionValueList = consumerVersionValueList;
}
public String getProviderVersionValue() {
return providerVersionValue;
public List<String> getProviderVersionValueList() {
return providerVersionValueList;
}
public void setProviderVersionValue(String providerVersionValue) {
this.providerVersionValue = providerVersionValue;
public void setProviderVersionValueList(List<String> providerVersionValueList) {
this.providerVersionValueList = providerVersionValueList;
}
@Override
......
......@@ -11,6 +11,7 @@ package com.nepxion.discovery.plugin.framework.entity;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.builder.EqualsBuilder;
......@@ -22,8 +23,8 @@ public class RegisterEntity implements Serializable {
private static final long serialVersionUID = -2097322826969006191L;
private RegisterFilterType filterType;
private String filterValue;
private Map<String, String> filterMap = new LinkedHashMap<String, String>();
private List<String> filterValueList;
private Map<String, List<String>> filterMap = new LinkedHashMap<String, List<String>>();
public RegisterEntity() {
......@@ -37,19 +38,19 @@ public class RegisterEntity implements Serializable {
this.filterType = filterType;
}
public String getFilterValue() {
return filterValue;
public List<String> getFilterValueList() {
return filterValueList;
}
public void setFilterValue(String filterValue) {
this.filterValue = filterValue;
public void setFilterValueList(List<String> filterValueList) {
this.filterValueList = filterValueList;
}
public Map<String, String> getFilterMap() {
public Map<String, List<String>> getFilterMap() {
return filterMap;
}
public void setFilterMap(Map<String, String> filterMap) {
public void setFilterMap(Map<String, List<String>> filterMap) {
this.filterMap = filterMap;
}
......
......@@ -10,7 +10,6 @@ package com.nepxion.discovery.plugin.framework.strategy;
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
......@@ -98,27 +97,24 @@ public class DiscoveryControlStrategy {
}
// 当前版本的消费端所能调用提供端的版本号列表
List<String> allFilterVersions = new ArrayList<String>();
List<String> allFilterValueList = new ArrayList<String>();
for (DiscoveryServiceEntity serviceEntity : serviceEntityList) {
String providerServiceName = serviceEntity.getProviderServiceName();
if (StringUtils.equals(providerServiceName, providerServiceId)) {
String consumerVersionValue = serviceEntity.getConsumerVersionValue();
String providerVersionValue = serviceEntity.getProviderVersionValue();
List<String> consumerVersionList = getVersionList(consumerVersionValue);
List<String> providerVersionList = getVersionList(providerVersionValue);
List<String> consumerVersionValueList = serviceEntity.getConsumerVersionValueList();
List<String> providerVersionValueList = serviceEntity.getProviderVersionValueList();
// 判断consumer-version-value值是否包含当前消费端的版本号
if (CollectionUtils.isNotEmpty(consumerVersionList) && consumerVersionList.contains(consumerServiceVersion)) {
if (CollectionUtils.isNotEmpty(providerVersionList)) {
allFilterVersions.addAll(providerVersionList);
if (CollectionUtils.isNotEmpty(consumerVersionValueList) && consumerVersionValueList.contains(consumerServiceVersion)) {
if (CollectionUtils.isNotEmpty(providerVersionValueList)) {
allFilterValueList.addAll(providerVersionValueList);
}
}
}
}
// 未找到相应的版本定义或者未定义
if (CollectionUtils.isEmpty(allFilterVersions)) {
if (CollectionUtils.isEmpty(allFilterValueList)) {
return;
}
......@@ -126,19 +122,9 @@ public class DiscoveryControlStrategy {
while (iterator.hasNext()) {
ServiceInstance serviceInstance = iterator.next();
String metaDataVersion = serviceInstance.getMetadata().get(PluginConstant.VRESION);
if (!allFilterVersions.contains(metaDataVersion)) {
if (!allFilterValueList.contains(metaDataVersion)) {
iterator.remove();
}
}
}
private List<String> getVersionList(String versionValue) {
if (StringUtils.isEmpty(versionValue)) {
return null;
}
String[] versionArray = StringUtils.split(versionValue, PluginConstant.SEPARATE);
return Arrays.asList(versionArray);
}
}
\ No newline at end of file
......@@ -9,18 +9,19 @@ package com.nepxion.discovery.plugin.framework.strategy;
* @version 1.0
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.nepxion.discovery.plugin.framework.constant.PluginConstant;
import com.nepxion.discovery.plugin.framework.entity.RuleEntity;
import com.nepxion.discovery.plugin.framework.entity.RegisterEntity;
import com.nepxion.discovery.plugin.framework.entity.RegisterFilterType;
import com.nepxion.discovery.plugin.framework.entity.RuleEntity;
import com.nepxion.discovery.plugin.framework.exception.PluginException;
public class RegisterControlStrategy {
......@@ -49,48 +50,44 @@ public class RegisterControlStrategy {
}
RegisterFilterType filterType = registerEntity.getFilterType();
List<String> globalFilterValueList = registerEntity.getFilterValueList();
Map<String, List<String>> filterMap = registerEntity.getFilterMap();
List<String> filterValueList = filterMap.get(serviceId);
String globalFilterValue = registerEntity.getFilterValue();
Map<String, String> filterMap = registerEntity.getFilterMap();
String filterValue = filterMap.get(serviceId);
String allFilterIpAddress = "";
if (StringUtils.isNotEmpty(globalFilterValue)) {
allFilterIpAddress += globalFilterValue;
List<String> allFilterValueList = new ArrayList<String>();
if (CollectionUtils.isNotEmpty(globalFilterValueList)) {
allFilterValueList.addAll(globalFilterValueList);
}
if (StringUtils.isNotEmpty(filterValue)) {
allFilterIpAddress += StringUtils.isEmpty(allFilterIpAddress) ? filterValue : PluginConstant.SEPARATE + filterValue;
if (CollectionUtils.isNotEmpty(filterValueList)) {
allFilterValueList.addAll(filterValueList);
}
switch (filterType) {
case BLACKLIST:
validateBlacklist(allFilterIpAddress, ipAddress);
validateBlacklist(allFilterValueList, ipAddress);
break;
case WHITELIST:
validateWhitelist(allFilterIpAddress, ipAddress);
validateWhitelist(allFilterValueList, ipAddress);
break;
}
}
private void validateBlacklist(String filterIpAddress, String ipAddress) {
LOG.info("********** IP address blacklist={}, current ip address={} **********", filterIpAddress, ipAddress);
private void validateBlacklist(List<String> allFilterValueList, String ipAddress) {
LOG.info("********** IP address blacklist={}, current ip address={} **********", allFilterValueList, ipAddress);
String[] filterArray = StringUtils.split(filterIpAddress, PluginConstant.SEPARATE);
for (String filter : filterArray) {
for (String filter : allFilterValueList) {
if (ipAddress.startsWith(filter)) {
throw new PluginException(ipAddress + " isn't allowed to register to Eureka server, because it is in blacklist");
}
}
}
private void validateWhitelist(String filterIpAddress, String ipAddress) {
LOG.info("********** IP address whitelist={}, current ip address={} **********", filterIpAddress, ipAddress);
private void validateWhitelist(List<String> allFilterValueList, String ipAddress) {
LOG.info("********** IP address whitelist={}, current ip address={} **********", allFilterValueList, ipAddress);
boolean valid = false;
String[] filterArray = StringUtils.split(filterIpAddress, PluginConstant.SEPARATE);
for (String filter : filterArray) {
for (String filter : allFilterValueList) {
if (ipAddress.startsWith(filter)) {
valid = true;
break;
......
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