Skip to content

Commit

Permalink
增加自定义路由的表达式扩展
Browse files Browse the repository at this point in the history
  • Loading branch information
HaojunRen committed Jan 5, 2020
1 parent c27a544 commit 9e64646
Show file tree
Hide file tree
Showing 10 changed files with 134 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ public class StrategyConditionEntity implements Serializable {
private static final long serialVersionUID = 1249482860170990672L;

private String id;
private Map<String, String> headerMap = new LinkedHashMap<String, String>();
private String conditionHeader;
private Map<String, String> conditionHeaderMap = new LinkedHashMap<String, String>();
private String versionId;
private String regionId;
private String addressId;
Expand All @@ -37,12 +38,20 @@ public void setId(String id) {
this.id = id;
}

public Map<String, String> getHeaderMap() {
return headerMap;
public String getConditionHeader() {
return conditionHeader;
}

public void setHeaderMap(Map<String, String> headerMap) {
this.headerMap = headerMap;
public void setConditionHeader(String conditionHeader) {
this.conditionHeader = conditionHeader;
}

public Map<String, String> getConditionHeaderMap() {
return conditionHeaderMap;
}

public void setConditionHeaderMap(Map<String, String> conditionHeaderMap) {
this.conditionHeaderMap = conditionHeaderMap;
}

public String getVersionId() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ public void setStrategyRouteEntityList(List<StrategyRouteEntity> strategyRouteEn
// Header参数越多,越排在前面
Collections.sort(this.strategyConditionEntityList, new Comparator<StrategyConditionEntity>() {
public int compare(StrategyConditionEntity object1, StrategyConditionEntity object2) {
Integer count1 = object1.getHeaderMap().size();
Integer count2 = object2.getHeaderMap().size();
Integer count1 = object1.getConditionHeaderMap().size();
Integer count2 = object2.getConditionHeaderMap().size();

return count2.compareTo(count1);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -686,13 +686,14 @@ private void parseStrategyCondition(Element element, List<StrategyConditionEntit
throw new DiscoveryException("Attribute[" + ConfigConstant.HEADER_ATTRIBUTE_NAME + "] in element[" + childElement.getName() + "] is missing");
}
String header = headerAttribute.getData().toString().trim();
strategyConditionEntity.setConditionHeader(header);
List<String> 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.getHeaderMap().put(headerName, headerValue);
strategyConditionEntity.getConditionHeaderMap().put(headerName, headerValue);
}

Attribute versionIdAttribute = childElement.attribute(ConfigConstant.VERSION_ELEMENT_NAME + DiscoveryConstant.DASH + ConfigConstant.ID_ATTRIBUTE_NAME);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.nepxion.discovery.plugin.strategy.condition;

/**
* <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.nepxion.discovery.plugin.strategy.context.StrategyContextHolder;

public abstract class AbstractStrategyCondition implements StrategyCondition {
@Autowired
protected StrategyContextHolder strategyContextHolder;

public StrategyContextHolder getStrategyContextHolder() {
return strategyContextHolder;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.nepxion.discovery.plugin.strategy.condition;

/**
* <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 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<String, String> conditionHeaderMap = strategyConditionEntity.getConditionHeaderMap();
if (MapUtils.isNotEmpty(conditionHeaderMap)) {
for (Map.Entry<String, String> 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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.nepxion.discovery.plugin.strategy.condition;

/**
* <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.nepxion.discovery.common.entity.StrategyConditionEntity;

public class HeaderExpressionStrategyCondition extends AbstractStrategyCondition {
@Override
public boolean isTriggered(StrategyConditionEntity strategyConditionEntity) {
// 此为包含若干个Header的表达式
// String conditionHeader = strategyConditionEntity.getConditionHeader();

// 待实现
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.nepxion.discovery.plugin.strategy.condition;

/**
* <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.nepxion.discovery.common.entity.StrategyConditionEntity;

public interface StrategyCondition {
boolean isTriggered(StrategyConditionEntity strategyConditionEntity);
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
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.StrategyCondition;
import com.nepxion.discovery.plugin.strategy.constant.StrategyConstant;
import com.nepxion.discovery.plugin.strategy.isolation.ConsumerIsolationDiscoveryStrategy;
import com.nepxion.discovery.plugin.strategy.isolation.ConsumerIsolationLoadBalanceStrategy;
Expand Down Expand Up @@ -58,4 +60,10 @@ public ConsumerIsolationLoadBalanceStrategy consumerIsolationLoadBalanceStrategy
public StrategyWrapper strategyWrapper() {
return new StrategyWrapper();
}

@Bean
@ConditionalOnMissingBean
public StrategyCondition strategyCondition() {
return new HeaderEqualsStrategyCondition();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.nepxion.discovery.common.entity.StrategyWeightEntity;
import com.nepxion.discovery.plugin.framework.adapter.PluginAdapter;
import com.nepxion.discovery.plugin.framework.loadbalance.weight.MapWeightRandom;
import com.nepxion.discovery.plugin.strategy.condition.StrategyCondition;
import com.nepxion.discovery.plugin.strategy.context.StrategyContextHolder;

public class StrategyWrapper {
Expand All @@ -39,6 +40,9 @@ public class StrategyWrapper {
@Autowired
protected StrategyContextHolder strategyContextHolder;

@Autowired
protected StrategyCondition strategyCondition;

// 从远程配置中心或者本地配置文件获取版本路由配置。如果是远程配置中心,则值会动态改变
public String getRouteVersion() {
String routeVersion = getConditionRouteVersion();
Expand Down Expand Up @@ -254,7 +258,7 @@ private StrategyConditionEntity getTriggeredStrategyConditionEntity() {
List<StrategyConditionEntity> strategyConditionEntityList = strategyCustomizationEntity.getStrategyConditionEntityList();
if (CollectionUtils.isNotEmpty(strategyConditionEntityList)) {
for (StrategyConditionEntity strategyConditionEntity : strategyConditionEntityList) {
boolean isTriggered = isConditionTriggered(strategyConditionEntity);
boolean isTriggered = strategyCondition.isTriggered(strategyConditionEntity);
if (isTriggered) {
return strategyConditionEntity;
}
Expand All @@ -266,23 +270,6 @@ private StrategyConditionEntity getTriggeredStrategyConditionEntity() {
return null;
}

private boolean isConditionTriggered(StrategyConditionEntity strategyConditionEntity) {
Map<String, String> headerMap = strategyConditionEntity.getHeaderMap();
if (MapUtils.isNotEmpty(headerMap)) {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
String headerName = entry.getKey();
String headerValue = entry.getValue();

String value = strategyContextHolder.getHeader(headerName);
if (!StringUtils.equals(headerValue, value)) {
return false;
}
}
}

return true;
}

public String getWeightRouteVersion() {
StrategyWeightEntity strategyWeightEntity = getTriggeredStrategyWeightEntity();
if (strategyWeightEntity != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,8 @@
"strategyConditionEntityList": [
{
"id": "1",
"headerMap": {
"conditionHeader": "a=1;b=2",
"conditionHeaderMap": {
"a": "1",
"b": "2"
},
Expand All @@ -215,7 +216,8 @@
},
{
"id": "2",
"headerMap": {
"conditionHeader": "c=3",
"conditionHeaderMap": {
"c": "3"
},
"versionId": "a-2",
Expand Down

0 comments on commit 9e64646

Please sign in to comment.