Zuul-@EnableZuulServer VS. @EnableZuulProxy

        Zuul为我们提供了两个主应用注解: @EnableZuulServer和@EnableZuulProxy,其中@EnableZuulProxy包含@EnableZuulServer的功能,而且还加入了@EnableCircuitBreaker和@EnableDiscoveryClient。当我们需要运行一个没有代理功能的Zuul服务,或者有选择的开关部分代理功能时,那么需要使用 @EnableZuulServer 替代 @EnableZuulProxy。 这时候我们可以添加任何 ZuulFilter类型实体类都会被自动加载,这和上一篇使用@EnableZuulProxy是一样,但不会自动加载任何代理过滤器。

1 @EnableZuulServer默认过滤器

当我们使用@EnableZuulServer时,默认所加载的过滤器有:

1.1  PRE类型过滤器

  • ServletDetectionFilter

该过滤器是最先被执行的。其主要用来检查当前请求是通过SpringDispatcherServlet处理运行的,还是通过ZuulServlet来处理运行的。判断结果会保存在isDispatcherServletRequest中,值类型为布尔型。

  • FormBodyWrapperFilter

该过滤器的目的是将符合要求的请求体包装成FormBodyRequestWrapper对象,以供后续处理使用。

  • DebugFilter

PRE类型过滤器。当请求参数中设置了debug参数时,该过滤器会将当前请求上下文中的RequestContext.setDebugRouting()RequestContext.setDebugRequest()设置为true,这样后续的过滤器可以根据这两个参数信息定义一些debug信息,当生产环境出现问题时,我们就可以通过增加该参数让后台打印出debug信息,以帮助我们进行问题分析。对于请求中的debug参数的名称,我们可以通过zuul.debug.parameter进行自定义。

1.2 ROUTE类型过滤器

  • SendForwardFilter

该过滤器只对请求上下文中存在forward.to(FilterConstants.FORWARD_TO_KEY)参数的请求进行处理。即处理之前我们路由规则中forward的本地跳转。

1.3 POST类型过滤器

  • SendResponseFilter

该过滤器就是对代理请求所返回的响应进行封装,然后作为本次请求的相应发送回给请求者。

1.4 Error类型过滤器

  • SendErrorFilter

该过滤器就是判断当前请求上下文中是否有异常信息(RequestContext.getThrowable()不为空),如果有则默认转发到/error页面,我们也可以通过设置error.path来自定义错误页面。

2 @EnableZuulProxy默认过滤器

@EnableZuulProxy则在上面的基础上增加以下过滤器:

2.1 PRE类型过滤器

  • PreDecorationFilter

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

2.2 ROUTE类型过滤器

  • RibbonRoutingFilter

该过滤器会针对上下文中存在serviceId(可以通过RequestContext.getCurrentContext().get(“serviceId”)获取)的请求进行处理,使用Ribbon、Hystrix和可插拔的HTTP客户端发送请求,并将服务实例的请求结果返回。也就是之前所说的只有当我们使用serviceId配置路由规则时Ribbon和Hystrix方才生效。

  • SimpleHostRoutingFilter

该过滤器检测到routeHost参数(可通过RequestContext.getRouteHost()获取)设置时,就会通过Apache HttpClient向指定的URL发送请求。此时,请求不会使用Hystrix命令进行包装,所以这类请求也就没有线程隔离和断路器保护。

猜你喜欢

转载自blog.csdn.net/u010277958/article/details/88810894
今日推荐