zuul入门(2)zuul 的关键组件和用途

1、ContextLifecycleFilter

2、ZuulServlet 接收请求

ZuulServlet类似SpringMvc的DispatcherServlet,所有的Request都要经过ZuulServlet的处理,因此ZuulServlet是zuul框架源码分析的入口点。

zuul逻辑的入口是ZuulServlet.service(ServletRequest servletRequest, ServletResponse servletResponse)

RequestContext提供了执行filter Pipeline所需要的Context,因为Servlet是单例多线程,这就要求RequestContext即要线程安全又要Request安全

context使用ThreadLocal保存,这样每个worker线程都有一个与其绑定的RequestContext,因为worker仅能同时处理一个Request,这就保证了Request Context 即是线程安全的由是Request安全的。

三个核心的方法preRoute(),route()postRoute(),zuul对request处理逻辑都在这三个方法里,ZuulServlet交给ZuulRunner去执行。

由于ZuulServlet是单例,因此ZuulRunner也仅有一个实例。

3、ZuulServlet 处理请求:ZuulRunner - 》FilterProcessor

ZuulRunner直接将执行逻辑交由FilterProcessor处理,FilterProcessor也是单例,其功能就是依据filterType执行filter的处理逻辑:

FilterProcessor对filter的处理逻辑。

  • 首先根据Type获取所有输入该Type的filter,List<ZuulFilter> list
  • 遍历该list,执行每个filter的处理逻辑,processZuulFilter(ZuulFilter filter)
  • RequestContext对每个filter的执行状况进行记录,应该留意,此处的执行状态主要包括其执行时间、以及执行成功或者失败,如果执行失败则对异常封装后抛出。 
    到目前为止,zuul框架对每个filter的执行结果都没有太多的处理,它没有把上一filter的执行结果交由下一个将要执行的filter,仅仅是记录执行状态,如果执行失败抛出异常并终止执行。

4、重中之重:ZuulFilter

  • Type:定义filter的类别,用字符串表示,有四种标准类别,代表了Request的生命周期。filterType()返回值代表该filter的Type。

    1. PRE: 该类型的filters在Request routing到源web-service之前执行。用来实现Authentication、选择源服务地址等
    2. ROUTING:该类型的filters用于把Request routing到源web-service,源web-service是实现业务逻辑的服务。这里使用HttpClient请求web-service。
    3. POST:该类型的filters在ROUTING返回Response后执行。用来实现对Response结果进行修改,收集统计数据以及把Response传输会客户端。
    4. ERROR:上面三个过程中任何一个出现错误都交由ERROR类型的filters进行处理。
  • Execution Order: 同一个Type的filters组成Pipeline,Execution Order决定他们执行的顺序。filterOrder()返回值是该filter的Execution Order
  • Criteria:定义了filter执行需要满足的条件。对应的方法是shouldFilter()
  • Action: 定了filter处理逻辑。对应的方法是run()

5、总结一下

zuul框架主要的功能就是动态的读取\编译\运行这些filter。filter之间之间通过RequestContext共享状态信息,

既然filter都是对特定Request的处理,那么RequestContext就是Request的Context,RequestContext用来管理 Request的Context,不受其它Request的影响。

Filter源码文件放在zuul 服务特定的目录, zuul server会定期扫描目录下的文件的变化。

如果有Filter文件更新,源文件会被动态的读取,编译加载进入服务,接下来的Request处理就由这些新加入的filter处理。

时间: 2024-12-11 00:26:24

zuul入门(2)zuul 的关键组件和用途的相关文章

zuul入门(4)zuul的注解@EnableZuulServer和@EnableZuulProxy

@EnableZuulServer.@EnableZuulProxy两个注解 @EnableZuulProxy简单理解为@EnableZuulServer的增强版,当Zuul与Eureka.Ribbon等组件配合使用时,我们使用@EnableZuulProxy. RequestContext:用于在过滤器之间传递上下文,如:请求路由到哪里.错误.HttpServletRequest.HttpServletResponse,数据保存在每个请求的ThreadLocal中. 一.@EnableZuul

服务网关zuul之七:zuul中的动态刷新路由配置

Spring cloud使用/refresh端点手动刷新配置 一 介绍很多场景下,需要在运行期间动态调整配置.如果配置发生了修改,微服务也应该实现配置的刷新.下面实现配置的手动刷新.二 新建项目microservice-config-client-refresh三 为项目添加spring-boot-starter-actuator依赖,该依赖包含了/refresh端点,用于配置的刷新. <dependencies> <dependency> <groupId>org.s

antd源码分析之——标签页(tabs 2.Tabs关键组件功能实现)

由于ant Tabs组件结构较复杂,共分三部分叙述,本文为目录中第二部分(高亮) 目录 一.组件结构 antd代码结构 rc-ant代码结构 1.组件树状结构 2.Context使用说明 3.rc-tabs中只在example.test中使用的组件说明 二.Tabs关键组件功能实现 1.Tabs(antd) 2.RcTabs 3.Sentinel哨兵 4.InkTabBarNode 三.Tabs的滚动效果 ScrollableTabBarNode 二.Tabs关键组件功能实现 1.Tabs(an

Spring Cloud入门教程 - Zuul实现API网关和请求过滤

简介 Zuul是Spring Cloud提供的api网关和过滤组件,它提供如下功能: 认证 过滤 压力测试 Canary测试 动态路由 服务迁移 负载均衡 安全 静态请求处理 动态流量管理 在本教程中,我们将用zuul,把web端的请求/product转发到对应的产品服务上,并且定义一个pre过滤器来验证是否经过了zuul的转发. 基础环境 JDK 1.8 Maven 3.3.9 IntelliJ 2018.1 Git 项目源码 Gitee码云 创建Zuul服务 在IntelliJ中创建一个ma

zuul入门(3)过滤器

Zuul大部分功能都是通过过滤器来实现的.Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期. (1) PRE:这种过滤器在请求被路由之前调用.我们可利用这种过滤器实现身份验证.在集群中选择请求的微服务.记录调试信息等. (2) ROUTING:这种过滤器将请求路由到微服务.这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务. (3) POST:这种过滤器在路由到微服务以后执行.这种过滤器可用来为响应添加

zuul入门(5)zuul的过滤器加载

一.Groovy编写的Filter 1.可以放到指定目录加载 创建一个pre类型的filter,在run方法中获取HttpServletRequest 然后答应header信息 在代码中加入groovy编译器,间隔10秒扫描一次groovy文件,其代码如下: <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <ver

zuul入门(4-1)zuul

https://my.oschina.net/u/3300636/blog/851984 netflix zuul 是netflix开发的一个API Gateway 服务器,可以实现安全,流量控制等功能. Zuul1.x的实现原理基本是一个Servlet 应用. 具体例子可以参考 netflix 在github上的 simple webapp,可以按照netflix 在github wiki 上文档说明来进行使用. 1.StartServer 2.ZuulServlet 3.ContextLif

服务网关zuul之四:zuul网关配置

禁用过滤器在Zuul中特别提供了一个参数来禁用指定的过滤器,该参数的配置格式如下:zuul.AccessFilter.pre.disable=true动态加载动态路由通过结合Spring Cloud Config的动态刷新机制,可以是实现动态刷新路由规则的功能.动态过滤器对于实现请求过滤器的动态加载,我们需要借助JVM实现的动态语言的帮助,比如Groovy.

服务网关zuul之六:Zuul高可用

我们实际使用Zuul的方式如上图,不同的客户端使用不同的负载将请求分发到后端的Zuul,Zuul在通过Eureka调用后端服务,最后对外输出.因此为了保证Zuul的高可用性,前端可以同时启动多个Zuul实例进行负载,在Zuul的前端使用Nginx或者F5进行负载转发以达到高可用性. 原文地址:https://www.cnblogs.com/duanxz/p/9715517.html