Skip to content

Commit 9f375ca

Browse files
committed
添加日志
1 parent 8a7c690 commit 9f375ca

File tree

11 files changed

+205
-32
lines changed

11 files changed

+205
-32
lines changed

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import cn.springcloud.gray.servernode.ServerListProcessor;
1313
import cn.springcloud.gray.servernode.ServerSpec;
1414
import com.netflix.loadbalancer.Server;
15+
import lombok.extern.slf4j.Slf4j;
1516
import org.apache.commons.collections.CollectionUtils;
1617
import org.apache.commons.collections.ListUtils;
1718
import org.apache.commons.lang3.StringUtils;
@@ -21,6 +22,7 @@
2122
import java.util.Objects;
2223
import java.util.stream.Collectors;
2324

25+
@Slf4j
2426
public class RibbonServerChooser implements ServerChooser<Server> {
2527

2628
private GrayManager grayManager;
@@ -60,7 +62,8 @@ public boolean matchGrayDecisions(Server server) {
6062
@Override
6163
public ServerListResult<Server> distinguishServerList(List<Server> servers) {
6264
String serviceId = getServiceId(servers);
63-
if(StringUtils.isEmpty(serviceId)){
65+
if (StringUtils.isEmpty(serviceId)) {
66+
log.warn("没有获取到当前remote request的service id, 返回null");
6467
return null;
6568
}
6669
return distinguishServerList(serviceId, servers);
@@ -75,23 +78,27 @@ public ServerListResult<Server> distinguishAndMatchGrayServerList(List<Server> s
7578
}
7679

7780
if (GrayClientHolder.getGraySwitcher().isEanbleGrayRouting()) {
78-
serverListResult.setGrayServers(
79-
serverListResult.getGrayServers().stream()
80-
.filter(this::matchGrayDecisions)
81-
.collect(Collectors.toList()));
82-
}else{
81+
log.debug("开始匹配{}服务的灰度实例", serverListResult.getServiceId());
82+
List<Server> matchedGrayServers = serverListResult.getGrayServers().stream()
83+
.filter(this::matchGrayDecisions)
84+
.collect(Collectors.toList());
85+
log.debug("{} 服务共有{}个灰度实例,本次匹配到{}个",
86+
serverListResult.getServiceId(), serverListResult.getGrayServers().size(), matchedGrayServers.size());
87+
serverListResult.setGrayServers(matchedGrayServers);
88+
} else {
89+
log.debug("grayRouting未打开,将{}服务的灰度实例清空,使之路由到正常实例", serverListResult.getServiceId());
8390
serverListResult.setGrayServers(ListUtils.EMPTY_LIST);
8491
}
8592

8693
return serverListResult;
8794
}
8895

89-
private String getServiceId(List<Server> servers){
96+
private String getServiceId(List<Server> servers) {
9097
GrayRequest grayRequest = requestLocalStorage.getGrayRequest();
9198
if (grayRequest != null && StringUtils.isNotEmpty(grayRequest.getServiceId())) {
9299
return grayRequest.getServiceId();
93100
}
94-
if(CollectionUtils.isNotEmpty(servers)) {
101+
if (CollectionUtils.isNotEmpty(servers)) {
95102
Server server = servers.get(0);
96103
if (!Objects.isNull(server)) {
97104
return server.getMetaInfo().getServiceIdForDiscovery();
@@ -103,6 +110,7 @@ private String getServiceId(List<Server> servers){
103110

104111
private ServerListResult<Server> distinguishServerList(String serviceId, List<Server> servers) {
105112
if (!grayManager.hasGray(serviceId)) {
113+
log.debug("当前灰度开关未打开,或服务 '{}'没有相关灰度策略", serviceId);
106114
return null;
107115
}
108116

@@ -119,6 +127,7 @@ private ServerListResult<Server> distinguishServerList(String serviceId, List<Se
119127
}
120128
}
121129

130+
log.debug("区分服务实例灰度状态: 服务 {} 实例数:{total: {}, gray:{}, normal:{}}", serviceId, servers.size(), grayServers.size(), normalServers.size());
122131
return new ServerListResult<>(serviceId, grayServers, normalServers);
123132
}
124133
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
import cn.springcloud.gray.client.switcher.GraySwitcher;
44
import cn.springcloud.gray.local.InstanceLocalInfo;
5+
import cn.springcloud.gray.request.GrayRequest;
56
import cn.springcloud.gray.request.LocalStorageLifeCycle;
67
import cn.springcloud.gray.request.RequestLocalStorage;
78
import cn.springcloud.gray.servernode.ServerExplainer;
89
import cn.springcloud.gray.servernode.ServerListProcessor;
910

11+
import java.util.Objects;
12+
1013
public class GrayClientHolder {
1114

1215
private static GrayManager grayManager;
@@ -82,4 +85,15 @@ public static <SERVER> ServerChooser<SERVER> getServerChooser() {
8285
public static void setServerChooser(ServerChooser<?> serverChooser) {
8386
GrayClientHolder.serverChooser = serverChooser;
8487
}
88+
89+
90+
/**
91+
* 获取当前remote request的service id
92+
*
93+
* @return
94+
*/
95+
public static String getCurrentRequestServiceId() {
96+
GrayRequest grayRequest = getRequestLocalStorage().getGrayRequest();
97+
return Objects.isNull(grayRequest) ? null : grayRequest.getServiceId();
98+
}
8599
}

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

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import cn.springcloud.gray.choose.ListChooser;
44
import cn.springcloud.gray.servernode.ServerSpec;
5+
import cn.springcloud.gray.utils.LogUtils;
56
import org.apache.commons.collections.CollectionUtils;
7+
import org.slf4j.Logger;
68

79
import java.util.List;
810

@@ -36,15 +38,26 @@ default Server chooseServer(List<Server> servers, ListChooser<Server> chooser) {
3638
return chooser.choose(servers);
3739
}
3840

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-
}
45-
}
41+
Logger log = LogUtils.logger(ServerChooser.class);
42+
43+
if (!GrayClientHolder.getGraySwitcher().isEanbleGrayRouting()) {
44+
log.warn("grayRouting未打开,从正常实例列表中挑选");
45+
return chooser.choose(serverListResult.getNormalServers());
46+
}
47+
48+
if (CollectionUtils.isEmpty(serverListResult.getGrayServers())) {
49+
log.debug("没有匹配的灰度实例,从正常实例列表中挑选");
50+
return chooser.choose(serverListResult.getNormalServers());
51+
}
52+
53+
log.debug("开始从灰度实例列表中负载挑选...");
54+
Server server = chooser.choose(serverListResult.getGrayServers());
55+
if (server != null) {
56+
log.debug("从灰度实例列表成功负载挑选到 {}", server);
57+
return server;
4658
}
4759

60+
log.warn("从灰度实例列表负载挑选失败,从正常实例列表中挑选");
4861
return chooser.choose(serverListResult.getNormalServers());
4962
}
5063

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package cn.springcloud.gray.choose;
22

33
import cn.springcloud.gray.GrayManager;
4+
import cn.springcloud.gray.decision.BringPolicyDefinitionGrayDecision;
45
import cn.springcloud.gray.decision.GrayDecision;
56
import cn.springcloud.gray.decision.GrayDecisionInputArgs;
7+
import cn.springcloud.gray.model.PolicyDefinition;
68
import cn.springcloud.gray.request.GrayRequest;
79
import cn.springcloud.gray.request.RequestLocalStorage;
810
import cn.springcloud.gray.servernode.ServerSpec;
11+
import cn.springcloud.gray.utils.JsonUtils;
12+
import lombok.extern.slf4j.Slf4j;
913

14+
import java.io.IOException;
1015
import java.util.List;
1116

17+
@Slf4j
1218
public class DefaultGrayPredicate implements GrayPredicate {
1319

1420
private RequestLocalStorage requestLocalStorage;
@@ -22,30 +28,71 @@ public DefaultGrayPredicate(RequestLocalStorage requestLocalStorage, GrayManager
2228

2329
@Override
2430
public boolean apply(ServerSpec serverSpec) {
25-
GrayDecisionInputArgs decisionInputArgs = GrayDecisionInputArgs
26-
.builder().grayRequest(requestLocalStorage.getGrayRequest()).server(serverSpec).build();
31+
GrayDecisionInputArgs decisionInputArgs = GrayDecisionInputArgs.builder()
32+
.grayRequest(requestLocalStorage.getGrayRequest())
33+
.server(serverSpec)
34+
.build();
2735
return apply(decisionInputArgs);
2836
}
2937

3038
@Override
3139
public boolean apply(GrayDecisionInputArgs decisionInputArgs) {
3240
GrayRequest grayRequest = decisionInputArgs.getGrayRequest();
33-
if(grayRequest==null){
41+
if (grayRequest == null) {
3442
return false;
3543
}
3644
ServerSpec serverSpec = decisionInputArgs.getServer();
37-
if(serverSpec==null){
45+
if (serverSpec == null) {
3846
return false;
3947
}
4048

4149
List<GrayDecision> grayDecisions =
4250
grayManager.getGrayDecision(serverSpec.getServiceId(), serverSpec.getInstanceId());
4351

44-
for (GrayDecision grayDecision : grayDecisions) {
45-
if (grayDecision.test(decisionInputArgs)) {
52+
for (int i = 0; i < grayDecisions.size(); i++) {
53+
GrayDecision grayDecision = grayDecisions.get(i);
54+
boolean testValue = grayDecision.test(decisionInputArgs);
55+
printGrayPolicyDecisionInfo(decisionInputArgs, grayDecision, testValue, grayDecisions.size(), i);
56+
if (testValue) {
4657
return true;
4758
}
4859
}
4960
return false;
5061
}
62+
63+
64+
private void printGrayPolicyDecisionInfo(
65+
GrayDecisionInputArgs decisionInputArgs,
66+
GrayDecision grayDecision,
67+
boolean testValue,
68+
int decisionLength,
69+
int currentDecisionIndex) {
70+
if (!log.isDebugEnabled()) {
71+
return;
72+
}
73+
try {
74+
if (grayDecision instanceof BringPolicyDefinitionGrayDecision) {
75+
BringPolicyDefinitionGrayDecision policyDefinitionGrayDecision = (BringPolicyDefinitionGrayDecision) grayDecision;
76+
PolicyDefinition policyDefinition = policyDefinitionGrayDecision.getPolicyDefinition();
77+
log.debug("【灰度决策】服务'{}'的实例'{}' ,'{}-{}'决策结果为'{}'; \ndecisionInputArgs: {}, \npolicyDefinition: {}",
78+
decisionInputArgs.getGrayRequest().getServiceId(),
79+
decisionInputArgs.getServer().getInstanceId(),
80+
decisionLength,
81+
currentDecisionIndex + 1,
82+
testValue,
83+
JsonUtils.toJson(decisionInputArgs),
84+
JsonUtils.toJson(policyDefinition));
85+
}
86+
log.debug("【灰度决策】服务'{}'的实例'{}' ,'{}-{}'决策结果为'{}'; \ndecisionInputArgs: {}",
87+
decisionInputArgs.getGrayRequest().getServiceId(),
88+
decisionInputArgs.getServer().getInstanceId(),
89+
decisionLength,
90+
currentDecisionIndex + 1,
91+
testValue,
92+
JsonUtils.toJson(decisionInputArgs));
93+
} catch (IOException e) {
94+
log.error("", e);
95+
}
96+
97+
}
5198
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package cn.springcloud.gray.decision;
2+
3+
import cn.springcloud.gray.model.PolicyDefinition;
4+
5+
/**
6+
* @author saleson
7+
* @date 2020-07-28 19:22
8+
*/
9+
public class BringPolicyDefinitionGrayDecision extends GrayDecisionDelegater {
10+
11+
private PolicyDefinition policyDefinition;
12+
13+
public BringPolicyDefinitionGrayDecision(GrayDecision delegate, PolicyDefinition policyDefinition) {
14+
super(delegate);
15+
this.policyDefinition = policyDefinition;
16+
}
17+
18+
19+
public PolicyDefinition getPolicyDefinition() {
20+
return policyDefinition;
21+
}
22+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package cn.springcloud.gray.decision;
2+
3+
/**
4+
* @author saleson
5+
* @date 2020-07-28 19:19
6+
*/
7+
public class GrayDecisionDelegater implements GrayDecision {
8+
9+
private GrayDecision delegate;
10+
11+
public GrayDecisionDelegater(GrayDecision delegate) {
12+
this.delegate = delegate;
13+
}
14+
15+
@Override
16+
public boolean test(GrayDecisionInputArgs args) {
17+
return delegate.test(args);
18+
}
19+
}

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
import cn.springcloud.gray.client.config.properties.GrayHoldoutServerProperties;
44
import cn.springcloud.gray.model.InstanceStatus;
55
import org.apache.commons.collections.CollectionUtils;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
68

79
import java.util.List;
810

911
public abstract class AbstractServerListProcessor<S> implements ServerListProcessor<S> {
1012

13+
private static Logger log = LoggerFactory.getLogger(AbstractServerListProcessor.class);
14+
1115
protected GrayHoldoutServerProperties grayHoldoutServerProperties;
1216

1317
public AbstractServerListProcessor(GrayHoldoutServerProperties grayHoldoutServerProperties) {
@@ -16,14 +20,20 @@ public AbstractServerListProcessor(GrayHoldoutServerProperties grayHoldoutServer
1620

1721
@Override
1822
public List<S> process(String serviceId, List<S> servers) {
19-
if (!grayHoldoutServerProperties.isEnabled() || CollectionUtils.isEmpty(getHoldoutInstanceStatus(serviceId))) {
23+
if (!grayHoldoutServerProperties.isEnabled()) {
24+
log.debug("破窗开关未打开,返回原实例列表");
25+
return servers;
26+
}
27+
28+
if (CollectionUtils.isEmpty(getHoldoutInstanceStatus(serviceId))) {
29+
log.debug("未设置服务 {} 的破窗实例状态,返回原实例列表", serviceId);
2030
return servers;
2131
}
2232

2333
return getServers(serviceId, servers);
2434
}
2535

26-
protected List<InstanceStatus> getHoldoutInstanceStatus(String serviceId){
36+
protected List<InstanceStatus> getHoldoutInstanceStatus(String serviceId) {
2737
return grayHoldoutServerProperties.getServices().get(serviceId);
2838
}
2939

spring-cloud-gray-plugins/spring-cloud-gray-plugin-eureka/src/main/java/cn/springcloud/gray/client/netflix/eureka/EurekaServerListProcessor.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,28 @@ public EurekaServerListProcessor(GrayHoldoutServerProperties grayHoldoutServerPr
4747

4848
@Override
4949
public List<Server> process(String serviceId, List<Server> servers) {
50-
if (!grayHoldoutServerProperties.isEnabled() || CollectionUtils.isEmpty(grayHoldoutServerProperties.getServices().get(serviceId))) {
50+
51+
if (!grayHoldoutServerProperties.isEnabled()) {
52+
log.debug("破窗开关未打开,返回原实例列表");
53+
return servers;
54+
}
55+
56+
57+
List<InstanceStatus> holdoutStatus = grayHoldoutServerProperties.getServices().get(serviceId);
58+
if (CollectionUtils.isEmpty(holdoutStatus)) {
59+
log.debug("未设置服务 {} 的破窗实例状态,返回原实例列表", serviceId);
5160
return servers;
5261
}
5362

63+
64+
String cacheKey = serviceId + ";" + StringUtils.join(holdoutStatus, ",");
65+
5466
List<Server> serverList = null;
5567

5668
if (grayHoldoutServerProperties.isCacheable()) {
57-
serverList = serversMap.get(serviceId);
69+
serverList = serversMap.get(cacheKey);
5870
if (CollectionUtils.isNotEmpty(serverList)) {
71+
log.debug("通过破窗能力,{} 服务从缓存中获取新的实例列表{}", serviceId, serverList);
5972
return serverList;
6073
}
6174
}
@@ -66,8 +79,9 @@ public List<Server> process(String serviceId, List<Server> servers) {
6679
serverList = ListUtils.union(servers, unUpServers);
6780
}
6881
if (grayHoldoutServerProperties.isCacheable()) {
69-
serversMap.put(serviceId, serverList);
82+
serversMap.put(cacheKey, serverList);
7083
}
84+
log.debug("通过破窗能力,{} 服务实例列表新增{}个实例,新列表:{}", serviceId, unUpServers.size(), serverList);
7185
return serverList;
7286
}
7387

0 commit comments

Comments
 (0)