Skip to content

Commit d9680c5

Browse files
committed
优化LocalStoreageLifeCycle逻辑
优化gray mock filter
1 parent f558684 commit d9680c5

File tree

10 files changed

+98
-22
lines changed

10 files changed

+98
-22
lines changed

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

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,45 @@
22

33
import cn.springcloud.gray.request.LocalStorageLifeCycle;
44
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
5+
import org.apache.commons.lang3.StringUtils;
56

67
public class HystrixLocalStorageCycle implements LocalStorageLifeCycle {
78

89

9-
private ThreadLocal<Boolean> hystrixRequestContextInitialized = new ThreadLocal<>();
10+
private ThreadLocal<String> hystrixRequestContextInitializedMark = new ThreadLocal<>();
1011

1112

1213
@Override
1314
public void initContext() {
15+
initContext("");
16+
}
17+
18+
@Override
19+
public void initContext(String mark) {
1420
if (!HystrixRequestContext.isCurrentThreadInitialized()) {
1521
HystrixRequestContext.initializeContext();
16-
hystrixRequestContextInitialized.set(true);
22+
hystrixRequestContextInitializedMark.set(mark);
1723
}
1824
}
1925

2026
@Override
2127
public void closeContext() {
22-
Boolean hystrixReqCxtInited = hystrixRequestContextInitialized.get();
23-
if (hystrixReqCxtInited != null) {
24-
hystrixRequestContextInitialized.remove();
25-
if (hystrixReqCxtInited && HystrixRequestContext.isCurrentThreadInitialized()) {
28+
String hystrixReqCxtInitedMark = hystrixRequestContextInitializedMark.get();
29+
if (hystrixReqCxtInitedMark != null) {
30+
hystrixRequestContextInitializedMark.remove();
31+
if (HystrixRequestContext.isCurrentThreadInitialized()) {
32+
HystrixRequestContext.getContextForCurrentThread().shutdown();
33+
}
34+
35+
}
36+
}
37+
38+
@Override
39+
public void closeContext(String mark) {
40+
String hystrixReqCxtInitedMark = hystrixRequestContextInitializedMark.get();
41+
if (hystrixReqCxtInitedMark != null && StringUtils.equals(mark, hystrixReqCxtInitedMark)) {
42+
hystrixRequestContextInitializedMark.remove();
43+
if (HystrixRequestContext.isCurrentThreadInitialized()) {
2644
HystrixRequestContext.getContextForCurrentThread().shutdown();
2745
}
2846

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,27 @@
11
package cn.springcloud.gray.client.netflix.hystrix;
22

3+
import cn.springcloud.gray.request.BaseRequestLocalStorage;
34
import cn.springcloud.gray.request.GrayRequest;
45
import cn.springcloud.gray.request.GrayTrackInfo;
5-
import cn.springcloud.gray.request.RequestLocalStorage;
6+
import cn.springcloud.gray.request.LocalStorageLifeCycle;
67
import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariableDefault;
78

8-
public class HystrixRequestLocalStorage implements RequestLocalStorage {
9+
public class HystrixRequestLocalStorage extends BaseRequestLocalStorage {
910

1011

1112
private static final HystrixRequestVariableDefault<GrayTrackInfo> grayTrackInfoLocal = new HystrixRequestVariableDefault<GrayTrackInfo>();
1213
private static final HystrixRequestVariableDefault<GrayRequest> grayRequestLocal = new HystrixRequestVariableDefault<GrayRequest>();
1314

1415

16+
public HystrixRequestLocalStorage() {
17+
this(new HystrixLocalStorageCycle());
18+
}
19+
20+
public HystrixRequestLocalStorage(LocalStorageLifeCycle localStorageLifeCycle) {
21+
super(localStorageLifeCycle);
22+
}
23+
24+
1525
@Override
1626
public void setGrayTrackInfo(GrayTrackInfo grayTrackInfo) {
1727
grayTrackInfoLocal.set(grayTrackInfo);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ public GrayClientEnrollInitializingDestroyBean grayClientEnrollInitializingDestr
114114

115115
@Bean
116116
@ConditionalOnMissingBean
117-
public RequestLocalStorage requestLocalStorage() {
118-
return new ThreadLocalRequestStorage();
117+
public RequestLocalStorage requestLocalStorage(LocalStorageLifeCycle localStorageLifeCycle) {
118+
return new ThreadLocalRequestStorage(localStorageLifeCycle);
119119
}
120120

121121
@Bean
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package cn.springcloud.gray.request;
2+
3+
/**
4+
* @author saleson
5+
* @date 2020-08-22 10:07
6+
*/
7+
public abstract class BaseRequestLocalStorage implements RequestLocalStorage {
8+
9+
private LocalStorageLifeCycle localStorageLifeCycle;
10+
11+
public BaseRequestLocalStorage(LocalStorageLifeCycle localStorageLifeCycle) {
12+
this.localStorageLifeCycle = localStorageLifeCycle;
13+
}
14+
15+
@Override
16+
public LocalStorageLifeCycle getLocalStorageLifeCycle() {
17+
return localStorageLifeCycle;
18+
}
19+
20+
}

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,33 @@ public interface LocalStorageLifeCycle {
44

55
void initContext();
66

7+
void initContext(String mark);
8+
79
void closeContext();
810

11+
void closeContext(String mark);
12+
913

1014
public static class NoOpLocalStorageLifeCycle implements LocalStorageLifeCycle {
1115

1216
@Override
1317
public void initContext() {
14-
18+
19+
}
20+
21+
@Override
22+
public void initContext(String mark) {
23+
1524
}
1625

1726
@Override
1827
public void closeContext() {
1928

2029
}
30+
31+
@Override
32+
public void closeContext(String mark) {
33+
34+
}
2135
}
2236
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,13 @@ public interface RequestLocalStorage {
1515

1616
GrayRequest getGrayRequest();
1717

18+
LocalStorageLifeCycle getLocalStorageLifeCycle();
19+
20+
21+
default void clearAll() {
22+
removeGrayRequest();
23+
removeGrayTrackInfo();
24+
getLocalStorageLifeCycle().closeContext();
25+
}
26+
1827
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
package cn.springcloud.gray.request;
22

3-
public class ThreadLocalRequestStorage implements RequestLocalStorage {
3+
public class ThreadLocalRequestStorage extends BaseRequestLocalStorage {
44
private ThreadLocal<GrayRequest> grayRequestThreadLocal = new ThreadLocal<>();
55
private ThreadLocal<GrayTrackInfo> grayTrackInfoThreadLocal = new ThreadLocal<>();
66

77

8+
public ThreadLocalRequestStorage() {
9+
this(new LocalStorageLifeCycle.NoOpLocalStorageLifeCycle());
10+
}
11+
12+
public ThreadLocalRequestStorage(LocalStorageLifeCycle localStorageLifeCycle) {
13+
super(localStorageLifeCycle);
14+
}
15+
816
@Override
917
public void setGrayTrackInfo(GrayTrackInfo grayTrackInfo) {
1018
grayTrackInfoThreadLocal.set(grayTrackInfo);
@@ -35,4 +43,5 @@ public GrayRequest getGrayRequest() {
3543
return grayRequestThreadLocal.get();
3644
}
3745

46+
3847
}

spring-cloud-gray-plugins/spring-cloud-gray-plugin-webmvc/src/main/java/cn/springcloud/gray/client/config/GrayMockWebAutoConfiguration.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@
55
import cn.springcloud.gray.web.GrayMockFilter;
66
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
77
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
8-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
98
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
109
import org.springframework.boot.web.servlet.FilterRegistrationBean;
1110
import org.springframework.context.annotation.Bean;
1211
import org.springframework.context.annotation.Configuration;
1312

14-
import javax.servlet.Filter;
15-
1613
/**
1714
* @author saleson
1815
* @date 2020-05-27 11:51
@@ -24,8 +21,7 @@ public class GrayMockWebAutoConfiguration {
2421

2522

2623
@Bean
27-
@ConditionalOnMissingBean
28-
@ConditionalOnClass(Filter.class)
24+
@ConditionalOnProperty(value = "gray.mock.enabled", havingValue = "true")
2925
public GrayMockFilter grayMockFilter(
3026
MockManager mockManager, RequestLocalStorage requestLocalStorage) {
3127
return new GrayMockFilter(mockManager, requestLocalStorage);

spring-cloud-gray-plugins/spring-cloud-gray-plugin-webmvc/src/main/java/cn/springcloud/gray/client/config/GrayTrackWebMvcConfiguration.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import org.springframework.boot.web.servlet.FilterRegistrationBean;
1616
import org.springframework.context.annotation.Bean;
1717
import org.springframework.context.annotation.Configuration;
18-
import org.springframework.context.annotation.Import;
1918

2019
import javax.servlet.Filter;
2120

@@ -60,7 +59,7 @@ public FilterRegistrationBean grayTraceFilter(GrayTrackFilter filter) {
6059

6160
// @Configuration
6261
@ConditionalOnProperty(value = {"gray.hystrix.threadTransmitStrategy"}, havingValue = "HYSTRIX_REQUEST_LOCAL_STORAGE")
63-
@Import(HystrixGrayTrackWebConfiguration.class)
62+
// @Import(HystrixGrayTrackWebConfiguration.class)
6463
public static class HystrixRequestLocalStorageConfiguration {
6564
@Bean
6665
public RequestLocalStorage requestLocalStorage() {

spring-cloud-gray-plugins/spring-cloud-gray-plugin-webmvc/src/main/java/cn/springcloud/gray/web/GrayTrackFilter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ public void init(FilterConfig filterConfig) throws ServletException {
2828
@Override
2929
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
3030
GrayHttpTrackInfo webTrack = new GrayHttpTrackInfo();
31-
// trackors.forEach(trackor -> trackor.call(webTrack, (HttpServletRequest) request));
32-
grayTrackHolder.recordGrayTrack(webTrack, new ServletHttpRequestWrapper((HttpServletRequest) request));
33-
requestLocalStorage.setGrayTrackInfo(webTrack);
31+
requestLocalStorage.getLocalStorageLifeCycle().initContext(GrayTrackFilter.class.getName());
3432
try {
33+
grayTrackHolder.recordGrayTrack(webTrack, new ServletHttpRequestWrapper((HttpServletRequest) request));
34+
requestLocalStorage.setGrayTrackInfo(webTrack);
3535
chain.doFilter(request, response);
3636
} finally {
3737
requestLocalStorage.removeGrayTrackInfo();
38+
requestLocalStorage.getLocalStorageLifeCycle().closeContext(GrayTrackFilter.class.getName());
3839
}
3940
}
4041

0 commit comments

Comments
 (0)