Spring Cloud Netflix Zuul

1. FilterConstants

org.springframework.cloud.netflix.zuul.filters.support.FilterConstants中,可以看到Zuul定义了一些默认Filter的执行顺序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public final class FilterConstants {

//省略...

// ORDER constants -----------------------------------

/**
* Filter Order for {@link DebugFilter#filterOrder()}.
*/
public static final int DEBUG_FILTER_ORDER = 1;

/**
* Filter Order for
* {@link org.springframework.cloud.netflix.zuul.filters.pre.FormBodyWrapperFilter#filterOrder()}.
*/
public static final int FORM_BODY_WRAPPER_FILTER_ORDER = -1;

/**
* Filter Order for
* {@link org.springframework.cloud.netflix.zuul.filters.pre.PreDecorationFilter}.
*/
public static final int PRE_DECORATION_FILTER_ORDER = 5;

/**
* Filter Order for
* {@link org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter#filterOrder()}.
*/
public static final int RIBBON_ROUTING_FILTER_ORDER = 10;

/**
* Filter Order for
* {@link org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter#filterOrder()}.
*/
public static final int SEND_ERROR_FILTER_ORDER = 0;

/**
* Filter Order for {@link SendForwardFilter#filterOrder()}.
*/
public static final int SEND_FORWARD_FILTER_ORDER = 500;

/**
* Filter Order for
* {@link org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter#filterOrder()}.
*/
public static final int SEND_RESPONSE_FILTER_ORDER = 1000;

/**
* Filter Order for
* {@link org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter#filterOrder()}.
*/
public static final int SIMPLE_HOST_ROUTING_FILTER_ORDER = 100;

/**
* filter order for {@link Servlet30WrapperFilter#filterOrder()}.
*/
public static final int SERVLET_30_WRAPPER_FILTER_ORDER = -2;

/**
* filter order for
* {@link org.springframework.cloud.netflix.zuul.filters.pre.ServletDetectionFilter#filterOrder()}.
*/
public static final int SERVLET_DETECTION_FILTER_ORDER = -3;

//省略...

}

2. 默认Filter

pre

  • ServletDetectionFilter (-3):检测请求是通过DispatcherServlet还是ZuulServlet 运行的.
  • Servlet30WrapperFilter(-2):对Servlet3.0环境的包装器过滤
  • FormBodyWrapperFilter(-1):为下游服务解析表单数据并重新编码.仅在content-type为application/x-www-form-urlencoded或者multipart/form-data时生效.
  • DebugFilter(1):如果设置了“debug”请求参数,则将{@link RequestContext}调试属性设置为true
  • PreDecorationFilter(5):根据提供的{@link RouteLocator}确定路由的位置和方式。 *还为下游请求设置各种代理相关的标头

route

  • RibbonRoutingFilter(10):使用Ribbon,Hystrix和可插入的http客户端发送请求。
  • SimpleHostRoutingFilter(100):通过过apache http clients向预定的url发送请求.
  • SendForwardFilter(500):使用requestDispatcher 转发请求.

post

  • SendResponseFilter(1000):将代理请求的响应写入当前响应。

error

  • SendErrorFilter(0):默认情况下转发到/error路径,如果RequestContext.getThrowable()不是空。