Skip to content

Commit 4c1ce5f

Browse files
committed
在灰度中添加使用多版本的控制开关
1 parent 1117c5d commit 4c1ce5f

File tree

5 files changed

+69
-9
lines changed

5 files changed

+69
-9
lines changed

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/GrayClientAppContext.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package cn.springcloud.gray.client;
22

33
import cn.springcloud.gray.InstanceLocalInfo;
4+
import cn.springcloud.gray.client.config.properties.GrayClientProperties;
45
import cn.springcloud.gray.core.GrayManager;
56

67
public class GrayClientAppContext {
78
private static GrayManager grayManager;
89
private static InstanceLocalInfo instanceLocalInfo;
10+
private static GrayClientProperties grayClientProperties;
911

1012

1113
public static GrayManager getGrayManager() {
@@ -24,4 +26,12 @@ public static InstanceLocalInfo getInstanceLocalInfo() {
2426
static void setInstanceLocalInfo(InstanceLocalInfo instanceLocalInfo) {
2527
GrayClientAppContext.instanceLocalInfo = instanceLocalInfo;
2628
}
29+
30+
public static GrayClientProperties getGrayClientProperties() {
31+
return grayClientProperties;
32+
}
33+
34+
static void setGrayClientProperties(GrayClientProperties grayClientProperties) {
35+
GrayClientAppContext.grayClientProperties = grayClientProperties;
36+
}
2737
}

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/GrayClientInitializingBean.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cn.springcloud.gray.client;
22

33
import cn.springcloud.gray.InstanceLocalInfo;
4+
import cn.springcloud.gray.client.config.properties.GrayClientProperties;
45
import cn.springcloud.gray.core.GrayManager;
56
import org.springframework.beans.BeansException;
67
import org.springframework.beans.factory.InitializingBean;
@@ -16,6 +17,7 @@ public class GrayClientInitializingBean implements InitializingBean, Application
1617
public void afterPropertiesSet() throws Exception {
1718
GrayClientAppContext.setGrayManager(cxt.getBean(GrayManager.class));
1819
GrayClientAppContext.setInstanceLocalInfo(cxt.getBean(InstanceLocalInfo.class));
20+
GrayClientAppContext.setGrayClientProperties(cxt.getBean(GrayClientProperties.class));
1921

2022
startForWork();
2123

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayClientProperties.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public class InstanceConfig {
8888

8989
private boolean grayEnroll;
9090
private int grayEnrollDealyTimeInMs = 40000;
91+
private boolean useMultiVersion = false;
9192

9293
public boolean isGrayEnroll() {
9394
return grayEnroll;
@@ -104,5 +105,18 @@ public int getGrayEnrollDealyTimeInMs() {
104105
public void setGrayEnrollDealyTimeInMs(int grayEnrollDealyTimeInMs) {
105106
this.grayEnrollDealyTimeInMs = grayEnrollDealyTimeInMs;
106107
}
108+
109+
/**
110+
* 是否使用多版本,默认不使用
111+
*
112+
* @return
113+
*/
114+
public boolean isUseMultiVersion() {
115+
return useMultiVersion;
116+
}
117+
118+
public void setUseMultiVersion(boolean useMultiVersion) {
119+
this.useMultiVersion = useMultiVersion;
120+
}
107121
}
108122
}

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayLoadBalanceRule.java

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,45 @@
33
import cn.springcloud.bamboo.BambooRequestContext;
44
import cn.springcloud.bamboo.ribbon.loadbalancer.BambooZoneAvoidanceRule;
55
import cn.springcloud.gray.client.GrayClientAppContext;
6+
import cn.springcloud.gray.client.config.properties.GrayClientProperties;
67
import cn.springcloud.gray.core.GrayManager;
78
import cn.springcloud.gray.core.GrayService;
89
import com.google.common.base.Optional;
9-
import com.netflix.loadbalancer.AbstractServerPredicate;
10-
import com.netflix.loadbalancer.CompositePredicate;
11-
import com.netflix.loadbalancer.ILoadBalancer;
12-
import com.netflix.loadbalancer.Server;
10+
import com.netflix.client.config.IClientConfig;
11+
import com.netflix.loadbalancer.*;
1312
import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
1413

1514
import java.util.ArrayList;
1615
import java.util.List;
1716

17+
import static cn.springcloud.gray.client.GrayClientAppContext.getGrayClientProperties;
18+
1819

1920
/**
2021
* 灰度发布的负载规则
2122
*/
22-
public class GrayLoadBalanceRule extends BambooZoneAvoidanceRule {
23+
public class GrayLoadBalanceRule extends ZoneAvoidanceRule {
2324

2425
protected CompositePredicate grayCompositePredicate;
26+
protected ZoneAvoidanceRule subDelegate;
2527

2628
public GrayLoadBalanceRule() {
2729
super();
30+
init();
31+
}
32+
33+
protected void init(){
2834
GrayDecisionPredicate apiVersionPredicate = new GrayDecisionPredicate(this);
29-
grayCompositePredicate = CompositePredicate.withPredicates(super.getPredicate(),
30-
apiVersionPredicate).build();
35+
GrayClientProperties grayClientProperties = GrayClientAppContext.getGrayClientProperties();
36+
//如果与多版本一起使用
37+
if(grayClientProperties.getInstance().isUseMultiVersion()){
38+
subDelegate = new BambooZoneAvoidanceRule();
39+
grayCompositePredicate = CompositePredicate.withPredicates(subDelegate.getPredicate(),
40+
apiVersionPredicate).build();
41+
}else{
42+
grayCompositePredicate = CompositePredicate.withPredicates(super.getPredicate(),
43+
apiVersionPredicate).build();
44+
}
3145
}
3246

3347

@@ -55,10 +69,28 @@ public Server choose(Object key) {
5569
} else {
5670
return choose(super.getPredicate(), normalServers, key);
5771
}
72+
}else if(subDelegate!=null){
73+
return subDelegate.choose(key);
74+
}else{
75+
return super.choose(key);
5876
}
59-
return super.choose(key);
6077
}
6178

79+
@Override
80+
public void initWithNiwsConfig(IClientConfig clientConfig) {
81+
super.initWithNiwsConfig(clientConfig);
82+
if(subDelegate!=null){
83+
subDelegate.initWithNiwsConfig(clientConfig);
84+
}
85+
}
86+
87+
@Override
88+
public void setLoadBalancer(ILoadBalancer lb) {
89+
super.setLoadBalancer(lb);
90+
if(subDelegate!=null){
91+
subDelegate.setLoadBalancer(lb);
92+
}
93+
}
6294

6395
private Server choose(AbstractServerPredicate serverPredicate, List<Server> servers, Object key) {
6496
Optional<Server> server = serverPredicate.chooseRoundRobinAfterFiltering(servers, key);

spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,6 @@ zuul:
2121
# serviceId: eureka-client #指定路由到的serviceId
2222
gray:
2323
client:
24-
server-url: http://localhost:20202 #灰度服务端的url
24+
server-url: http://localhost:20202 #灰度服务端的url
25+
instance:
26+
use-multi-version: true

0 commit comments

Comments
 (0)