headerList = StringUtil.splitToList(header, DiscoveryConstant.SEPARATE);
- for (String value : headerList) {
- String[] valueArray = StringUtils.split(value, DiscoveryConstant.EQUALS);
- String headerName = valueArray[0].trim();
- String headerValue = valueArray[1].trim();
-
- strategyConditionEntity.getConditionHeaderMap().put(headerName, headerValue);
- }
Attribute versionIdAttribute = childElement.attribute(ConfigConstant.VERSION_ELEMENT_NAME + DiscoveryConstant.DASH + ConfigConstant.ID_ATTRIBUTE_NAME);
if (versionIdAttribute != null) {
diff --git a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/util/SpelUtil.java b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/util/SpelUtil.java
new file mode 100644
index 0000000000..0d1efc9e75
--- /dev/null
+++ b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/util/SpelUtil.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.plugin.framework.util;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.Map;
+
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+
+public class SpelUtil {
+ private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser();
+
+ public static boolean eval(String expression, String mapKey, Map map) {
+ StandardEvaluationContext context = new StandardEvaluationContext();
+ context.setVariable(mapKey, map);
+
+ return eval(expression, context);
+ }
+
+ public static boolean eval(String expression, Map> map) {
+ StandardEvaluationContext context = new StandardEvaluationContext();
+ for (Map.Entry> entry : map.entrySet()) {
+ context.setVariable(entry.getKey(), entry.getValue());
+ }
+
+ return eval(expression, context);
+ }
+
+ public static boolean eval(String expression, StandardEvaluationContext context) {
+ Boolean result = EXPRESSION_PARSER.parseExpression(expression).getValue(context, Boolean.class);
+
+ return result != null ? result.booleanValue() : false;
+ }
+}
\ No newline at end of file
diff --git a/discovery-plugin-framework/src/test/java/com/nepxion/discovery/plugin/framework/loadbalance/SpelTest.java b/discovery-plugin-framework/src/test/java/com/nepxion/discovery/plugin/framework/loadbalance/SpelTest.java
new file mode 100644
index 0000000000..f5bf4ff3f9
--- /dev/null
+++ b/discovery-plugin-framework/src/test/java/com/nepxion/discovery/plugin/framework/loadbalance/SpelTest.java
@@ -0,0 +1,68 @@
+package com.nepxion.discovery.plugin.framework.loadbalance;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.nepxion.discovery.common.util.StringUtil;
+import com.nepxion.discovery.plugin.framework.util.SpelUtil;
+
+public class SpelTest {
+ public static void main(String[] args) {
+ System.out.println(test1());
+ System.out.println(test2());
+ System.out.println(test3());
+ }
+
+ private static boolean test1() {
+ // String expression = "#H['a'] == '123' && #H['b'] == '456'";
+ // String expression = "#H['a'] == '123' || #H['b'] == '456'";
+ // String expression = "#H['a'] >= '123' && #H['b'] <= '456'";
+ // String expression = "#H['a'] >= '123' || #H['b'] <= '456'";
+ String expression = "#H['a'] != '123' || #H['b'] != '456'";
+
+ Map headerMap = new HashMap();
+ headerMap.put("a", "123");
+ headerMap.put("b", "456");
+
+ return SpelUtil.eval(expression, "H", headerMap);
+ }
+
+ private static List test2() {
+ String regex = "\\#H\\['\\S+'\\]";
+ Pattern pattern = Pattern.compile(regex);
+
+ String expression = "#H['a-A'] != '123' || #H['b//SS'] != '456' && #H['C**44!!66'] = 123";
+ Matcher matcher = pattern.matcher(expression);
+
+ List list = new ArrayList();
+ while (matcher.find()) {
+ String group = matcher.group();
+ String value = StringUtils.substringBetween(group, "#H['", "']");
+ list.add(value);
+ }
+
+ return list;
+ }
+
+ private static int test3() {
+ String expression = "#H['a-A'] != '123' || #H['b//SS'] != '456' && #H['C**44!!66'] = 123";
+ String key = "#H['";
+
+ return StringUtil.count(expression, key);
+ }
+}
\ No newline at end of file
diff --git a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/condition/HeaderEqualsStrategyCondition.java b/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/condition/HeaderEqualsStrategyCondition.java
deleted file mode 100644
index 76ee256e66..0000000000
--- a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/condition/HeaderEqualsStrategyCondition.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.nepxion.discovery.plugin.strategy.condition;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.util.Map;
-
-import org.apache.commons.collections4.MapUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import com.nepxion.discovery.common.entity.StrategyConditionEntity;
-
-public class HeaderEqualsStrategyCondition extends AbstractStrategyCondition {
- @Override
- public boolean isTriggered(StrategyConditionEntity strategyConditionEntity) {
- Map conditionHeaderMap = strategyConditionEntity.getConditionHeaderMap();
- if (MapUtils.isNotEmpty(conditionHeaderMap)) {
- for (Map.Entry entry : conditionHeaderMap.entrySet()) {
- String headerName = entry.getKey();
- String headerValue = entry.getValue();
-
- String value = strategyContextHolder.getHeader(headerName);
- if (!StringUtils.equals(headerValue, value)) {
- return false;
- }
- }
- }
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/condition/HeaderExpressionStrategyCondition.java b/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/condition/HeaderExpressionStrategyCondition.java
index 5bfddb6ea3..685ce7863d 100644
--- a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/condition/HeaderExpressionStrategyCondition.java
+++ b/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/condition/HeaderExpressionStrategyCondition.java
@@ -9,15 +9,41 @@
* @version 1.0
*/
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
import com.nepxion.discovery.common.entity.StrategyConditionEntity;
+import com.nepxion.discovery.plugin.framework.util.SpelUtil;
public class HeaderExpressionStrategyCondition extends AbstractStrategyCondition {
+ private Pattern pattern = Pattern.compile(DiscoveryConstant.EXPRESSION_REGEX);
+
@Override
public boolean isTriggered(StrategyConditionEntity strategyConditionEntity) {
- // 此为包含若干个Header的表达式
- // String conditionHeader = strategyConditionEntity.getConditionHeader();
+ String conditionHeader = strategyConditionEntity.getConditionHeader();
+ Map headerMap = createHeaderMap(conditionHeader);
+
+ return SpelUtil.eval(conditionHeader, DiscoveryConstant.EXPRESSION_PREFIX, headerMap);
+ }
+
+ private Map createHeaderMap(String conditionHeader) {
+ Map headerMap = new HashMap();
+
+ Matcher matcher = pattern.matcher(conditionHeader);
+ while (matcher.find()) {
+ String group = matcher.group();
+ String headerName = StringUtils.substringBetween(group, DiscoveryConstant.EXPRESSION_SUB_PREFIX, DiscoveryConstant.EXPRESSION_SUB_SUFFIX);
+ String headerValue = strategyContextHolder.getHeader(headerName);
+ if (StringUtils.isNotBlank(headerValue)) {
+ headerMap.put(headerName, headerValue);
+ }
+ }
- // 待实现
- return true;
+ return headerMap;
}
}
\ No newline at end of file
diff --git a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/configuration/StrategyAutoConfiguration.java b/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/configuration/StrategyAutoConfiguration.java
index 7470e32a65..764ba0cfa5 100644
--- a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/configuration/StrategyAutoConfiguration.java
+++ b/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/configuration/StrategyAutoConfiguration.java
@@ -15,7 +15,7 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import com.nepxion.discovery.plugin.strategy.condition.HeaderEqualsStrategyCondition;
+import com.nepxion.discovery.plugin.strategy.condition.HeaderExpressionStrategyCondition;
import com.nepxion.discovery.plugin.strategy.condition.StrategyCondition;
import com.nepxion.discovery.plugin.strategy.constant.StrategyConstant;
import com.nepxion.discovery.plugin.strategy.isolation.ConsumerIsolationDiscoveryStrategy;
@@ -64,6 +64,6 @@ public StrategyWrapper strategyWrapper() {
@Bean
@ConditionalOnMissingBean
public StrategyCondition strategyCondition() {
- return new HeaderEqualsStrategyCondition();
+ return new HeaderExpressionStrategyCondition();
}
}
\ No newline at end of file
diff --git a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/wrapper/StrategyWrapper.java b/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/wrapper/StrategyWrapper.java
index 5ded34bb7b..565c47ddf6 100644
--- a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/wrapper/StrategyWrapper.java
+++ b/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/wrapper/StrategyWrapper.java
@@ -163,7 +163,7 @@ public String getGlobalRouteRegionWeight() {
}
public String getConditionRouteVersion() {
- StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity();
+ StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity(StrategyType.VERSION);
if (strategyConditionEntity != null) {
String versionId = strategyConditionEntity.getVersionId();
StrategyRouteEntity strategyRouteEntity = getTriggeredStrategyRouteEntity(versionId, StrategyType.VERSION);
@@ -176,7 +176,7 @@ public String getConditionRouteVersion() {
}
public String getConditionRouteRegion() {
- StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity();
+ StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity(StrategyType.REGION);
if (strategyConditionEntity != null) {
String regionId = strategyConditionEntity.getRegionId();
StrategyRouteEntity strategyRouteEntity = getTriggeredStrategyRouteEntity(regionId, StrategyType.REGION);
@@ -189,7 +189,7 @@ public String getConditionRouteRegion() {
}
public String getConditionRouteAddress() {
- StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity();
+ StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity(StrategyType.ADDRESS);
if (strategyConditionEntity != null) {
String addressId = strategyConditionEntity.getAddressId();
StrategyRouteEntity strategyRouteEntity = getTriggeredStrategyRouteEntity(addressId, StrategyType.ADDRESS);
@@ -202,7 +202,7 @@ public String getConditionRouteAddress() {
}
public String getConditionRouteVersionWeight() {
- StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity();
+ StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity(StrategyType.VERSION_WEIGHT);
if (strategyConditionEntity != null) {
String versionWeightId = strategyConditionEntity.getVersionWeightId();
StrategyRouteEntity strategyRouteEntity = getTriggeredStrategyRouteEntity(versionWeightId, StrategyType.VERSION_WEIGHT);
@@ -215,7 +215,7 @@ public String getConditionRouteVersionWeight() {
}
public String getConditionRouteRegionWeight() {
- StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity();
+ StrategyConditionEntity strategyConditionEntity = getTriggeredStrategyConditionEntity(StrategyType.REGION_WEIGHT);
if (strategyConditionEntity != null) {
String regionWeightId = strategyConditionEntity.getRegionWeightId();
StrategyRouteEntity strategyRouteEntity = getTriggeredStrategyRouteEntity(regionWeightId, StrategyType.REGION_WEIGHT);
@@ -227,7 +227,7 @@ public String getConditionRouteRegionWeight() {
return null;
}
- private StrategyRouteEntity getTriggeredStrategyRouteEntity(String id, StrategyType type) {
+ private StrategyRouteEntity getTriggeredStrategyRouteEntity(String id, StrategyType strategyType) {
if (StringUtils.isEmpty(id)) {
return null;
}
@@ -239,7 +239,7 @@ private StrategyRouteEntity getTriggeredStrategyRouteEntity(String id, StrategyT
List strategyRouteEntityList = strategyCustomizationEntity.getStrategyRouteEntityList();
if (CollectionUtils.isNotEmpty(strategyRouteEntityList)) {
for (StrategyRouteEntity strategyRouteEntity : strategyRouteEntityList) {
- if (StringUtils.equals(strategyRouteEntity.getId(), id) && strategyRouteEntity.getType() == type) {
+ if (StringUtils.equals(strategyRouteEntity.getId(), id) && strategyRouteEntity.getType() == strategyType) {
return strategyRouteEntity;
}
}
@@ -250,7 +250,7 @@ private StrategyRouteEntity getTriggeredStrategyRouteEntity(String id, StrategyT
return null;
}
- private StrategyConditionEntity getTriggeredStrategyConditionEntity() {
+ private StrategyConditionEntity getTriggeredStrategyConditionEntity(StrategyType strategyType) {
RuleEntity ruleEntity = pluginAdapter.getRule();
if (ruleEntity != null) {
StrategyCustomizationEntity strategyCustomizationEntity = ruleEntity.getStrategyCustomizationEntity();
@@ -258,9 +258,12 @@ private StrategyConditionEntity getTriggeredStrategyConditionEntity() {
List strategyConditionEntityList = strategyCustomizationEntity.getStrategyConditionEntityList();
if (CollectionUtils.isNotEmpty(strategyConditionEntityList)) {
for (StrategyConditionEntity strategyConditionEntity : strategyConditionEntityList) {
- boolean isTriggered = strategyCondition.isTriggered(strategyConditionEntity);
- if (isTriggered) {
- return strategyConditionEntity;
+ boolean isValidated = validateStrategyType(strategyConditionEntity, strategyType);
+ if (isValidated) {
+ boolean isTriggered = strategyCondition.isTriggered(strategyConditionEntity);
+ if (isTriggered) {
+ return strategyConditionEntity;
+ }
}
}
}
@@ -270,6 +273,23 @@ private StrategyConditionEntity getTriggeredStrategyConditionEntity() {
return null;
}
+ private boolean validateStrategyType(StrategyConditionEntity strategyConditionEntity, StrategyType strategyType) {
+ switch (strategyType) {
+ case VERSION:
+ return StringUtils.isNotEmpty(strategyConditionEntity.getVersionId());
+ case REGION:
+ return StringUtils.isNotEmpty(strategyConditionEntity.getRegionId());
+ case ADDRESS:
+ return StringUtils.isNotEmpty(strategyConditionEntity.getAddressId());
+ case VERSION_WEIGHT:
+ return StringUtils.isNotEmpty(strategyConditionEntity.getVersionWeightId());
+ case REGION_WEIGHT:
+ return StringUtils.isNotEmpty(strategyConditionEntity.getRegionWeightId());
+ }
+
+ return false;
+ }
+
public String getWeightRouteVersion() {
StrategyWeightEntity strategyWeightEntity = getTriggeredStrategyWeightEntity();
if (strategyWeightEntity != null) {
@@ -321,7 +341,7 @@ private StrategyWeightEntity getTriggeredStrategyWeightEntity() {
return null;
}
- private String getTriggeredStrategyWeight(MapWeightEntity mapWeightEntity, StrategyType type) {
+ private String getTriggeredStrategyWeight(MapWeightEntity mapWeightEntity, StrategyType strategyType) {
Map weightMap = mapWeightEntity.getWeightMap();
if (MapUtils.isEmpty(weightMap)) {
return null;
@@ -330,7 +350,7 @@ private String getTriggeredStrategyWeight(MapWeightEntity mapWeightEntity, Strat
List> weightList = new ArrayList>();
for (Map.Entry entry : weightMap.entrySet()) {
String id = entry.getKey();
- StrategyRouteEntity strategyRouteEntity = getTriggeredStrategyRouteEntity(id, type);
+ StrategyRouteEntity strategyRouteEntity = getTriggeredStrategyRouteEntity(id, strategyType);
if (strategyRouteEntity != null) {
String strategyRoute = strategyRouteEntity.getValue();
Double weight = Double.valueOf(entry.getValue());