美文网首页
SpringCloud-Zuul-02设计原理

SpringCloud-Zuul-02设计原理

作者: 小亮__ | 来源:发表于2019-06-22 18:01 被阅读0次

Zuul的工作原理

zuul的核心是一系列的filters(过滤器), 其作用可以类比Servlet框架的Filter,或者AOP。Zuul框架可以对过滤器进行动态的加载,编译,运行。

Zuul模块图

模块介绍-RequestContext

Zuul内置了很多的过滤器,这些过滤器帮助我们实现各种功能, 而在Zuul的过滤器之间是通过一个RequestContext的静态类来进行数据传递:

  • RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据。
  • RequestContext用于存储请求路由到哪里、错误、HttpServletRequest、HttpServletResponse
  • RequestContext扩展了ConcurrentHashMap,所以,任何数据都可以存储在上下文中。

模块介绍-Filter类型

Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。

  • PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
  • ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
  • POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
  • ERROR:在其他阶段发生错误时执行该过滤器。

模块介绍-Zuul内置过滤器

SpringCloud默认为Zuul编写了一些过滤器,我们下面来分析一下使用@EnableZuulServer、@EnableZuulProxy这两个注解时,都默认使用了哪些过滤器

@EnableZuulServer注解,框架为我们内置了以下过滤器

pre类型过滤器
- ServletDetectionFilter:该过滤器用于检查请求是否通过Spring Dispatcher。检查后,通过isDispatcherServletRequest设置布尔值。
- FormBodyWrapperFilter:解析表单数据,并为请求重新编码。
- DebugFilter:顾名思义,调试用的过滤器,该过滤器就会把RequestContext.setDebugRouting() 、RequestContext.setDebugRequest() 设为true
    - 开启方法1:设置zuul.debug.request=true 开启
    - 开启方法2:在请求时加上debug=true的参数,例如$ZUUL_HOST:ZUUL_PORT/path?debug=true

route类型过滤器
- SendForwardFilter:该过滤器使用Servlet RequestDispatcher转发请求,转发位置存储在
  RequestContext.getCurrentContext().get("forward.to") 中。可以将路由设置成:
       - zuul.routes.server1.path=/server1/**
       - zuul.routes.server1.url=forward:/server1
  然后访问$ZUUL_HOST:ZUUL_PORT/abc ,观察该过滤器的执行过程

post类型过滤器
- SendResponseFilter:将Zuul所代理的微服务的的响应写入当前响应。

error类型过滤器
- SendErrorFilter:如果RequestContext.getThrowable() 不为null,那么默认就会转发到/error,也可以设置error.path属性修改默认的转发路径。

@EnableZuulProxy注解,包含以上所有的过滤器之外,还增加了以下过滤器

pre类型过滤器
- PreDecorationFilter:该过滤器根据提供的RouteLocator确定路由到的地址,以及怎样去路由。
  该路由器也可为后端请求设置各种代理相关的header。

route类型过滤器
- RibbonRoutingFilter:该过滤器使用Ribbon,Hystrix和可插拔的HTTP客户端发送请求。
  serviceId在RequestContext.getCurrentContext().get("serviceId") 中。
  该过滤器可使用不同的HTTP客户端,例如
    - Apache HttpClient:默认的HTTP客户端
    - Squareup OkHttpClient v3:配置ribbon.okhttp.enabled = true开启,并引入相关依赖
    - Netflix Ribbon HTTP client:设置ribbon.restclient.enabled = true 开启,需要注意的是,
        - 该客户端有一定限制,例如不支持PATCH方法,
        - 它有内置的重试机制。

- SimpleHostRoutingFilter:该过滤器通过Apache HttpClient向指定的URL发送请求。URL在RequestContext.getRouteHost() 中。

相关文章

  • SpringCloud-Zuul-02设计原理

    Zuul的工作原理 zuul的核心是一系列的filters(过滤器), 其作用可以类比Servlet框架的Filt...

  • RTOS基础(邮箱)

    邮箱的原理与创建 问题概述 设计原理 设计实现 邮箱的获取和释放 设计原理 设计实现 邮箱的清空与删除 设计原理 ...

  • RTOS基础(其他)

    堆栈使用量测量 问题概述 设计原理 设计实现 CPU百分比 设计需求 设计原理 设计实现 内核裁剪 设计原理 Ho...

  • RTOS(事件标志组)

    事件标志组的原理与创建 问题概述 设计原理 设计实现 事件标志组的等待与通知 设计需求 设计原理 设计实现 事件标...

  • 汽车电子硬件开发规范

    1 原理图设计流程 原理图设计是从系统设计到硬件细节设计的基础,细节设计是“系统框图-原理图-电路版图”不断设计的...

  • RTOS基础(存储块)

    存储块的原理与创建 问题概述 设计原理 设计实现 存储块的获取与释放 设计原理 设计实现 存储块的删除和状态查询 ...

  • RTOS基础(计数信号量)

    计数信号量的原理与创建 概述 设计原理 设计实现 计数信号量的获取与释放 设计原理 设计实现 计数信号的删除与状态...

  • 【读书】《银行4.0》第一性原理和iPhone设计

    第一性原理,与类比设计和微设计不同,第一性原理回归问题的本源,回归设计的本质——设计是为了什么。 第一性原理设计的...

  • 缓存设计

    目录 缓存设计需要考虑的地方 项目代码编写 mybaits缓存设计原理 guava缓存设计原理 本地缓存设计需要考...

  • •设计原理•读书笔记

    1、设计原理的作用 设计原理是为了帮助设计师,而不是限制设计师的创造力。设计师要在熟悉原理的基础上理解它们,这样在...

网友评论

      本文标题:SpringCloud-Zuul-02设计原理

      本文链接:https://www.haomeiwen.com/subject/itevqctx.html