今天我们说说Springcloud的另一个组件——Zuul。其就像一个城堡的大门,如果想进入城堡,必须经过它的“导航”和“过滤”。
Zuul是什么? |
Zuul是API网关,存在于前端和后端之间,所有的前端请求访问都需要经过它来调度和过滤。它提供了路由、服务器负载均衡、安全等功能。
路由详解 |
路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。路由配置分为传统路由配置和服务路由配置。今天我们只说说服务路由配置。
路由配置方式
zuul.routes.user-service=/user-service/**
路径匹配
为路由规则定义匹配表达式使用的是Ant风格,示例如下。
//拼接一个任务字符的路径
/user-service/?
//拼接任意字符的路径
/user-service/*
//拼接多级的任意字符路径
/user-service/**
路由前缀
路由前缀就是全局地为路由规则增加前缀信息,可使用zuul.prefix参数来进行设置。
zuul.prefix=/api
本地跳转
我们可实现forward形式的服务端跳转配置,比如以下实现了将符合/api-b/**规则的请求转发到API网关中以/local为前缀的请求上,由API网关进行本地处理。
zuul.routes.api-b.path=/api-b/**
zuul.toutes.api-b.url=forward:/local
过滤器详解 |
过滤器功能负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。每一个进入Zuul的HTTP请求都会经过一系列的过滤器处理链得到请求响应,并返回给客户端。
请求生命周期
当一个HTTP请求到达API网关之后,如何在各种不同类型的过滤器之间流转呢?
(1)pre阶段
在这个阶段,请求会被pre类型的过滤器进行处理,做一些前置加工。这类过滤器包括请求的校验等。
(2)routing阶段
这是路由请求转发阶段,也就是将外部请求转发到具体服务实例上去的过程。当服务实例将请求结果都返回之后,此阶段完成。
(3)post阶段
在此阶段中,我们可以对处理结果进行一些加工或转换等
(4)error阶段
当前三个阶段发生异常时,才会触发这个error阶段。但是它最后也是流向post阶段,因为它需要通过post过滤器将最终结果返回给请求客户端。
禁用过滤器
比如我们想禁用AccessFilter过滤器,可在配置文件中添加如下配置:
zuul.AccessFilter.pre.disable=true
动态加载 |
动态加载就是在不重启服务的前提下,对其动态修改路由规则、添加或删除过滤器等。
动态路由
如果想实现动态刷新路由规则的功能,只需将API网关服务的配置文件通过Config连接的Git仓库存储和管理即可。
动态过滤器
如果想实现此功能,需要借助基于JVM实现的动态语言的帮助,比如Groovy。