Skip to content

Commit ef8da63

Browse files
committed
优化gray track的实现
1 parent 7c53d40 commit ef8da63

File tree

42 files changed

+651
-170
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+651
-170
lines changed

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

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

33
import cn.springcloud.gray.GrayManager;
44
import cn.springcloud.gray.client.netflix.hystrix.HystrixRequestLocalStorage;
5-
import cn.springcloud.gray.request.GrayHttpTrackInfo;
6-
import cn.springcloud.gray.request.GrayInfoTracker;
75
import cn.springcloud.gray.request.RequestLocalStorage;
6+
import cn.springcloud.gray.request.track.GrayTrackHolder;
87
import cn.springcloud.gray.web.GrayTrackFilter;
98
import com.netflix.hystrix.HystrixCommand;
109
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
@@ -18,9 +17,7 @@
1817
import javax.servlet.ServletException;
1918
import javax.servlet.ServletRequest;
2019
import javax.servlet.ServletResponse;
21-
import javax.servlet.http.HttpServletRequest;
2220
import java.io.IOException;
23-
import java.util.List;
2421

2522
@Configuration
2623
@ConditionalOnClass({HystrixCommand.class, HystrixFeign.class})
@@ -39,9 +36,9 @@ public RequestLocalStorage requestLocalStorage() {
3936

4037
@Bean
4138
public GrayTrackFilter grayTrackFilter(
42-
RequestLocalStorage requestLocalStorage,
43-
List<GrayInfoTracker<GrayHttpTrackInfo, HttpServletRequest>> trackors) {
44-
return new GrayTrackFilter(requestLocalStorage, trackors) {
39+
GrayTrackHolder grayTrackHolder,
40+
RequestLocalStorage requestLocalStorage) {
41+
return new GrayTrackFilter(grayTrackHolder, requestLocalStorage) {
4542
@Override
4643
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
4744
if (!HystrixRequestContext.isCurrentThreadInitialized()) {

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

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

3-
import cn.springcloud.gray.communication.HttpInformationClient;
43
import cn.springcloud.gray.communication.InformationClient;
5-
import cn.springcloud.gray.communication.RetryableInformationClient;
64
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;
75

86
import java.util.List;
@@ -12,9 +10,12 @@ public abstract class AbstractCommunicableGrayManager extends SimpleGrayManager
1210
private GrayClientConfig grayClientConfig;
1311
private InformationClient informationClient;
1412

15-
public AbstractCommunicableGrayManager(GrayClientConfig grayClientConfig, GrayDecisionFactoryKeeper grayDecisionFactoryKeeper, List<RequestInterceptor> requestInterceptors) {
13+
public AbstractCommunicableGrayManager(
14+
GrayClientConfig grayClientConfig, GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
15+
List<RequestInterceptor> requestInterceptors, InformationClient informationClient) {
1616
super(grayDecisionFactoryKeeper, requestInterceptors);
1717
this.grayClientConfig = grayClientConfig;
18+
this.informationClient = informationClient;
1819
createInformationClient();
1920
}
2021

@@ -29,13 +30,6 @@ public InformationClient getGrayInformationClient() {
2930

3031
protected void createInformationClient() {
3132

32-
GrayClientConfig clientConfig = getGrayClientConfig();
33-
InformationClient httpClient = new HttpInformationClient(clientConfig.getServerUrl());
34-
if (clientConfig.isRetryable()) {
35-
informationClient = new RetryableInformationClient(Math.max(3, clientConfig.getRetryNumberOfRetries()), httpClient);
36-
} else {
37-
informationClient = httpClient;
38-
}
3933

4034
}
4135

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package cn.springcloud.gray;
22

3-
import cn.springcloud.gray.communication.InformationClient;
43

5-
public interface CommunicableGrayManager extends GrayManager {
4+
public interface CommunicableGrayManager extends GrayManager, GrayServerCommunicable {
65

7-
InformationClient getGrayInformationClient();
86

97
}

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

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

33
import cn.springcloud.gray.client.config.properties.GrayLoadProperties;
4+
import cn.springcloud.gray.communication.InformationClient;
45
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;
56
import cn.springcloud.gray.model.GrayInstance;
67
import cn.springcloud.gray.model.GrayService;
@@ -22,24 +23,25 @@ public DefaultGrayManager(
2223
GrayClientConfig grayClientConfig,
2324
GrayLoadProperties grayLoadProperties,
2425
GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
25-
List<RequestInterceptor> requestInterceptors) {
26-
super(grayClientConfig, grayDecisionFactoryKeeper, requestInterceptors);
26+
List<RequestInterceptor> requestInterceptors,
27+
InformationClient informationClient) {
28+
super(grayClientConfig, grayDecisionFactoryKeeper, requestInterceptors, informationClient);
2729
this.grayLoadProperties = grayLoadProperties;
28-
29-
3030
openForWork();
3131
}
3232

3333
public void openForWork() {
3434
log.info("拉取灰度列表");
35-
doUpdate();
36-
int timerMs = getGrayClientConfig().getServiceUpdateIntervalTimerInMs();
37-
if (timerMs > 0) {
38-
updateTimer.schedule(
39-
new UpdateTask(),
40-
getGrayClientConfig().getServiceUpdateIntervalTimerInMs(),
41-
getGrayClientConfig().getServiceUpdateIntervalTimerInMs());
35+
if (getGrayInformationClient() != null) {
36+
doUpdate();
37+
int timerMs = getGrayClientConfig().getServiceUpdateIntervalTimerInMs();
38+
if (timerMs > 0) {
39+
updateTimer.schedule(new UpdateTask(), timerMs, timerMs);
40+
}
41+
} else {
42+
loadPropertiesGrays();
4243
}
44+
4345
}
4446

4547
private void doUpdate() {
@@ -59,6 +61,13 @@ private void doUpdate() {
5961
}
6062

6163

64+
private void loadPropertiesGrays() {
65+
Map<String, GrayService> grayServices = new ConcurrentHashMap<>();
66+
joinLoadedGrays(grayServices);
67+
this.grayServices = grayServices;
68+
}
69+
70+
6271
/**
6372
* 加入配置文件中的灰度实例,但不会覆盖列表中的信息
6473
*
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package cn.springcloud.gray;
2+
3+
import cn.springcloud.gray.communication.InformationClient;
4+
5+
public interface GrayServerCommunicable {
6+
7+
InformationClient getGrayInformationClient();
8+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package cn.springcloud.gray;
2+
3+
public interface InstanceLocalInfoAware {
4+
5+
void setInstanceLocalInfo(InstanceLocalInfo instanceLocalInfo);
6+
}

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

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@
55
import cn.springcloud.gray.client.config.properties.GrayClientProperties;
66
import cn.springcloud.gray.client.config.properties.GrayLoadProperties;
77
import cn.springcloud.gray.client.config.properties.GrayRequestProperties;
8+
import cn.springcloud.gray.communication.HttpInformationClient;
9+
import cn.springcloud.gray.communication.InformationClient;
10+
import cn.springcloud.gray.communication.RetryableInformationClient;
811
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;
912
import cn.springcloud.gray.request.RequestLocalStorage;
1013
import cn.springcloud.gray.request.ThreadLocalRequestStorage;
1114
import org.springframework.beans.factory.annotation.Autowired;
1215
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
1316
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
17+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1418
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1519
import org.springframework.context.annotation.Bean;
1620
import org.springframework.context.annotation.Configuration;
@@ -31,9 +35,27 @@ public class GrayClientAutoConfiguration {
3135

3236
@Bean
3337
@ConditionalOnMissingBean
34-
public GrayManager grayManager(GrayLoadProperties grayLoadProperties, GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
35-
@Autowired(required = false) List<RequestInterceptor> requestInterceptors) {
36-
return new DefaultGrayManager(grayClientProperties, grayLoadProperties, grayDecisionFactoryKeeper, requestInterceptors);
38+
@ConditionalOnProperty(value = "gray.client.serverUrl")
39+
public InformationClient informationClient() {
40+
InformationClient httpClient = new HttpInformationClient(grayClientProperties.getServerUrl());
41+
if (grayClientProperties.isRetryable()) {
42+
return new RetryableInformationClient(Math.max(3, grayClientProperties.getRetryNumberOfRetries()), httpClient);
43+
} else {
44+
return httpClient;
45+
}
46+
}
47+
48+
49+
@Bean
50+
@ConditionalOnMissingBean
51+
public GrayManager grayManager(
52+
@Autowired(required = false) GrayLoadProperties grayLoadProperties,
53+
GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
54+
@Autowired(required = false) List<RequestInterceptor> requestInterceptors,
55+
InformationClient informationClient) {
56+
return new DefaultGrayManager(
57+
grayClientProperties, grayLoadProperties, grayDecisionFactoryKeeper,
58+
requestInterceptors, informationClient);
3759
}
3860

3961

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package cn.springcloud.gray.client.config;
2+
3+
import cn.springcloud.gray.InstanceLocalInfo;
4+
import cn.springcloud.gray.InstanceLocalInfoAware;
5+
import org.springframework.beans.BeansException;
6+
import org.springframework.beans.factory.config.BeanPostProcessor;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
10+
@Configuration
11+
public class GrayClientBeanPostProcessorConfiguration {
12+
13+
14+
@Bean
15+
// @ConditionalOnBean(InstanceLocalInfo.class)
16+
public BeanPostProcessor beanPostProcessor(InstanceLocalInfo instanceLocalInfo) {
17+
return new BeanPostProcessor() {
18+
@Override
19+
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
20+
if (bean instanceof InstanceLocalInfoAware) {
21+
((InstanceLocalInfoAware) bean).setInstanceLocalInfo(instanceLocalInfo);
22+
}
23+
return bean;
24+
}
25+
26+
@Override
27+
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
28+
29+
30+
return bean;
31+
}
32+
};
33+
}
34+
35+
}

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

Lines changed: 29 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,23 @@
22

33

44
import cn.springcloud.gray.client.config.properties.GrayTrackProperties;
5+
import cn.springcloud.gray.communication.InformationClient;
56
import cn.springcloud.gray.request.GrayHttpTrackInfo;
67
import cn.springcloud.gray.request.GrayInfoTracker;
8+
import cn.springcloud.gray.request.GrayTrackInfo;
79
import cn.springcloud.gray.request.RequestLocalStorage;
10+
import cn.springcloud.gray.request.track.DefaultGrayTrackHolder;
11+
import cn.springcloud.gray.request.track.GrayTrackHolder;
812
import cn.springcloud.gray.web.GrayTrackFilter;
913
import cn.springcloud.gray.web.GrayTrackRequestInterceptor;
1014
import cn.springcloud.gray.web.tracker.*;
11-
import org.apache.commons.lang3.StringUtils;
1215
import org.springframework.beans.factory.annotation.Autowired;
1316
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1417
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1518
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1619
import org.springframework.boot.web.servlet.FilterRegistrationBean;
1720
import org.springframework.context.annotation.Bean;
1821
import org.springframework.context.annotation.Configuration;
19-
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
20-
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
2122
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
2223

2324
import javax.servlet.http.HttpServletRequest;
@@ -29,6 +30,16 @@
2930
public class GrayTrackConfiguration {
3031

3132

33+
@Bean(initMethod = "openForWork")
34+
@ConditionalOnMissingBean
35+
public GrayTrackHolder grayTrackHolder(
36+
GrayTrackProperties grayTrackProperties,
37+
@Autowired(required = false) InformationClient informationClient,
38+
List<GrayInfoTracker<? extends GrayTrackInfo, ?>> trackers) {
39+
return new DefaultGrayTrackHolder(grayTrackProperties, informationClient, trackers);
40+
}
41+
42+
3243
@ConditionalOnProperty(value = "gray.client.runenv", havingValue = "web", matchIfMissing = true)
3344
@Configuration
3445
public static class GrayClientWebConfiguration extends WebMvcConfigurerAdapter {
@@ -42,29 +53,10 @@ public static class GrayClientWebConfiguration extends WebMvcConfigurerAdapter {
4253
@Autowired
4354
private RequestLocalStorage requestLocalStorage;
4455

45-
// @Bean
46-
// @ConditionalOnMissingBean
47-
// public GrayTrackInterceptor grayTrackInterceptor() {
48-
// return new GrayTrackInterceptor(requestLocalStorage, trackors);
49-
// }
50-
51-
// @Override
52-
// public void addInterceptors(InterceptorRegistry registry) {
53-
// InterceptorRegistration grayTrackRegistor = registry.addInterceptor(grayTrackInterceptor());
54-
// GrayTrackProperties.Web webProperties = grayTrackProperties.getWeb();
55-
//
56-
// for (String pattern : webProperties.getPathPatterns()) {
57-
// grayTrackRegistor.addPathPatterns(pattern);
58-
// }
59-
// for (String pattern : webProperties.getExcludePathPatterns()) {
60-
// grayTrackRegistor.excludePathPatterns(pattern);
61-
// }
62-
// }
63-
6456
@Bean
6557
@ConditionalOnMissingBean
66-
public GrayTrackFilter grayTrackFilter() {
67-
return new GrayTrackFilter(requestLocalStorage, trackors);
58+
public GrayTrackFilter grayTrackFilter(GrayTrackHolder grayTrackHolder) {
59+
return new GrayTrackFilter(grayTrackHolder, requestLocalStorage);
6860
}
6961

7062

@@ -87,48 +79,39 @@ public FilterRegistrationBean companyUrlFilterRegister(GrayTrackFilter filter) {
8779

8880

8981
@Bean
90-
public HttpReceiveGrayTracker httpReceiveGrayTracker() {
91-
return new HttpReceiveGrayTracker();
82+
public HttpReceiveGrayInfoTracker httpReceiveGrayTracker() {
83+
return new HttpReceiveGrayInfoTracker();
9284
}
9385

9486
@Bean
95-
@ConditionalOnProperty(value = "gray.request.track.web.need.headers")
96-
public HttpHeaderGrayTracker httpHeaderGrayTracker() {
97-
String header = grayTrackProperties.getWeb().getNeed().get(GrayTrackProperties.Web.NEED_HEADERS);
98-
String[] headers = StringUtils.isEmpty(header) ? new String[]{} : header.split(",");
99-
return new HttpHeaderGrayTracker(headers);
87+
public HttpHeaderGrayInfoTracker httpHeaderGrayTracker() {
88+
return new HttpHeaderGrayInfoTracker();
10089
}
10190

10291
@Bean
103-
@ConditionalOnProperty(value = "gray.request.track.web.need.method", havingValue = "enable")
104-
public HttpMethodGrayTracker httpMethodGrayTracker() {
105-
return new HttpMethodGrayTracker();
92+
public HttpMethodGrayInfoTracker httpMethodGrayTracker() {
93+
return new HttpMethodGrayInfoTracker();
10694
}
10795

10896
@Bean
109-
@ConditionalOnProperty(value = "gray.request.track.web.need.uri", havingValue = "enable")
110-
public HttpURIGrayTracker httpURIGrayTracker() {
111-
return new HttpURIGrayTracker();
97+
public HttpURIGrayInfoTracker httpURIGrayTracker() {
98+
return new HttpURIGrayInfoTracker();
11299
}
113100

114101
@Bean
115-
@ConditionalOnProperty(value = "gray.request.track.web.need.ip", havingValue = "enable")
116-
public HttpIPGrayTracker httpIPGrayTracker() {
117-
return new HttpIPGrayTracker();
102+
public HttpIPGrayInfoTracker httpIPGrayTracker() {
103+
return new HttpIPGrayInfoTracker();
118104
}
119105

120106
@Bean
121-
@ConditionalOnProperty(value = "gray.request.track.web.need.parameters", havingValue = "enable")
122-
public HttpParameterGrayTracker httpParameterGrayTracker() {
123-
String name = grayTrackProperties.getWeb().getNeed().get(GrayTrackProperties.Web.NEED_PARAMETERS);
124-
String[] names = StringUtils.isEmpty(name) ? new String[]{} : name.split(",");
125-
return new HttpParameterGrayTracker(names);
107+
public HttpParameterGrayInfoTracker httpParameterGrayTracker() {
108+
return new HttpParameterGrayInfoTracker();
126109
}
127110

128111

129112
@Bean
130113
public GrayTrackRequestInterceptor grayTrackRequestInterceptor() {
131-
return new GrayTrackRequestInterceptor(grayTrackProperties);
114+
return new GrayTrackRequestInterceptor();
132115
}
133116

134117
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class GrayClientProperties implements GrayClientConfig {
1313

1414
private String informationClient = "http";
1515

16-
private String serverUrl = "http://localhost:10202";
16+
private String serverUrl = "";
1717

1818
private boolean retryable = true;
1919
private int retryNumberOfRetries = RetryableInformationClient.DEFAULT_NUMBER_OF_RETRIES;

0 commit comments

Comments
 (0)