1
1
package cn .springcloud .gray .client .gateway ;
2
2
3
3
import cn .springcloud .gray .client .config .properties .GrayRequestProperties ;
4
- import cn .springcloud .gray .client .netflix .constants .GrayNetflixClientConstants ;
5
4
import cn .springcloud .gray .request .GrayHttpRequest ;
5
+ import cn .springcloud .gray .request .GrayTrackInfo ;
6
+ import cn .springcloud .gray .request .RequestLocalStorage ;
6
7
import cn .springcloud .gray .routing .connectionpoint .RoutingConnectPointContext ;
7
8
import cn .springcloud .gray .routing .connectionpoint .RoutingConnectionPoint ;
8
- import org . apache . commons . io . IOUtils ;
9
+ import cn . springcloud . gray . web . filter . GrayTrackWebFilter ;
9
10
import org .slf4j .Logger ;
10
11
import org .slf4j .LoggerFactory ;
11
12
import org .springframework .cloud .gateway .filter .GatewayFilterChain ;
12
13
import org .springframework .cloud .gateway .filter .GlobalFilter ;
13
14
import org .springframework .cloud .gateway .filter .RouteToRequestUrlFilter ;
14
- import org .springframework .cloud .netflix .zuul .filters .support .FilterConstants ;
15
15
import org .springframework .core .Ordered ;
16
16
import org .springframework .http .HttpHeaders ;
17
17
import org .springframework .http .server .reactive .ServerHttpRequest ;
@@ -34,10 +34,15 @@ public class GrayGlobalFilter implements GlobalFilter, Ordered {
34
34
35
35
private GrayRequestProperties grayRequestProperties ;
36
36
private RoutingConnectionPoint routingConnectionPoint ;
37
+ private RequestLocalStorage requestLocalStorage ;
37
38
38
- public GrayGlobalFilter (GrayRequestProperties grayRequestProperties , RoutingConnectionPoint routingConnectionPoint ) {
39
+ public GrayGlobalFilter (
40
+ GrayRequestProperties grayRequestProperties ,
41
+ RoutingConnectionPoint routingConnectionPoint ,
42
+ RequestLocalStorage requestLocalStorage ) {
39
43
this .grayRequestProperties = grayRequestProperties ;
40
44
this .routingConnectionPoint = routingConnectionPoint ;
45
+ this .requestLocalStorage = requestLocalStorage ;
41
46
}
42
47
43
48
@ Override
@@ -68,19 +73,35 @@ public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
68
73
ServerHttpRequest .Builder requestBuilder = exchange .getRequest ().mutate ();
69
74
grayRequest .setAttribute (GRAY_REQUEST_ATTRIBUTE_GATEWAY_HTTPREQUEST_BUILDER , requestBuilder );
70
75
76
+ recordGrayTrack (exchange );
77
+
71
78
RoutingConnectPointContext connectPointContext = RoutingConnectPointContext .builder ()
72
79
.interceptroType ("gateway" )
73
80
.grayRequest (grayRequest ).build ();
81
+
82
+
74
83
routingConnectionPoint .executeConnectPoint (connectPointContext );
75
84
76
85
ServerHttpRequest newRequest = requestBuilder .build ();
77
86
ServerWebExchange newExchange = exchange .mutate ().request (newRequest ).build ();
78
87
79
- // try {
80
- return chain .filter (newExchange ).doFinally (t ->routingConnectionPoint .shutdownconnectPoint (connectPointContext ));
81
- // } finally {
82
- // routingConnectionPoint.shutdownconnectPoint(connectPointContext);
83
- // }
88
+ return chain .filter (newExchange ).doFinally (t -> routingConnectionPoint .shutdownconnectPoint (connectPointContext ));
89
+ }
90
+
91
+
92
+ /**
93
+ * 支持reactor nio event loop
94
+ *
95
+ * @param exchange
96
+ */
97
+ private void recordGrayTrack (ServerWebExchange exchange ) {
98
+ //todo 需优化
99
+ if (requestLocalStorage .getGrayTrackInfo () == null ) {
100
+ GrayTrackInfo grayTrackInfo = (GrayTrackInfo ) exchange .getAttributes ().get (GrayTrackWebFilter .GRAY_WEB_TRACK_ATTR_NAME );
101
+ if (grayTrackInfo != null ) {
102
+ requestLocalStorage .setGrayTrackInfo (grayTrackInfo );
103
+ }
104
+ }
84
105
}
85
106
86
107
@ Override
0 commit comments