Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,17 @@ public class GrayReleaseHandler extends AbstractHandler {

@Override
public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception {
//读取规则
String p = Configuration.INSTANCE.getGrayreleaseRuleClassName(invocation.getMicroserviceName(),
invocation.getMicroserviceQualifiedName());
this.policy = p;
if (this.policy == null) {
invocation.next(asyncResp);
}
IGrayReleaseFilter rule = createGrayReleaseFilterRule(invocation);
rule.filterRule();
invocation.next(asyncResp);
// 读取规则
String p = Configuration.INSTANCE.getGrayreleaseRuleClassName(invocation.getMicroserviceName(),
invocation.getMicroserviceQualifiedName());
this.policy = p;
if (this.policy != null) {
IGrayReleaseFilter rule = createGrayReleaseFilterRule(invocation);
if (rule != null) {
rule.filterRule();
}
}
invocation.next(asyncResp);
}

private IGrayReleaseFilter createGrayReleaseFilterRule(Invocation invocation) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,16 +211,16 @@ protected Map<String, Object> parseStrRule(String ruleStr) {
} else if (subRuleStr.contains(">=")) {
newSubRule.put(OPERATOR_NAME, LogicSymbol.LargerOrEqual);
logicSymbol = ">=";
} else if (subRuleStr.contains("!=")) {
newSubRule.put(OPERATOR_NAME, LogicSymbol.NotEqual);
logicSymbol = "!=";
} else if (subRuleStr.contains("=")) {
newSubRule.put(OPERATOR_NAME, LogicSymbol.Equal);
logicSymbol = "=";
} else if (subRuleStr.contains("~")) {
newSubRule.put(OPERATOR_NAME, LogicSymbol.Like);
logicSymbol = "~";
} else if (subRuleStr.contains("!=")) {
newSubRule.put(OPERATOR_NAME, LogicSymbol.NotEqual);
logicSymbol = "!=";
}
}

String[] subStrs = subRuleStr.split(logicSymbol);
newSubRule.put(RULE_DETAILS_NAME_KEY, subStrs[0]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import org.apache.commons.configuration.AbstractConfiguration;
import org.apache.commons.configuration.BaseConfiguration;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
Expand Down Expand Up @@ -72,6 +73,8 @@ public void initInstance() {
MicroserviceInstance microserviceInstance02 = Mockito.mock(MicroserviceInstance.class);
Map<String, String> props001 = new HashMap<String, String>();
props001.put("tags", "001;002");
Mockito.when(microserviceInstance01.getInstanceId()).thenReturn("01");
Mockito.when(microserviceInstance02.getInstanceId()).thenReturn("02");
Mockito.when(microserviceInstance01.getProperties()).thenReturn(props001);
Mockito.when(microserviceInstance02.getProperties()).thenReturn(props001);
ins01.put("01", microserviceInstance01);
Expand All @@ -82,6 +85,8 @@ public void initInstance() {
MicroserviceInstance microserviceInstance04 = Mockito.mock(MicroserviceInstance.class);
Map<String, String> props002 = new HashMap<String, String>();
props002.put("tags", "002");
Mockito.when(microserviceInstance03.getInstanceId()).thenReturn("03");
Mockito.when(microserviceInstance04.getInstanceId()).thenReturn("04");
Mockito.when(microserviceInstance03.getProperties()).thenReturn(props002);
Mockito.when(microserviceInstance04.getProperties()).thenReturn(props002);
ins02.put("03", microserviceInstance03);
Expand All @@ -103,111 +108,68 @@ public Map<String, Map<String, MicroserviceInstance>> getOrCreateVRuleMap(String
}

};

System.out.println();
System.out.println("-----------init--------------------------------------------------------");
System.out.println(
"instanceId:01" + "," + microserviceInstance01.getProperties().toString() + ",version={001;002}");
System.out.println(
"instanceId:02" + "," + microserviceInstance02.getProperties().toString() + ",version={001;002}");
System.out.println(
"instanceId:03" + "," + microserviceInstance03.getProperties().toString() + ",version={002}");
System.out.println(
"instanceId:04" + "," + microserviceInstance04.getProperties().toString() + ",version={002}");
System.out.println();
System.out.println("分组规则:");
System.out.println("groupId:001,tag:001;002&&version:1.0.0.1");
System.out.println("groupId:002,tag:002&&version:1.0.0.2");
System.out.println("-----------end init--------------------------------------------------------");
System.out.println();

//参数tags,version
}

@Test
public void testHandler() {
AsyncResponse asyncResp = Mockito.mock(AsyncResponse.class);
try {
String grayReleaseRuleClassName = "com.huawei.paas.cse.grayrelease.csefilter.GrayReleaseRatePolicyFilter";
String rulePolicy = "[{\"group\":\"001\",\"type\":\"rate\",\"policy\":\"50\"}]";
String groupPolicy =
"[{\"name\":\"001\",\"rule\":\"version=1.0.0.1&&tags=001,002\"},{\"name\":\"002\",\"rule\":\"version=1.0.0.2&&tags=002\"}]";
changeConfig(grayReleaseRuleClassName,
rulePolicy,
groupPolicy);

Mockito.doNothing().when(invocation).next(asyncResp);
System.out.println("-----------start--------------------------------------------------------");
System.out.println();
System.out.println("-----------rate方式--------------------------------------------------");
System.out.println("规则:001:90,0001:10");
System.out.println();

InstanceCacheManager instanceCacheManager = serviceRegistry.getInstanceCacheManager();
for (int i = 1; i < 11; i++) {
System.out.println("-----------第" + i + "次-----------------------");
System.out.println();
grayReleaseHandler.handle(invocation, asyncResp);
String key = Deencapsulation.invoke(instanceCacheManager,
"getKey",
invocation.getAppId(),
invocation.getMicroserviceName());

Map<String, InstanceCache> cacheMap = Deencapsulation.getField(instanceCacheManager, "cacheMap");
InstanceCache tmpInstanceCache = cacheMap.get(key);

Map<String, MicroserviceInstance> tmpInstanceMap = Deencapsulation.getField(tmpInstanceCache,
"instanceMap");
for (Map.Entry<String, MicroserviceInstance> instance : tmpInstanceMap.entrySet()) {
StringBuffer sb = new StringBuffer();
sb.append(instance.getKey()).append(":").append(instance.getValue().getProperties().toString());
System.out.println(sb);
}
System.out.println();
}

System.out.println();
System.out.println("-----------策略方式--------------------------------------------------");
System.out.println("规则:{0002:[{keyName:name,operator:like,value:w*d}]}");

System.out.println("args:" + invocation.getArgs()[0]);

grayReleaseRuleClassName = "com.huawei.paas.cse.grayrelease.csefilter.GrayReleaseRulePolicyFilter";
rulePolicy = "[{\"group\":\"001\",\"type\":\"rule\",\"policy\":\"name~w*d\"},"
+ "{\"group\":\"002\",\"type\":\"rule\",\"policy\":\"name~user\"}]";
groupPolicy =
"[{\"name\":\"001\",\"rule\":\"version=1.0.0.1&&tags=001,002\"},{\"name\":\"002\",\"rule\":\"version=1.0.0.2&&tags=002\"}]";
changeConfig(grayReleaseRuleClassName,
rulePolicy,
groupPolicy);

System.out.println();
for (int i = 1; i < 4; i++) {
System.out.println("-----------第" + i + "次-----------------------");
System.out.println();
grayReleaseHandler.handle(invocation, asyncResp);
String key = Deencapsulation.invoke(instanceCacheManager,
"getKey",
invocation.getAppId(),
invocation.getMicroserviceName());

Map<String, InstanceCache> cacheMap = Deencapsulation.getField(instanceCacheManager, "cacheMap");
InstanceCache tmpInstanceCache = cacheMap.get(key);

Map<String, MicroserviceInstance> tmpInstanceMap = Deencapsulation.getField(tmpInstanceCache,
"instanceMap");
for (Map.Entry<String, MicroserviceInstance> instance : tmpInstanceMap.entrySet()) {
StringBuffer sb = new StringBuffer();
sb.append(instance.getKey()).append(":").append(instance.getValue().getProperties().toString());
System.out.println(sb);
}
System.out.println();
}

} catch (Exception e) {
System.out.println(e);
}

boolean isSuccess=true;
AsyncResponse asyncResp = Mockito.mock(AsyncResponse.class);
try {
String grayReleaseRuleClassName = "io.servicecomb.grayrelease.csefilter.GrayReleaseRatePolicyFilter";
String rulePolicy = "[{\"group\":\"001\",\"type\":\"rate\",\"policy\":\"100\"}]";
String groupPolicy = "[{\"name\":\"001\",\"rule\":\"version=1.0.0.1&&tags=001,002\"},{\"name\":\"002\",\"rule\":\"version=1.0.0.2&&tags=002\"}]";
changeConfig(grayReleaseRuleClassName, rulePolicy, groupPolicy);

Mockito.doNothing().when(invocation).next(asyncResp);

for (int i = 1; i < 11; i++) {
grayReleaseHandler.handle(invocation, asyncResp);
InstanceCacheManager instanceCacheManager = InstanceCacheManager.INSTANCE;
String key = Deencapsulation.invoke(instanceCacheManager, "getKey", invocation.getAppId(),
invocation.getMicroserviceName());

Map<String, InstanceCache> cacheMap = Deencapsulation.getField(instanceCacheManager, "cacheMap");
InstanceCache tmpInstanceCache = cacheMap.get(key);

Map<String, MicroserviceInstance> tmpInstanceMap = Deencapsulation.getField(tmpInstanceCache,
"instanceMap");
Assert.assertNotNull(tmpInstanceMap.get("01"));
Assert.assertNotNull(tmpInstanceMap.get("02"));
for (Map.Entry<String, MicroserviceInstance> instance : tmpInstanceMap.entrySet()) {
Assert.assertTrue("01".equals(instance.getKey()) || "02".equals(instance.getKey()));
Assert.assertTrue("01".equals(instance.getValue().getInstanceId()) || "02".equals(instance.getKey()));
}
}

grayReleaseRuleClassName = "io.servicecomb.grayrelease.csefilter.GrayReleaseRulePolicyFilter";
rulePolicy = "[{\"group\":\"001\",\"type\":\"rule\",\"policy\":\"name~w*d\"},"
+ "{\"group\":\"002\",\"type\":\"rule\",\"policy\":\"name~user\"}]";
groupPolicy = "[{\"name\":\"001\",\"rule\":\"version=1.0.0.1&&tags=001,002\"},{\"name\":\"002\",\"rule\":\"version=1.0.0.2&&tags=002\"}]";
changeConfig(grayReleaseRuleClassName, rulePolicy, groupPolicy);

for (int i = 1; i < 4; i++) {
grayReleaseHandler.handle(invocation, asyncResp);
InstanceCacheManager instanceCacheManager = InstanceCacheManager.INSTANCE;
String key = Deencapsulation.invoke(instanceCacheManager, "getKey", invocation.getAppId(),
invocation.getMicroserviceName());

Map<String, InstanceCache> cacheMap = Deencapsulation.getField(instanceCacheManager, "cacheMap");
InstanceCache tmpInstanceCache = cacheMap.get(key);

Map<String, MicroserviceInstance> tmpInstanceMap = Deencapsulation.getField(tmpInstanceCache,
"instanceMap");
Assert.assertNotNull(tmpInstanceMap.get("01"));
Assert.assertNotNull(tmpInstanceMap.get("02"));
for (Map.Entry<String, MicroserviceInstance> instance : tmpInstanceMap.entrySet()) {
Assert.assertTrue("01".equals(instance.getKey()) || "02".equals(instance.getKey()));
Assert.assertTrue("01".equals(instance.getValue().getInstanceId()) || "02".equals(instance.getKey()));
}
}

} catch (Exception e) {
isSuccess=false;
}
Assert.assertTrue(isSuccess);
}

public void changeConfig(String grayReleaseRuleClassName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,14 @@ public void setup() {
Mockito.when(ins4.getInstanceId()).thenReturn("04");

instances = new ArrayList<MicroserviceInstance>();

instances.add(ins1);
instances.add(ins2);
instances.add(ins3);
instances.add(ins4);



microservice1 = Mockito.mock(Microservice.class);
Mockito.when(microservice1.getVersion()).thenReturn("1.0.0.1");
microservice2 = Mockito.mock(Microservice.class);
Expand All @@ -81,6 +84,7 @@ public void setup() {
serviceRegistry.setServiceRegistryClient(srClient);
serviceRegistry.getMicroserviceManager().addMicroservice(appId, "ms");
serviceRegistry.init();

}

@Test
Expand Down Expand Up @@ -111,11 +115,14 @@ public void testGetOrCreateAllMapAllVersion() {
Map<String, MicroserviceInstance> ins = inVs.get("1.0.0.1");
Assert.assertNotNull(ins.get("01"));
Assert.assertNotNull(ins.get("02"));

Assert.assertNotNull(inVs.get("1.0.0.2"));
Assert.assertEquals("01",ins.get("01").getInstanceId());
Assert.assertEquals("02",ins.get("02").getInstanceId());

Map<String, MicroserviceInstance> ins002 = inVs.get("1.0.0.2");
Assert.assertNotNull(ins002.get("03"));
Assert.assertNotNull(ins002.get("04"));
Assert.assertEquals("03",ins002.get("03").getInstanceId());
Assert.assertEquals("04",ins002.get("04").getInstanceId());
}

@Test
Expand All @@ -140,6 +147,8 @@ public void testGetOrCreateAllMapWithVersion() {
System.out.println(vinstances);
Assert.assertNotNull(vinstances.get("01"));
Assert.assertNotNull(vinstances.get("02"));
Assert.assertEquals("01",vinstances.get("01").getInstanceId());
Assert.assertEquals("02",vinstances.get("02").getInstanceId());
}

@Test
Expand All @@ -161,6 +170,8 @@ public void testGetOrCreateVRuleMap() {
Assert.assertNotNull(vRuleIns.get("1.0.0.2"));
Assert.assertNotNull(vRuleIns.get("1.0.0.2").get("03"));
Assert.assertNotNull(vRuleIns.get("1.0.0.2").get("04"));
Assert.assertEquals("03",vRuleIns.get("1.0.0.2").get("03").getInstanceId());
Assert.assertEquals("04",vRuleIns.get("1.0.0.2").get("04").getInstanceId());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ public void testCompare() {
Assert.assertEquals(true, Deencapsulation.invoke(filter, "compare", "900", LogicSymbol.Smaller, "1000"));
Assert.assertEquals(true, Deencapsulation.invoke(filter, "compare", "world", LogicSymbol.Equal, "world"));
Assert.assertEquals(true, Deencapsulation.invoke(filter, "compare", "20", LogicSymbol.Equal, "20"));
Assert.assertEquals(false, Deencapsulation.invoke(filter, "compare", "world", LogicSymbol.NotEqual, "world"));
Assert.assertEquals(true, Deencapsulation.invoke(filter, "compare", "world", LogicSymbol.NotEqual, "hello"));
Assert.assertEquals(false, Deencapsulation.invoke(filter, "compare", "world", LogicSymbol.Equal, "hello"));
Assert.assertEquals(true, Deencapsulation.invoke(filter, "compare", "world", LogicSymbol.Like, "w*"));
Assert.assertEquals(true, Deencapsulation.invoke(filter, "compare", "world", LogicSymbol.Like, "*"));
Expand Down
Loading