Commit 7415f908 by Nepxion

优化过滤算法

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