Spring Cloud内置的Zuul过滤器详解

2019-04-03  本文已影响0人  康俊1024

问题

  1. Spring Cloud默认为Zuul编写并启用了一些过滤器,这些过滤器有什么作用呢?
  2. 为什么说@EnableZuulServer是一个“空白”的Zuul?
  3. @EnableZuulServer、@EnableZuulProxy两个注解的区别是什么呢?

RequestContext

用于在过滤器之间传递消息。它的数据保存在每个请求的ThreadLocal中。它用于存储请求路由到哪里、错误、HttpServletRequest、HttpServletResponse都存储在RequestContext中。RequestContext扩展了ConcurrentHashMap,所以,任何数据都可以存储在上下文中。

EnableZuulServer过滤器

pre类型过滤器

ServletDetectionFilter:该过滤器用于检查请求是否通过Spring Dispatcher。检查后,通过isDispatcherServletRequest设置布尔值。
FormBodyWrapperFilter:解析表单数据,并为请求重新编码。
DebugFilter:顾名思义,调试用的过滤器,可以通过zuul.debug.request=true ,或在请求时,加上debug=true的参数,例如$ZUUL_HOST:ZUUL_PORT/path?debug=true 开启该过滤器。这样,该过滤器就会把RequestContext.setDebugRouting() 、RequestContext.setDebugRequest()设为true。

route类型过滤器

SendForwardFilter:该过滤器使用Servlet RequestDispatcher转发请求,转发位置存储在RequestContext.getCurrentContext().get("forward.to")中。可以将路由设置成:

zuul:
  routes:
    abc: 
      path: /abc/**
      url: forward:/abc

post类型过滤器

SimpleHostRoutingFilter:该过滤器通过Apache HttpClient向指定的URL发送请求。URL在RequestContext.getRouteHost() 中。
SendResponseFilter:将Zuul所代理的微服务的的响应写入当前响应。

error类型过滤器

SendErrorFilter:如果RequestContext.getThrowable() 不为null,那么默认就会转发到/error,也可以设置error.path属性修改默认的转发路径。

EnableZuulProxy过滤器

如果使用注解@EnableZuulProxy,那么除上述过滤器之外,Spring Cloud还会安装以下过滤器:

pre类型过滤器

PreDecorationFilter:该过滤器根据提供的RouteLocator确定路由到的地址,以及怎样去路由。该路由器也可为后端请求设置各种代理相关的header。

route类型过滤器

SimpleHostRoutingFilter:该过滤器通过Apache HttpClient向指定的URL发送请求。URL在RequestContext.getRouteHost() 中。
RibbonRoutingFilter:该过滤器使用Ribbon,Hystrix和可插拔的HTTP客户端发送请求。serviceId在
RequestContext.getCurrentContext().get("serviceId") 中。该过滤器可使用不同的HTTP客户端,例如

上一篇下一篇

猜你喜欢

热点阅读