1.Zuul介绍
Zuul 是 Netflix 公司开源的一个 API 网关组件 ,Zuul是从设备和网站到应用程序后端的所有请求的前门,作为边缘服务应用程序,Zuul 旨在实现动态路由,监视,弹性和安全性。Zuul 包含了对请求的路由和过滤两个最主要的功能。
Zuul是Netflix开源的微服务网关,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。Zuul 的核心是一系列的过滤器,这些过滤器可以完成以下功能:
-
身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求
-
审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产试图
-
动态路由:动态地将请求路由到不同的后端集群
-
压力测试:逐渐增加只想集群的流量,以了解性能
-
负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
-
静态响应处理:在边缘位置直接建立部份响应,从而避免其转发到内部集群\
-
多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)使用的多样化,以及让系统的边缘更贴近系统的使用
2.什么是服务网关
API Gateway(APIGW / API 网关),顾名思义,是出现在系统边界上的一个面向 API 的、串行集中式的强管控服务,这里的边界是企业 IT 系统的边界,可以理解为企业级应用防火墙
,主要起到隔离外部访问与内部系统的作用
。在微服务概念的流行之前,API 网关就已经诞生了,例如银行、证券等领域常见的前置机系统,它也是解决访问认证、报文转换、访问统计等问题的。
API 网关是一个服务器,是系统对外的唯一入口。API 网关封装了系统内部架构,为每个客户端提供定制的 API。所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有非业务功能。API 网关并不是微服务场景中必须的组件,如下图,不管有没有 API 网关,后端微服务都可以通过 API 很好地支持客户端的访问。
但对于服务数量众多、复杂度比较高、规模比较大的业务来说,引入 API 网关也有一系列的好处:
-
聚合接口使得服务对调用者透明,客户端与后端的耦合度降低
-
聚合后台服务,节省流量,提高性能,提升用户体验
-
提供安全、流控、过滤、缓存、计算、监控等 API 管理功能
3.为什么要使用网关?
-
单体应用:浏览器发起请求到单体应用所在的机器,应用从数据库查询数据原路返回给浏览器,对于单体应用来说是不需要网关的。
-
微服务:微服务的应用可能部署在不同机房,不同地区,不同域名下。此时客户端(浏览器/手机/软件工具)想要请求对应的服务,都需要知道机器的具体 IP 或者域名 URL,当微服务实例众多时,这是非常难以记忆的,对于客户端来说也太复杂难以维护。此时就有了网关,客户端相关的请求直接发送到网关,由网关根据请求标识解析判断出具体的微服务地址,再把请求转发到微服务实例。这其中的记忆功能就全部交由网关来操作了。
总结:
如果让客户端直接与各个微服务交互:
-
客户端会多次请求不同的微服务,增加了客户端的复杂性
-
存在跨域请求,在一定场景下处理相对复杂
-
身份认证问题,每个微服务需要独立身份认证
-
难以重构,随着项目的迭代,可能需要重新划分微服务
-
某些微服务可能使用了防火墙/浏览器不友好的协议,直接访问会有一定的困难
4.网关解决了什么问题
网关应当具备以下功能:
-
性能:API 高可用,负载均衡,容错机制。
-
安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
-
日志:日志记录,一旦涉及分布式,全链路跟踪必不可少。
-
缓存:数据缓存。
-
监控:记录请求响应数据,API 耗时分析,性能监控。
-
限流:流量控制,错峰流控,可以定义多种限流规则。
-
路由:动态路由规则。
5.Zuul的核心
Zuul 包含了对请求的路由和过滤两个核心功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础;而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。
(1) 网关过滤器
Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。
(1) PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
(2) ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
(3) POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
(4) ERROR:在其他阶段发生错误时执行该过滤器。
路由映射主要通过 pre
类型的过滤器完成,它将请求路径与配置的路由规则进行匹配,以找到需要转发的目标地址;而请求转发的部分则是由 routing
类型的过滤器来完成,对 pre
类型过滤器获得的路由地址进行转发。所以说,过滤器可以说是 Zuul 实现 API 网关功能最核心的部件,每一个进入 Zuul 的 http 请求都会经过一系列的过滤器处理链得到请求响应并返回给客户端。