Skip to content

Commit ff150a6

Browse files
authored
Merge pull request #20 from SpringCloud/A
A
2 parents d2fef0e + 315057e commit ff150a6

File tree

74 files changed

+1506
-157
lines changed

Some content is hidden

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

74 files changed

+1506
-157
lines changed

pom.xml

Lines changed: 21 additions & 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>A.1.0.5</version>
15+
<version>A.1.0.7</version>
1616
<url>https://github.com/SpringCloud/spring-cloud-gray</url>
1717
<organization>
1818
<name>Spring Cloud中国社区</name>
@@ -68,9 +68,11 @@
6868
<lombok.version>1.18.8</lombok.version>
6969
<slf4j.version>1.7.26</slf4j.version>
7070
<commons-lang3.version>3.5</commons-lang3.version>
71+
<commons-beanutils.version>1.9.3</commons-beanutils.version>
7172
<guava.version>27.0.1-jre</guava.version>
7273
<mapstruct.version>1.1.0.Final</mapstruct.version>
7374
<caffeine.version>2.7.0</caffeine.version>
75+
<aspectj.version>1.8.13</aspectj.version>
7476
</properties>
7577

7678

@@ -151,6 +153,13 @@
151153
<version>${project.version}</version>
152154
</dependency>
153155

156+
<dependency>
157+
<groupId>org.aspectj</groupId>
158+
<artifactId>aspectjrt</artifactId>
159+
<version>${aspectj.version}</version>
160+
<scope>compile</scope>
161+
</dependency>
162+
154163

155164
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
156165
<dependency>
@@ -183,6 +192,17 @@
183192
<artifactId>commons-lang3</artifactId>
184193
<version>${commons-lang3.version}</version>
185194
</dependency>
195+
<dependency>
196+
<groupId>commons-beanutils</groupId>
197+
<artifactId>commons-beanutils</artifactId>
198+
<version>${commons-beanutils.version}</version>
199+
<exclusions>
200+
<exclusion>
201+
<groupId>commons-logging</groupId>
202+
<artifactId>commons-logging</artifactId>
203+
</exclusion>
204+
</exclusions>
205+
</dependency>
186206
<dependency>
187207
<groupId>com.google.guava</groupId>
188208
<artifactId>guava</artifactId>

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

Lines changed: 5 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>A.1.0.5</version>
8+
<version>A.1.0.7</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

@@ -99,6 +99,10 @@
9999
<groupId>com.google.guava</groupId>
100100
<artifactId>guava</artifactId>
101101
</dependency>
102+
<dependency>
103+
<groupId>org.aspectj</groupId>
104+
<artifactId>aspectjrt</artifactId>
105+
</dependency>
102106

103107

104108
</dependencies>
Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,68 @@
11
package cn.springcloud.gray.client.netflix.configuration;
22

3-
import cn.springcloud.gray.GrayManager;
43
import cn.springcloud.gray.InstanceLocalInfo;
4+
import cn.springcloud.gray.client.config.properties.GrayHoldoutServerProperties;
55
import cn.springcloud.gray.client.netflix.eureka.EurekaInstanceDiscoveryClient;
66
import cn.springcloud.gray.client.netflix.eureka.EurekaServerExplainer;
7+
import cn.springcloud.gray.client.netflix.eureka.EurekaServerListProcessor;
78
import cn.springcloud.gray.servernode.InstanceDiscoveryClient;
9+
import cn.springcloud.gray.servernode.ServerListProcessor;
810
import com.netflix.discovery.EurekaClient;
911
import org.springframework.beans.factory.annotation.Autowired;
1012
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
1113
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
14+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1215
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
1316
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaServiceRegistry;
1417
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
1518
import org.springframework.context.annotation.Bean;
1619
import org.springframework.context.annotation.Configuration;
1720

1821
@Configuration
19-
@ConditionalOnBean({GrayManager.class})
22+
//@ConditionalOnBean({GrayManager.class})
23+
@ConditionalOnProperty(value = "gray.enabled")
24+
@ConditionalOnBean({EurekaClient.class})
2025
public class GrayClientEurekaAutoConfiguration {
2126

2227

23-
@ConditionalOnBean({EurekaClient.class})
24-
public static class GrayEurekaClientConfiguraion {
25-
@Autowired
26-
private SpringClientFactory springClientFactory;
27-
28-
@Bean
29-
@ConditionalOnBean({EurekaRegistration.class})
30-
@ConditionalOnMissingBean
31-
public InstanceLocalInfo instanceLocalInfo(@Autowired EurekaRegistration registration) {
32-
String instanceId = registration.getInstanceConfig().getInstanceId();
33-
34-
return InstanceLocalInfo.builder()
35-
.instanceId(instanceId)
36-
.serviceId(registration.getServiceId())
37-
.host(registration.getHost())
38-
.port(registration.getPort())
39-
.build();
40-
}
41-
42-
@Bean
43-
@ConditionalOnMissingBean
44-
public EurekaServerExplainer eurekaServerExplainer() {
45-
return new EurekaServerExplainer(springClientFactory);
46-
}
47-
48-
49-
@Bean
50-
@ConditionalOnBean({EurekaServiceRegistry.class, EurekaRegistration.class})
51-
public InstanceDiscoveryClient instanceDiscoveryClient(
52-
EurekaServiceRegistry eurekaServiceRegistry, EurekaRegistration eurekaRegistration) {
53-
return new EurekaInstanceDiscoveryClient(eurekaServiceRegistry, eurekaRegistration);
54-
}
28+
@Autowired
29+
private SpringClientFactory springClientFactory;
30+
31+
@Bean
32+
@ConditionalOnBean({EurekaRegistration.class})
33+
@ConditionalOnMissingBean
34+
public InstanceLocalInfo instanceLocalInfo(@Autowired EurekaRegistration registration) {
35+
String instanceId = registration.getInstanceConfig().getInstanceId();
36+
37+
return InstanceLocalInfo.builder()
38+
.instanceId(instanceId)
39+
.serviceId(registration.getServiceId())
40+
.host(registration.getHost())
41+
.port(registration.getPort())
42+
.build();
43+
}
44+
45+
@Bean
46+
@ConditionalOnMissingBean
47+
public EurekaServerExplainer eurekaServerExplainer() {
48+
return new EurekaServerExplainer(springClientFactory);
5549
}
5650

51+
52+
@Bean
53+
@ConditionalOnBean({EurekaServiceRegistry.class, EurekaRegistration.class})
54+
public InstanceDiscoveryClient instanceDiscoveryClient(
55+
EurekaServiceRegistry eurekaServiceRegistry, EurekaRegistration eurekaRegistration) {
56+
return new EurekaInstanceDiscoveryClient(eurekaServiceRegistry, eurekaRegistration);
57+
}
58+
59+
60+
@Bean
61+
@ConditionalOnProperty(value = "gray.holdoutServer.enabled")
62+
@ConditionalOnMissingBean
63+
public ServerListProcessor serverListProcessor(GrayHoldoutServerProperties grayHoldoutServerProperties, EurekaClient eurekaClient) {
64+
return new EurekaServerListProcessor(grayHoldoutServerProperties, eurekaClient);
65+
}
66+
67+
5768
}

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
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;
4+
import cn.springcloud.gray.client.netflix.hystrix.HystrixLocalStorageCycle;
65
import cn.springcloud.gray.client.netflix.hystrix.HystrixRequestLocalStorage;
6+
import cn.springcloud.gray.request.LocalStorageLifeCycle;
77
import cn.springcloud.gray.request.RequestLocalStorage;
88
import com.netflix.hystrix.HystrixCommand;
99
import feign.hystrix.HystrixFeign;
@@ -27,17 +27,22 @@ public RequestLocalStorage requestLocalStorage() {
2727
return new HystrixRequestLocalStorage();
2828
}
2929

30+
@Bean
31+
public LocalStorageLifeCycle localStorageLifeCycle() {
32+
return new HystrixLocalStorageCycle();
33+
}
34+
3035

3136
/**
3237
* 支持hystrix使用线程隔离时依然能够进行跑线程传递GrayRequest
3338
*
3439
* @return DefaultHystrixRibbonConnectionPoint
3540
*/
36-
@Bean
37-
public RibbonConnectionPoint ribbonConnectionPoint(
38-
GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
39-
return new DefaultHystrixRibbonConnectionPoint(grayManager, requestLocalStorage);
40-
}
41+
// @Bean
42+
// public RibbonConnectionPoint ribbonConnectionPoint(
43+
// GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
44+
// return new DefaultHystrixRibbonConnectionPoint(grayManager, requestLocalStorage);
45+
// }
4146

4247

4348
// @Bean

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import cn.springcloud.gray.client.netflix.connectionpoint.DefaultRibbonConnectionPoint;
55
import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint;
66
import cn.springcloud.gray.client.netflix.ribbon.configuration.GrayRibbonClientsConfiguration;
7+
import cn.springcloud.gray.request.LocalStorageLifeCycle;
78
import cn.springcloud.gray.request.RequestLocalStorage;
89
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
910
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -20,8 +21,8 @@ public class NetflixRibbonGrayAutoConfiguration {
2021
@Bean
2122
@ConditionalOnMissingBean
2223
public RibbonConnectionPoint ribbonConnectionPoint(
23-
GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
24-
return new DefaultRibbonConnectionPoint(grayManager, requestLocalStorage);
24+
GrayManager grayManager, RequestLocalStorage requestLocalStorage, LocalStorageLifeCycle localStorageLifeCycle) {
25+
return new DefaultRibbonConnectionPoint(grayManager, requestLocalStorage, localStorageLifeCycle);
2526
}
2627

2728
}

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
package cn.springcloud.gray.client.netflix.connectionpoint;
22

33
import cn.springcloud.gray.GrayManager;
4+
import cn.springcloud.gray.request.LocalStorageLifeCycle;
45
import cn.springcloud.gray.request.RequestLocalStorage;
5-
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
66

7+
@Deprecated
78
public class DefaultHystrixRibbonConnectionPoint extends DefaultRibbonConnectionPoint {
89

910
private ThreadLocal<Boolean> hystrixRequestContextInitialized = new ThreadLocal<>();
1011

11-
public DefaultHystrixRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
12-
super(grayManager, requestLocalStorage);
12+
public DefaultHystrixRibbonConnectionPoint(
13+
GrayManager grayManager,
14+
RequestLocalStorage requestLocalStorage,
15+
LocalStorageLifeCycle localStorageLifeCycle) {
16+
super(grayManager, requestLocalStorage, localStorageLifeCycle);
1317
}
1418

1519

1620
@Override
1721
public void executeConnectPoint(ConnectPointContext connectPointContext) {
18-
if (!HystrixRequestContext.isCurrentThreadInitialized()) {
19-
HystrixRequestContext.initializeContext();
20-
hystrixRequestContextInitialized.set(true);
21-
}
22+
// if (!HystrixRequestContext.isCurrentThreadInitialized()) {
23+
// HystrixRequestContext.initializeContext();
24+
// hystrixRequestContextInitialized.set(true);
25+
// }
2226
super.executeConnectPoint(connectPointContext);
2327
}
2428

@@ -27,10 +31,10 @@ public void shutdownconnectPoint(ConnectPointContext connectPointContext) {
2731
try {
2832
super.shutdownconnectPoint(connectPointContext);
2933
} finally {
30-
Boolean hystrixReqCxtInited = hystrixRequestContextInitialized.get();
31-
if (hystrixReqCxtInited != null && hystrixReqCxtInited && HystrixRequestContext.isCurrentThreadInitialized()) {
32-
HystrixRequestContext.getContextForCurrentThread().shutdown();
33-
}
34+
// Boolean hystrixReqCxtInited = hystrixRequestContextInitialized.get();
35+
// if (hystrixReqCxtInited != null && hystrixReqCxtInited && HystrixRequestContext.isCurrentThreadInitialized()) {
36+
// HystrixRequestContext.getContextForCurrentThread().shutdown();
37+
// }
3438
}
3539
}
3640

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

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import cn.springcloud.gray.GrayManager;
44
import cn.springcloud.gray.RequestInterceptor;
55
import cn.springcloud.gray.request.GrayRequest;
6+
import cn.springcloud.gray.request.GrayTrackInfo;
7+
import cn.springcloud.gray.request.LocalStorageLifeCycle;
68
import cn.springcloud.gray.request.RequestLocalStorage;
79

810
import java.util.List;
@@ -11,18 +13,27 @@ public class DefaultRibbonConnectionPoint implements RibbonConnectionPoint {
1113

1214
private GrayManager grayManager;
1315
private RequestLocalStorage requestLocalStorage;
16+
private LocalStorageLifeCycle localStorageLifeCycle;
1417

15-
public DefaultRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage requestLocalStorage) {
18+
public DefaultRibbonConnectionPoint(
19+
GrayManager grayManager,
20+
RequestLocalStorage requestLocalStorage,
21+
LocalStorageLifeCycle localStorageLifeCycle) {
1622
this.grayManager = grayManager;
1723
this.requestLocalStorage = requestLocalStorage;
24+
this.localStorageLifeCycle = localStorageLifeCycle;
1825
}
1926

2027
@Override
2128
public void executeConnectPoint(ConnectPointContext connectPointContext) {
2229

30+
localStorageLifeCycle.initContext();
31+
2332
ConnectPointContext.setContextLocal(connectPointContext);
2433
GrayRequest grayRequest = connectPointContext.getGrayRequest();
25-
grayRequest.setGrayTrackInfo(requestLocalStorage.getGrayTrackInfo());
34+
//todo 待优化,为每次请求复制一个GrayTrackInfo
35+
GrayTrackInfo grayTrackInfo = requestLocalStorage.getGrayTrackInfo();
36+
grayRequest.setGrayTrackInfo(grayTrackInfo);
2637
requestLocalStorage.setGrayRequest(grayRequest);
2738

2839
List<RequestInterceptor> interceptors = grayManager.getRequeestInterceptors(connectPointContext.getInterceptroType());
@@ -41,18 +52,20 @@ public void shutdownconnectPoint(ConnectPointContext connectPointContext) {
4152
// if (requestLocalStorage.getGrayRequest() == null) {
4253
// return;
4354
// }
44-
45-
List<RequestInterceptor> interceptors = grayManager.getRequeestInterceptors(connectPointContext.getInterceptroType());
46-
interceptors.forEach(interceptor -> {
47-
if (interceptor.shouldIntercept()) {
48-
if (!interceptor.after(connectPointContext.getGrayRequest())) {
49-
return;
55+
try {
56+
List<RequestInterceptor> interceptors = grayManager.getRequeestInterceptors(connectPointContext.getInterceptroType());
57+
interceptors.forEach(interceptor -> {
58+
if (interceptor.shouldIntercept()) {
59+
if (!interceptor.after(connectPointContext.getGrayRequest())) {
60+
return;
61+
}
5062
}
51-
}
52-
});
53-
ConnectPointContext.removeContextLocal();
54-
requestLocalStorage.removeGrayTrackInfo();
55-
requestLocalStorage.removeGrayRequest();
63+
});
64+
ConnectPointContext.removeContextLocal();
65+
requestLocalStorage.removeGrayRequest();
66+
} finally {
67+
localStorageLifeCycle.closeContext();
68+
}
5669
}
5770

5871

0 commit comments

Comments
 (0)