Skip to content

Commit 163062f

Browse files
authored
Merge pull request #14 from SpringCloud/A
A
2 parents f185af5 + ee39321 commit 163062f

File tree

78 files changed

+683
-296
lines changed

Some content is hidden

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

78 files changed

+683
-296
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<groupId>cn.springcloud.gray</groupId>
1313
<artifactId>spring-cloud-gray</artifactId>
1414
<packaging>pom</packaging>
15-
<version>2.1.0</version>
15+
<version>A.1.0.1</version>
1616
<url>https://github.com/SpringCloud/spring-cloud-gray</url>
1717
<organization>
1818
<name>Spring Cloud中国社区</name>

spring-cloud-gray-client-netflix/pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>spring-cloud-gray</artifactId>
77
<groupId>cn.springcloud.gray</groupId>
8-
<version>2.1.0</version>
8+
<version>A.1.0.1</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

@@ -50,6 +50,11 @@
5050
<groupId>org.springframework.cloud</groupId>
5151
<artifactId>spring-cloud-netflix-eureka-client</artifactId>
5252
</dependency>
53+
<dependency>
54+
<groupId>org.springframework.boot</groupId>
55+
<artifactId>spring-boot-configuration-processor</artifactId>
56+
<optional>true</optional>
57+
</dependency>
5358
<dependency>
5459
<groupId>com.netflix.eureka</groupId>
5560
<artifactId>eureka-client</artifactId>

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cn.springcloud.gray.client.netflix.configuration;
22

3+
import cn.springcloud.gray.GrayManager;
34
import cn.springcloud.gray.InstanceLocalInfo;
45
import cn.springcloud.gray.client.netflix.eureka.EurekaInstanceDiscoveryClient;
56
import cn.springcloud.gray.client.netflix.eureka.EurekaServerExplainer;
@@ -15,7 +16,7 @@
1516
import org.springframework.context.annotation.Configuration;
1617

1718
@Configuration
18-
@ConditionalOnBean(EurekaClient.class)
19+
@ConditionalOnBean({GrayManager.class, EurekaClient.class})
1920
public class GrayClientEurekaAutoConfiguration {
2021

2122
@Autowired

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package cn.springcloud.gray.client.netflix.configuration;
22

33
import cn.springcloud.gray.GrayManager;
4+
import cn.springcloud.gray.client.netflix.connectionpoint.DefaultHystrixRibbonConnectionPoint;
5+
import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint;
46
import cn.springcloud.gray.client.netflix.hystrix.HystrixRequestLocalStorage;
57
import cn.springcloud.gray.request.RequestLocalStorage;
68
import cn.springcloud.gray.request.track.GrayTrackHolder;
79
import cn.springcloud.gray.web.GrayTrackFilter;
810
import com.netflix.hystrix.HystrixCommand;
911
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
1012
import feign.hystrix.HystrixFeign;
11-
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
1214
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
1315
import org.springframework.context.annotation.Bean;
1416
import org.springframework.context.annotation.Configuration;
@@ -20,20 +22,30 @@
2022
import java.io.IOException;
2123

2224
@Configuration
25+
@ConditionalOnBean(GrayManager.class)
2326
@ConditionalOnClass({HystrixCommand.class, HystrixFeign.class})
27+
//@Import(HystrixGrayTrackWebConfiguration.class)
2428
public class HystrixGrayAutoConfiguration {
2529

2630

27-
@Autowired
28-
private GrayManager grayManager;
29-
30-
3131
@Bean
3232
public RequestLocalStorage requestLocalStorage() {
3333
return new HystrixRequestLocalStorage();
3434
}
3535

3636

37+
/**
38+
* 支持hystrix使用线程隔离时依然能够进行跑线程传递GrayRequest
39+
*
40+
* @return DefaultHystrixRibbonConnectionPoint
41+
*/
42+
@Bean
43+
public RibbonConnectionPoint hystrixRibbonConnectionPoint(
44+
GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
45+
return new DefaultHystrixRibbonConnectionPoint(grayManager, requestLocalStorage);
46+
}
47+
48+
3749
@Bean
3850
public GrayTrackFilter grayTrackFilter(
3951
GrayTrackHolder grayTrackHolder,
@@ -54,5 +66,4 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
5466
}
5567
};
5668
}
57-
5869
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
import cn.springcloud.gray.client.netflix.ribbon.configuration.GrayRibbonClientsConfiguration;
77
import cn.springcloud.gray.request.RequestLocalStorage;
88
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
910
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1011
import org.springframework.cloud.netflix.ribbon.RibbonClients;
1112
import org.springframework.context.annotation.Bean;
1213
import org.springframework.context.annotation.Configuration;
1314

1415
@Configuration
16+
@ConditionalOnBean(GrayManager.class)
1517
@RibbonClients(defaultConfiguration = GrayRibbonClientsConfiguration.class)
1618
public class NetflixGrayAutoConfiguration {
1719

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package cn.springcloud.gray.client.netflix.connectionpoint;
2+
3+
import cn.springcloud.gray.GrayManager;
4+
import cn.springcloud.gray.request.RequestLocalStorage;
5+
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
6+
7+
public class DefaultHystrixRibbonConnectionPoint extends DefaultRibbonConnectionPoint {
8+
9+
private ThreadLocal<Boolean> hystrixRequestContextInitialized = new ThreadLocal<>();
10+
11+
public DefaultHystrixRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
12+
super(grayManager, requestLocalStorage);
13+
}
14+
15+
16+
@Override
17+
public void executeConnectPoint(ConnectPointContext connectPointContext) {
18+
if (!HystrixRequestContext.isCurrentThreadInitialized()) {
19+
HystrixRequestContext.initializeContext();
20+
hystrixRequestContextInitialized.set(true);
21+
}
22+
super.executeConnectPoint(connectPointContext);
23+
}
24+
25+
@Override
26+
public void shutdownconnectPoint(ConnectPointContext connectPointContext) {
27+
try {
28+
super.shutdownconnectPoint(connectPointContext);
29+
} finally {
30+
Boolean hystrixReqCxtInited = hystrixRequestContextInitialized.get();
31+
if (hystrixReqCxtInited != null && hystrixReqCxtInited && HystrixRequestContext.isCurrentThreadInitialized()) {
32+
HystrixRequestContext.getContextForCurrentThread().shutdown();
33+
}
34+
}
35+
}
36+
37+
38+
}

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

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@
44
import cn.springcloud.gray.RequestInterceptor;
55
import cn.springcloud.gray.request.GrayRequest;
66
import cn.springcloud.gray.request.RequestLocalStorage;
7-
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
87

98
import java.util.List;
109

1110
public class DefaultRibbonConnectionPoint implements RibbonConnectionPoint {
1211

1312
private GrayManager grayManager;
1413
private RequestLocalStorage requestLocalStorage;
15-
private ThreadLocal<Boolean> hystrixRequestContextInitialized = new ThreadLocal<>();
1614

1715
public DefaultRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
1816
this.grayManager = grayManager;
@@ -22,11 +20,6 @@ public DefaultRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage
2220
@Override
2321
public void executeConnectPoint(ConnectPointContext connectPointContext) {
2422

25-
if (!HystrixRequestContext.isCurrentThreadInitialized()) {
26-
HystrixRequestContext.initializeContext();
27-
hystrixRequestContextInitialized.set(true);
28-
}
29-
3023
ConnectPointContext.setContextLocal(connectPointContext);
3124
GrayRequest grayRequest = connectPointContext.getGrayRequest();
3225
grayRequest.setGrayTrackInfo(requestLocalStorage.getGrayTrackInfo());
@@ -45,28 +38,21 @@ public void executeConnectPoint(ConnectPointContext connectPointContext) {
4538

4639
@Override
4740
public void shutdownconnectPoint(ConnectPointContext connectPointContext) {
48-
try {
49-
if (requestLocalStorage.getGrayRequest() == null) {
50-
return;
51-
}
41+
// if (requestLocalStorage.getGrayRequest() == null) {
42+
// return;
43+
// }
5244

53-
List<RequestInterceptor> interceptors = grayManager.getRequeestInterceptors(connectPointContext.getInterceptroType());
54-
interceptors.forEach(interceptor -> {
55-
if (interceptor.shouldIntercept()) {
56-
if (!interceptor.after(connectPointContext.getGrayRequest())) {
57-
return;
58-
}
45+
List<RequestInterceptor> interceptors = grayManager.getRequeestInterceptors(connectPointContext.getInterceptroType());
46+
interceptors.forEach(interceptor -> {
47+
if (interceptor.shouldIntercept()) {
48+
if (!interceptor.after(connectPointContext.getGrayRequest())) {
49+
return;
5950
}
60-
});
61-
ConnectPointContext.removeContextLocal();
62-
requestLocalStorage.removeGrayTrackInfo();
63-
requestLocalStorage.removeGrayRequest();
64-
} finally {
65-
Boolean hystrixReqCxtInited = hystrixRequestContextInitialized.get();
66-
if (hystrixReqCxtInited != null && hystrixReqCxtInited && HystrixRequestContext.isCurrentThreadInitialized()) {
67-
HystrixRequestContext.getContextForCurrentThread().shutdown();
6851
}
69-
}
52+
});
53+
ConnectPointContext.removeContextLocal();
54+
requestLocalStorage.removeGrayTrackInfo();
55+
requestLocalStorage.removeGrayRequest();
7056
}
7157

7258

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package cn.springcloud.gray.client.netflix.feign.configuration;
22

3+
import cn.springcloud.gray.GrayManager;
34
import cn.springcloud.gray.client.netflix.configuration.HystrixGrayAutoConfiguration;
45
import cn.springcloud.gray.client.netflix.feign.GrayTrackFeignRequestInterceptor;
56
import cn.springcloud.gray.request.RequestLocalStorage;
67
import com.netflix.loadbalancer.ILoadBalancer;
78
import feign.Feign;
9+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
810
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
911
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1012
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@@ -14,8 +16,9 @@
1416
/**
1517
* Created by saleson on 2017/11/9.
1618
*/
17-
@ConditionalOnClass(value = {ILoadBalancer.class, Feign.class})
1819
@Configuration
20+
@ConditionalOnBean(GrayManager.class)
21+
@ConditionalOnClass(value = {ILoadBalancer.class, Feign.class})
1922
@EnableFeignClients(defaultConfiguration = {GrayFeignClientsConfiguration.class})
2023
public class GrayFeignAutoConfiguration {
2124

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

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package cn.springcloud.gray.client.netflix.resttemplate.configuration;
22

3+
import cn.springcloud.gray.GrayManager;
34
import cn.springcloud.gray.client.config.properties.GrayRequestProperties;
45
import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint;
56
import cn.springcloud.gray.client.netflix.resttemplate.GrayClientHttpRequestIntercptor;
67
import cn.springcloud.gray.client.netflix.resttemplate.RestTemplateRequestInterceptor;
78
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
810
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
9-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1011
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1112
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
1213
import org.springframework.context.annotation.Bean;
@@ -16,7 +17,8 @@
1617
import java.util.List;
1718

1819
@Configuration
19-
@ConditionalOnClass(value = RestTemplate.class)
20+
@ConditionalOnBean({GrayManager.class, RestTemplate.class})
21+
@ConditionalOnClass(value = {RestTemplate.class, LoadBalanced.class})
2022
public class GrayRestTemplateAutoConfiguration {
2123

2224
@Autowired
@@ -26,20 +28,13 @@ public class GrayRestTemplateAutoConfiguration {
2628

2729

2830
@Bean
29-
@LoadBalanced
30-
@ConditionalOnMissingBean
31-
public RestTemplate restTemplate() {
32-
RestTemplate restTemplate = new RestTemplate();
33-
// restTemplate.getInterceptors().add(grayClientHttpRequestIntercptor);
34-
return restTemplate;
35-
}
36-
37-
38-
@Bean
39-
public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(@LoadBalanced List<RestTemplate> restTemplates) {
31+
public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(
32+
@Autowired(required = false) @LoadBalanced List<RestTemplate> restTemplates) {
4033
GrayClientHttpRequestIntercptor intercptor = new GrayClientHttpRequestIntercptor(
4134
grayRequestProperties, ribbonConnectionPoint);
42-
restTemplates.forEach(restTemplate -> restTemplate.getInterceptors().add(intercptor));
35+
if (restTemplates != null) {
36+
restTemplates.forEach(restTemplate -> restTemplate.getInterceptors().add(intercptor));
37+
}
4338
return intercptor;
4439
}
4540

@@ -48,7 +43,6 @@ public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(@LoadBala
4843
@ConditionalOnProperty(value = "gray.request.track.enabled", matchIfMissing = true)
4944
public static class GrayTrackRestTemplateConfiguration {
5045

51-
5246
@Bean
5347
public RestTemplateRequestInterceptor restTemplateRequestInterceptor() {
5448
return new RestTemplateRequestInterceptor();

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import cn.springcloud.gray.GrayManager;
44
import cn.springcloud.gray.client.netflix.GrayClientHolder;
55
import cn.springcloud.gray.model.GrayService;
6-
import cn.springcloud.gray.servernode.ServerExplainer;
76
import cn.springcloud.gray.request.GrayRequest;
87
import cn.springcloud.gray.request.RequestLocalStorage;
8+
import cn.springcloud.gray.servernode.ServerExplainer;
99
import com.google.common.base.Optional;
1010
import com.netflix.client.config.IClientConfig;
1111
import com.netflix.loadbalancer.*;
@@ -61,7 +61,7 @@ public Server choose(Object key) {
6161
GrayService grayService = grayManager.getGrayService(serviceId);
6262
List<Server> servers = lb.getAllServers();
6363
List<Server> grayServers = new ArrayList<>(grayService.getGrayInstances().size());
64-
List<Server> normalServers = new ArrayList<>(servers.size() - grayService.getGrayInstances().size());
64+
List<Server> normalServers = new ArrayList<>(Math.min(servers.size(), grayService.getGrayInstances().size()));
6565

6666
for (Server server : servers) {
6767
// ServerSpec serverSpec = serverExplainer.apply(server);
@@ -93,7 +93,7 @@ public void setLoadBalancer(ILoadBalancer lb) {
9393
super.setLoadBalancer(lb);
9494
}
9595

96-
private Server choose(AbstractServerPredicate serverPredicate, List<Server> servers, Object key) {
96+
protected Server choose(AbstractServerPredicate serverPredicate, List<Server> servers, Object key) {
9797
Optional<Server> server = serverPredicate.chooseRoundRobinAfterFiltering(servers, key);
9898
if (server.isPresent()) {
9999
return server.get();

0 commit comments

Comments
 (0)