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

栏目: Java · 发布时间: 5年前

内容简介:上一篇介绍了实现一个自定义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的执行时机不同,所以他们在业务逻辑功能上有所不同,如图:

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

源码解析

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

SpringCloud-Zuul(二):自定义Filter及内部路由源码解析
  1. RibbonRoutingFilter
  2. SimpleHostRoutingFilter
  3. SendForwardFilter 上面三个Filter只会执行一个,控制它们执行过程的为 PreDecorationFilter :
    SpringCloud-Zuul(二):自定义Filter及内部路由源码解析
    当整合的是微服务时,则配置的为服务名,如:
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进行转发:

SpringCloud-Zuul(二):自定义Filter及内部路由源码解析
而当请求出错时,则会交由 SendErrorFilter 处理,它会设置标志位 SEND_ERROR_FILTER_RAN 为true,然后重新发送请求到 PreDecorationFilter

。这个时候的流程为:

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

SendForwardFilter:

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

这样一次完整的路由,转发,错误处理就分析完毕。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Scrum精髓

Scrum精髓

Kenneth Rubin / 姜信宝、米全喜、左洪斌、(审校)徐毅 / 清华大学出版社 / 2014-6-1 / CNY 79.00

短短几年时间,Scrum跃升为敏捷首选方法,在全球各地得以普遍应用。针对如何用好、用巧这个看似简单的框架,本书以通俗易懂的语言、条理清晰的脉络阐述和提炼出Scrum的精髓。全书共4部分23章,阐述了七大核心概念:Scrum框架,敏捷原则,冲刺,需求和用户故事,产品列表,估算与速率,技术债;三大角色:产品负责人,ScrumMaster,开发团队以及Scrum团队构成:Scrum规划原则及四大规划活动......一起来看看 《Scrum精髓》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具