Maybrittnelson / gateway-demo

Spring Cloud Gateway
1 stars 0 forks source link

Filter(默认GlobalFilter:按照默认执行顺序,从上到下排列) #9

Open Maybrittnelson opened 5 years ago

Maybrittnelson commented 5 years ago

AdaptCacheBodyGlobalFilter

Ordered.LOWEST_PRECEDENCE-2147482648

GatewayMetricsFilter

Ordered.LOWEST_PRECEDENCE - 1;

WebsocketRoutingFilter

Ordered.LOWEST_PRECEDENCE - 1;

NettyWriteResponseFilter

-1

.then(postfilter),then也就是后处理

ForwardPathFilter

0

RouteToRequestUrlFilter

10000

LoadBalancerClientFilter

10100

有lbclient才使用

NettyRoutingFilter

LOWEST_PRECEDENCE = 2147483647

发送请求后段服务

ForwardRoutingFilter

LOWEST_PRECEDENCE = 2147483647

NoLoadBalancerClientFilter

10100;

未使用(没有lbclientfilter才使用)

WebClientHttpRoutingFilter

LOWEST_PRECEDENCE = 2147483647;

未使用

WebClientWriteResponseFilter

WRITE_RESPONSE_FILTER_ORDER = -1;

未使用

Maybrittnelson commented 5 years ago

那么实现GatewayFilter接口的filter什么时候执行? 举个🌰

### filters
spring.cloud.gateway.routes[0].filters[0].name=Hystrix
spring.cloud.gateway.routes[0].filters[0].args.name=user-service-provider
spring.cloud.gateway.routes[0].filters[0].args.fallbackUri= forward:/fallback
spring.cloud.gateway.routes[0].filters[1].name=StripPrefix
spring.cloud.gateway.routes[0].filters[1].args.parts=2

答案是 Hystrix先执行,order分别是多少,Hystrix(1)、StripPrefix(2)

org.springframework.cloud.gateway.handler.FilteringWebHandler#handle debug查看排序后的combined,就可以知道filters的具体排序

Maybrittnelson commented 5 years ago

WeightCalculatorWebFilter 为什么在 DispatcherHandler之前执行?

org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter#getWeights

exchange.getAttributes().put(WEIGHT_ATTR, weights);
weights.put(group, routeId);

org.springframework.cloud.gateway.handler.predicate.WeightRoutePredicateFactory#apply

Map<String, String> weights = exchange.getAttributeOrDefault(WEIGHT_ATTR,
Collections.emptyMap());
String routeId = exchange.getAttribute(GATEWAY_PREDICATE_ROUTE_ATTR);
// all calculations and comparison against random num happened in
// WeightCalculatorWebFilter
String group = config.getGroup();
if (weights.containsKey(group)) {
String chosenRoute = weights.get(group);
return routeId.equals(chosenRoute);
}