内容简介:上一篇介绍了实现一个自定义Filter很简单,继承自Zuul的Filter一共分为四个种类,
上一篇介绍了 SpringCloud使用Zuul的调用流程
,明白了Zuul的工作原理关键在于ZuulServlet和它的内置Filter,所以在实际工作中,编写业务逻辑的关键就在于自定义filter。
用法
实现ZuulFilter
实现一个自定义Filter很简单,继承自 ZuulFilter
即可:
@Component public class Filter extends ZuulFilter { @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { RequestContext context = RequestContext.getCurrentContext().getRequest(); HttpServletRequest request = context.getRequest(); HttpServletResponse response = context.getResponse(); System.out.println("Filter.run"); return null; } } 复制代码
同类型filter执行顺序 RequestContext.getCurrentContext()
Filter类型
Zuul的Filter一共分为四个种类, Pre
, Route
, Post
, Error
,每种Filter的执行时机不同,所以他们在业务逻辑功能上有所不同,如图:
- Pre类型的Filter总是先执行,它可以做
限流
,权限控制
等。 - Route类型的Filter为Zuul内部转发请求到真正的服务的Filter,一般我们不需要实现这种类型.
- Post为请求转发完成后的后续动作,可以进行日志等的一些添加。
- Error为上述Filter出错后执行的动作,可以进行错误处理等。 关于它们的执行顺序,如图:
源码解析
zuul内部已经定义了各种类型的filter,如预处理,路由转发,错误处理等。我们可以通过源码来研究Zuul是如何帮我们转发请求的:
-
RibbonRoutingFilter
-
SimpleHostRoutingFilter
-
SendForwardFilter
上面三个Filter只会执行一个,控制它们执行过程的为PreDecorationFilter
: 当整合的是微服务时,则配置的为服务名,如:
zuul: prefix: /api routes: espay-auth: path: /test/** service-id: service-name 复制代码
这个时候将调用RibbonRoutingFilter作负载均衡转发请求:
protected ClientHttpResponse forward(RibbonCommandContext context) throws Exception { Map<String, Object> info = this.helper.debug(context.getMethod(), context.getUri(), context.getHeaders(), context.getParams(), context.getRequestEntity()); RibbonCommand command = this.ribbonCommandFactory.create(context); try { ClientHttpResponse response = command.execute(); this.helper.appendDebug(info, response.getRawStatusCode(), response.getHeaders()); return response; } catch (HystrixRuntimeException ex) { return handleException(info, ex); } } 复制代码
而当我们配置的直接为某个地址:
zuul: routes: espay-auth: path: /auth/** url: http://baidu.com 复制代码
则会调用SimpleHostRoutingFilter进行转发,它内部直接使用HttpClient进行转发:
而当请求出错时,则会交由SendErrorFilter
处理,它会设置标志位
SEND_ERROR_FILTER_RAN
为true,然后重新发送请求到
PreDecorationFilter
。这个时候的流程为:
SendForwardFilter:
这样一次完整的路由,转发,错误处理就分析完毕。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- gin 源码阅读(二)-- 路由和路由组
- express源码分析-路由
- flask 源码解析3:路由
- RocketMQ源码分析之路由中心
- Laravel HTTP——添加路由源码分析
- RocketMQ 源码分析之路由中心(NameServer)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。