Skip to content

Commit 014aa1a

Browse files
committed
添加灰度实例路由的开关
灰度开关控制GrayTrackFilter
1 parent cf71229 commit 014aa1a

File tree

7 files changed

+54
-27
lines changed

7 files changed

+54
-27
lines changed

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
import cn.springcloud.gray.servernode.ServerListProcessor;
1212
import cn.springcloud.gray.servernode.ServerSpec;
1313
import com.netflix.loadbalancer.Server;
14+
import org.apache.commons.lang3.StringUtils;
1415

1516
import java.util.ArrayList;
1617
import java.util.List;
18+
import java.util.Objects;
1719
import java.util.stream.Collectors;
1820

1921
public class RibbonServerChooser implements ServerChooser<Server> {
@@ -54,12 +56,11 @@ public boolean matchGrayDecisions(Server server) {
5456

5557
@Override
5658
public ServerListResult<Server> distinguishServerList(List<Server> servers) {
57-
GrayRequest grayRequest = requestLocalStorage.getGrayRequest();
58-
if (grayRequest == null) {
59+
String serviceId = getServiceId(servers);
60+
if(StringUtils.isNotEmpty(serviceId)){
5961
return null;
6062
}
61-
62-
return distinguishServerList(grayRequest.getServiceId(), servers);
63+
return distinguishServerList(serviceId, servers);
6364
}
6465

6566

@@ -78,6 +79,18 @@ public ServerListResult<Server> distinguishAndMatchGrayServerList(List<Server> s
7879
return serverListResult;
7980
}
8081

82+
private String getServiceId(List<Server> servers){
83+
GrayRequest grayRequest = requestLocalStorage.getGrayRequest();
84+
if (grayRequest != null && StringUtils.isNotEmpty(grayRequest.getServiceId())) {
85+
return grayRequest.getServiceId();
86+
}
87+
Server server = servers.get(0);
88+
if(Objects.isNull(server)){
89+
return server.getMetaInfo().getServiceIdForDiscovery();
90+
}
91+
return null;
92+
}
93+
8194

8295
private ServerListResult<Server> distinguishServerList(String serviceId, List<Server> servers) {
8396
if (!grayManager.hasGray(serviceId)) {

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,15 @@ public Server choose(Object key) {
7474
normalServers.add(server);
7575
}
7676
}
77-
Optional<Server> server = grayCompositePredicate.chooseRoundRobinAfterFiltering(grayServers, key);
78-
if (server.isPresent()) {
79-
return expect(server.get());
80-
} else {
81-
return expect(choose(super.getPredicate(), normalServers, key));
77+
if (GrayClientHolder.getGraySwitcher().isEanbleGrayRouting()) {
78+
Optional<Server> server = grayCompositePredicate.chooseRoundRobinAfterFiltering(grayServers, key);
79+
if (server.isPresent()) {
80+
return expect(server.get());
81+
}
8282
}
83-
84-
} else {
85-
return expect(super.choose(key));
83+
return expect(choose(super.getPredicate(), normalServers, key));
8684
}
85+
return expect(super.choose(key));
8786
}
8887

8988
protected Server choose(AbstractServerPredicate serverPredicate, List<Server> servers, Object key) {

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,42 @@
66

77
import java.util.List;
88

9-
public interface ServerChooser <Server> {
9+
public interface ServerChooser<Server> {
1010

1111
boolean matchGrayDecisions(ServerSpec serverSpec);
1212

1313
boolean matchGrayDecisions(Server server);
1414

1515
/**
1616
* 区分灰度实例和正常实例
17+
*
1718
* @param servers
1819
* @return 返回区分后的结果,如果关闭灰度开关,将会返回null
1920
*/
2021
ServerListResult<Server> distinguishServerList(List<Server> servers);
2122

2223

23-
2424
/**
2525
* 区分灰度实例和正常实例,并比对灰度实例的灰度决策
26+
*
2627
* @param servers
2728
* @return 返回区分及比对后的结果,如果关闭灰度开关,将会返回null
2829
*/
2930
ServerListResult<Server> distinguishAndMatchGrayServerList(List<Server> servers);
3031

3132

32-
33-
default Server chooseServer(List<Server> servers, ListChooser<Server> chooser){
33+
default Server chooseServer(List<Server> servers, ListChooser<Server> chooser) {
3434
ServerListResult<Server> serverListResult = distinguishAndMatchGrayServerList(servers);
35-
if(serverListResult==null){
35+
if (serverListResult == null) {
3636
return chooser.choose(servers);
3737
}
3838

39-
if(CollectionUtils.isNotEmpty(serverListResult.getGrayServers())){
40-
Server server = chooser.choose(serverListResult.getGrayServers());
41-
if(server!=null){
42-
return server;
39+
if (GrayClientHolder.getGraySwitcher().isEanbleGrayRouting()) {
40+
if (CollectionUtils.isNotEmpty(serverListResult.getGrayServers())) {
41+
Server server = chooser.choose(serverListResult.getGrayServers());
42+
if (server != null) {
43+
return server;
44+
}
4345
}
4446
}
4547

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
package cn.springcloud.gray.client.config.properties;
22

3+
import lombok.Data;
34
import org.springframework.boot.context.properties.ConfigurationProperties;
45

6+
@Data
57
@ConfigurationProperties("gray")
68
public class GrayProperties {
79

810
private boolean enabled;
911

12+
private boolean grayRouting = false;
1013

11-
public boolean isEnabled() {
12-
return enabled;
13-
}
1414

15-
public void setEnabled(boolean enabled) {
16-
this.enabled = enabled;
17-
}
1815
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ public EnvGraySwitcher(GrayProperties grayProperties) {
1414
public boolean state() {
1515
return grayProperties.isEnabled();
1616
}
17+
18+
@Override
19+
public boolean isEanbleGrayRouting() {
20+
return grayProperties.isGrayRouting();
21+
}
1722
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,19 @@ public interface GraySwitcher {
44

55
boolean state();
66

7+
boolean isEanbleGrayRouting();
8+
79

810
public static class DefaultGraySwitcher implements GraySwitcher {
911

1012
@Override
1113
public boolean state() {
1214
return true;
1315
}
16+
17+
@Override
18+
public boolean isEanbleGrayRouting() {
19+
return true;
20+
}
1421
}
1522
}

spring-cloud-gray-client/src/main/java/cn/springcloud/gray/request/track/GrayTrackHolder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cn.springcloud.gray.request.track;
22

3+
import cn.springcloud.gray.GrayClientHolder;
34
import cn.springcloud.gray.model.GrayTrackDefinition;
45
import cn.springcloud.gray.request.GrayInfoTracker;
56
import cn.springcloud.gray.request.GrayTrackInfo;
@@ -27,6 +28,9 @@ public interface GrayTrackHolder {
2728

2829

2930
default <REQ> void recordGrayTrack(GrayTrackInfo info, REQ req) {
31+
if(!GrayClientHolder.getGraySwitcher().state()){
32+
return;
33+
}
3034
getGrayInfoTrackers().forEach(tracker -> {
3135
GrayTrackDefinition definition = getGrayTrackDefinition(tracker.name());
3236
if (definition != null) {

0 commit comments

Comments
 (0)