原创地址,jsbintask的博客(食用效果最佳),转载请注明出处!

前言

上一篇介绍了SpringCloud使用Zuul的调用流程,明白了Zuul的工作原理关键在于ZuulServlet和它的内置Filter,所以在实际工作中,编写业务逻辑的关键就在于自定义filter。

用法

实现ZuulFilter

实现一个自定义Filter很简单,继承自ZuulFilter即可:

@Component
public class Filter extends ZuulFilter {@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext context = RequestContext.getCurrentContext().getRequest();HttpServletRequest request = context.getRequest();HttpServletResponse response = context.getResponse();System.out.println("Filter.run");return null;}
}
复制代码
  1. filterType方法返回filter类型
  2. filterOrder返回同类型filter执行顺序
  3. shouldFilter返回请求是否应该执行run方法。
  4. run表示业务逻辑执行过程。
  5. 处理逻辑过程中如果需要用到HttpServletRequest和HttpServletResponse可以用RequestContext.getCurrentContext()拿出。

Filter类型

Zuul的Filter一共分为四个种类,Pre,Route,Post,Error,每种Filter的执行时机不同,所以他们在业务逻辑功能上有所不同,如图:

  1. Pre类型的Filter总是先执行,它可以做限流,权限控制等。
  2. Route类型的Filter为Zuul内部转发请求到真正的服务的Filter,一般我们不需要实现这种类型.
  3. Post为请求转发完成后的后续动作,可以进行日志等的一些添加。
  4. Error为上述Filter出错后执行的动作,可以进行错误处理等。 关于它们的执行顺序,如图:

源码解析

zuul内部已经定义了各种类型的filter,如预处理,路由转发,错误处理等。我们可以通过源码来研究Zuul是如何帮我们转发请求的:

  1. RibbonRoutingFilter
  2. SimpleHostRoutingFilter
  3. 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: 这样一次完整的路由,转发,错误处理就分析完毕。

总结

  1. Zuul内部使用自定义filter处理业务逻辑。
  2. Zuul内部有四种不同类型的Filter。
  3. Zuul内部转发请求有两种,为服务下边的RibbonRoutingFilter,普通http转发的SimpleHostRoutingFilter.

关注我,这里只有干货!

相关文章: SpringCloud-Zuul(一):技术选型及请求流程源码走读

SpringCloud-Zuul(二):自定义Filter及内部路由源码解析相关推荐

  1. Flutter 路由源码解析

    前言 这一次,我尝试以不贴一行源代码的方式向你介绍 Flutter 路由的实现原理,同时为了提高你阅读源码的积极性,除了原理介绍以外,又补充了两个新的模块:从源码中学习到的编程技巧,以及 阅读源码之后 ...

  2. ThinkPHP路由源码解析(三)

    本文接着上文继续来解读路由源码,如果你看到本文可以先看一下之前写的路由文章,共计俩篇. ThinkPHP路由源码解析 前言 一.检测路由-合并分组参数.检查分组路由 二.检测URL变量和规则路由是否匹 ...

  3. 深入理解WMS(二):Dialog与Toast源码解析

    作者:ScottStone 链接:https://www.jianshu.com/p/1090d6c33dec 通过上面的分析可以看出,View是Android中的视图呈现方式,但是View并不能单独 ...

  4. ThinkPHP路由源码解析(一)

    路由是项目开发中比较重要的一个环节,每个项目都会使用路由进行管理接口,接下来本文会从源码方面带大家一起学习路由. 框架路由解析 前言 一.路由初识化简单分析 二.通过定义路由再谈门面 三.路由定义ru ...

  5. Android View系列(二):事件分发机制源码解析

    概述 在介绍点击事件规则之前,我们需要知道我们分析的是MotionEvent,即点击事件,所谓的事件分发就是对MotionEvent事件的分发过程,即当一个MotionEvent生成以后,系统需要把这 ...

  6. 吃透MySQL(二):JDBC原理及源码解析

    文章目录 一,JDBC使用 二,JDBC原理 1,JDBC基本原理 2,Java SPI机制 三,JDBC源码分析 自JDBC4.0开始,Class.forName(""),可以省 ...

  7. SpringCloud Nacos 心跳机制和服务健康检查源码解析

    1 客户端心跳机制 1.1 客户端注册源码流程 https://blog.csdn.net/qq_34125999/article/details/117566523 1.2 NacosNamingS ...

  8. Zuul源码解析(一)

    说在前面 我们公司有一个线上服务报错通知群,经常报网关服务的一个 EOFException 异常.这个异常报出来好久了,如下图所示,艾特相关的人也不去处理,大概是不重要异常吧,反正看样子是不影响线上核 ...

  9. 路由框架ARouter最全源码解析

    ARouter是2017年阿里巴巴开源的一款Android路由框架,官方定义: ARouter是Android平台中对页面,服务提供路由功能的中间件,提倡简单且够用 有下面几个优势: 1.直接解析UR ...

  10. gateway 过滤器执行顺序_Gateway网关源码解析—路由(1.1)之RouteDefinitionLocator一览...

    一.概述 本文主要对 路由定义定位器 RouteDefinitionLocator 做整体的认识. 在 <Spring-Cloud-Gateway 源码解析 -- 网关初始化> 中,我们看 ...

最新文章

  1. 使用flexible适配移动端h5页面
  2. MongoDB3.4 版本新节点同步的一点惊喜
  3. 识别SDN中的安全隐患
  4. PAT 1152 Google Recruitment (20 分)- 甲级
  5. Javascript中的AES加密和Java中的解密
  6. Windows Terminal完整指南
  7. 路由器功能 后台管理 各功能 介绍
  8. libevent在windows平台下通过vs进行编译
  9. qt与JAVA服务器通信_Qt实现的SSL通信客户端和服务器
  10. Ubuntu 20.04无法连接网络(网络图标丢失)的解决方案
  11. iOS小技能: 创建渐变色背景(提供渐变色无法覆盖整个视图的解决方案)
  12. 案例-旋转中心(CSS3)
  13. Python实现TF-IDF提取关键词(sklearn库的使用)
  14. CSV文件内容乱码处理办法
  15. 8 8点阵显示原理c语言,8X8 LED点阵显示原理与编程技术
  16. 天河1号计算机配置,“天河一号”超级计算机配置抢先披露
  17. 如何在Visio导出pdf文件时不带边框
  18. 《谷歌宣布Chrome不再信任所有赛门铁克SSL证书》误读新闻的澄清说明
  19. 关于项目启动会和项目开工会议的区别
  20. 值得一看的电影(转载自百度)

热门文章

  1. 图论算法——最短路径算法
  2. 这一小点程序员务实的调整,可以避免整个开发团队的崩溃
  3. Git的17条基本用法
  4. 博文视点新书样章下载
  5. 21天学通Java调用不存在的对象或成员变量
  6. 5.6 tensorflow2实现奇异值分解(SVD)——python实战(上篇)
  7. PyTorch:tensor-张量维度操作(拼接、维度扩展、压缩、转置、重复……)
  8. 海量数据挖掘MMDS week5: 计算广告Computational Advertising
  9. C语言断言assert详解
  10. yum mysql 无法启动失败_Linux下MySQL数据库yum升级后无法启动解决办法