这里开始记录zuul中级进阶内容。前面说过了,zuul主要是一层一层的Filter过滤器组成,并且Zuul的逻辑引擎与Filter可用其他基于JVM的语言编写,比如:Groovy。

  • 工作原理

Zuul的核心逻辑是由一系列紧密相连配合工作的Filter来实现,它们能够在进行HTTP请求的或者响应的时候执行相关操作。Zuul filter的主要特性有以下几点:

□ Filter的类型:决定了Filter在Filter链的执行顺序。可能是路由之前、路由之中、路由之后、路由异常时;

     □ Filter的执行顺序:同一种类型的Filter可以通过filterOrder()方法设置执行顺序。一般根据需求去设定;

□ Filter的执行条件:Filter运行时需要的标准或条件;

□ Filter的执行效果:产生的执行效果。

Zuul内部提供了一个动态读取、编译、运行这些Filter的机制。Filter之间不直接通信,在请求线程中通过RequestContext共享状态(用ThreadLocal实现),当然也可以在Filter之间使用ThreadLocal来收集自己需要的状态或数据。也就是使用RequestContext上下文。

  Zuul中不同类型Filter的执行逻辑在com.netflix.zuul.http.ZuulServlet定义,相关代码:

 @Override
public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletException, IOException {
try {
init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); // Marks this request as having passed through the "Zuul engine", as opposed to servlets
// explicitly bound in web.xml, for which requests will not have the same data attached
RequestContext context = RequestContext.getCurrentContext();
context.setZuulEngineRan(); try {
preRoute();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
route();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
postRoute();
} catch (ZuulException e) {
error(e);
return;
} } catch (Throwable e) {
error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName()));
} finally {
RequestContext.getCurrentContext().unset();
}
}

这些代码其实就能看出整个请求的执行顺序了。待会后面你就会发现这个顺序。

  •  Zuul总共有四种不同的生命周期类型的Filter:

pre:  在路由下级服务之前执行;比如鉴权、限流都是需要在此类Filter执行。

route:这类Filter是Zuul路由动作的执行者,是Apache HTTPClient或Netflix Ribbon构建和发送原始Http请求的地方,目前已支持OKHTTP。

post:这类Filter是源服务返回结果或发生异常信息发生后执行的;需要对返回信息做一些处理,可以在此类Filter处理。

error:在整个生命周期内如果发生异常,则会进入error Filter,可做全局异常处理。

实际开发中经常会根据需求,然后自定义实现以上类型的FIlter。在Filter之中,通过com.netflix.zuul.context。RequestContext类进行通讯,内部采用ThreadLocal保存每个请求的一些信息,包括请求路由、错误信息、HttpServletRequest、HTTPServletResponse,它还扩展了ConcurrentHashMap,目的是为了在处理过程中保存任何形式的信息。

  • 禁用原生Filter:zuul.<SimpleClassName>.<filterType>.disable=true

最新文章

  1. Ubuntu 16.04 nvidia安装
  2. mysql数据库之基础SQL语句/语法
  3. AngularJS中ng-options简单用法及预选项失败的原因
  4. Makefile中使用foreach生成一类规则
  5. DirectX 9 UI三种设计学习笔记:文章4章Introducing DirectInput+文章5章Wrapping Direct3D
  6. 第9章 组合模式(Composite Pattern)
  7. android 控件注意点
  8. GetWindowRect和GetClientRect的异同
  9. android动态LinearLayout
  10. ZOJ2150 Raising Modulo Numbers 快速幂
  11. 前端开发人员需要了解的CSS原理
  12. 记录一则enq: TX - row lock contention的分析过程
  13. SqlServer查询优化方法
  14. Python成绩
  15. python 让挑选家具更方便
  16. Jmeter获取redis数据
  17. php 使用curl获取Location:重定向后url
  18. 使用 Markdown 写技术博客,踩过的 6个坑
  19. ls 命令查看文件时候,按修改时间倒序或升序排列
  20. 一、集合框架(HashMap和Hashtable的区别)

热门文章

  1. angularjs杂谈
  2. iTOP-4412/4418/6818开发板-fastboot烧写脚本
  3. day17——其他内置函数
  4. Linux下执行自定义的可执行命令无效原因
  5. [MySQL]如何支持utf8格式的UCS4unicode字符
  6. 四, 判断语句; 循环; 使用dict和set
  7. C++多线程join同步问题
  8. P2255 [USACO14JAN]记录奥林比克
  9. matplotlib 中的柱状图
  10. verilog function功能函数写法