1、什么是spring Cloud Gateway?
(1)Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filter链的方式提供了网关基本的功能。目前最新版Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是基于过滤器的,是阻塞IO,不支持长连接。
(2)Spring Cloud Gateway是基于Spring生态系统之上构建的API网关,包括:Spring5,Spring Boot2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为他们提供跨领域的关注点,例如:安全性,监视/指标,限流等。由于Spring5.0支持Netty,Http2,而Spring Boot支持Spring5.0,因此Spring Cloud Gateway支持Netty和Http2顺理成章。
2、什么是服务网关?
API Gateway(APIGW/API网关),是出现在系统边界上的一个面向API的、串行集中式的强管控服务,这里的边界是企业IT系统的边界,可以理解为企业应用防火墙,主要起到隔离外部访问与内部系统的作用。在微服务概念的流行之前,API网关就已经诞生了。
API网关的流行,源于近几年来移动应用与企业间互连需求的兴起。移动应用、企业互连,使得后台服务支持的对象,从以前单一的Web应用,扩展到多种使用场景,且每种使用场景对后台服务的需求都不尽相同。这不仅增加了后台服务的响应量,还增加了后台服务的复杂性。随着微服务架构概念的提出,API网关成为了微服务架构的一个标配组件。
API网关是一个服务器,是系统对外的唯一入口。API网关封装了系统内部架构,为每个客户端提供定制的API。所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有非业务功能。API网关并不是微服务场景中必须的组件,如下图,不管有没有API网关,后端微服务都可以通过API很好的支持客户端的访问。
但对于服务数量众多、复杂度比较高、规模比较大的业务来说,引入API网关也有一系列的好处:
- 聚合接口使得服务对调用者透明,客户端与后端的耦合度降低。
- 聚合后台服务,节省流量,提高性能,提升用户体验。
- 提供安全、流控、过滤、缓存、计费、监控等API管理功能。
3、为什么要使用网关?
- 单体应用:
浏览器发起请求到单体应用所在的机器,应用从数据库查询数据原路返回给浏览器,对于单体应用来说是不需要网关的。 - 微服务:
微服务的应用可能部署在不同的机房,不同地区,不同域名下。此时客户端(浏览器/手机/软件工具)想要请求对应的服务,都需要知道机器的具体IP或者域名URL,当微服务实例众多时,这是非常难以记忆的,对于客户端来说也太复杂难以维护。此时就有了网关,客户端相关的请求直接发送到网关,由网关根据请求标识解析判断出具体的微服务地址,再把请求转发到微服务实例。这其中的记忆 功能就全部交由网关来操作了。
总结:
如果让客户端直接与各个微服务交互:
- 客户端会多次请求不同的微服务,增加了客户端的复杂性
- 存在跨域请求,在一定场景下处理相对复杂
- 身份认证问题,每个微服务需要独立身份认证
- 难以重构,随着项目的迭代,可能需要重新划分微服务
- 某些微服务可能使用了防火墙/浏览器不友好协议,直接访问会有一定的困难
因此,我们需要网关介于客户端和服务器之间的中间层,所有外部请求率先经过微服务网关,客户端只需要与网关交互,只需要知道网关地址即可。这样便简化了开发且有以下优点: - 易于监控,可在微服务网关收集监控数据并将其推送到外部系统进行分析
- 易于认证,可在微服务网关上进行认证,然后再将请求转发到后端的微服务,从而无需在每个微服务中进行认证
- 减少了客户端与各个微服务之间的交互次数
4、网关解决了什么问题?
网关具有身份认证与安全、审查与监控、动态路由、负载均衡、缓存、请求分片与管理、静态响应处理等功能。当然最主要的职责还是“与外界联系”。
总结一下,网关应当具备一下功能:
- 性能:API高可用,负载均衡,容错机制。
- 安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的权限)。
- 日志:日志记录,一旦涉及分布式,全链路跟踪必不可少。
- 缓存:数据缓存
- 监控:记录请求响应数据,API耗时分析,性能监控。
- 限流:流量控制,错峰流控,可以定义多种限流规则。
- 灰度:线上灰度部署,可以减小风险。
- 路由:动态路由规则。
5、常用的网关解决方案:
Nginx+Lua、Kong、Traefik、Spring Cloud Netfix Zuul、Spring Cloud Gateway
6、环境准备
搭建SpringCloud集群项目
7、Nginx实现API网关:
配置反向代理即可
8、Gateway实现API网关:
8.1.核心概念
(1)路由(Route):路由是网关最基础的部分,路由信息由ID、目标URL、一组断言和一组过滤器组成。如果断言路由为真,则说明请求对的URL和配置匹配。
(2)断言(Predicate):java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于Http Request中的任何信息,比如请求头和参数等。
(3)过滤器(Filter):一个标准的Spring Web Filter。Spring Cloud Gateway中的Filter分为两种类型,分别是Gateway Filter和Global Filter。过滤器 将会对请求和响应进行处理。
8.2.工作原理:
如上图所示,客户端向Spring Cloud Gateway发出请求,再由网关处理程序Gateway Handler Mapping映射确定与请求相匹配的路由,将其发送到网关Gateway Web Handler。该处理程序通过指定的过滤器链将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器由虚线分隔的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。所有pre过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行post过滤器逻辑。
8.3.搭建网关服务
、、、、、、、、、
8.4.配置路由规则
9、路由规则:
- Spring Cloud Gateway创建Route对象时,使用RoutePredicateFactroy创建Predicate对象,Predicate对象可以赋值给Route。
- Spring Cloud Gateway包含许多内置的Route Predicate Factories。
- 所有这些断言都匹配HTTP请求的不同属性。
- 多个Route Predicate Factories可以通过逻辑与(and)结合起来一起使用。
- 路由断言工厂RoutePredicateFactory包含的主要实现类如图所示,包括Datetime、请求的远端地址、路由权重、请求头、Host地址、请求方法、请求路径和请求参数等类型的路由断言。
9.1.Path:
9.2.Query:
9.3.Method:
9.4.Datetime:
9.5.RemotrAddr:
10.6.Header:
10、动态路由(服务发现的路由规则):
动态路由其实就是面向服务的路由,Spring Cloud Gateway支持与Eureka整合开发,根据serviceld自动从注册中心获取服务地址并转发请求,这样的好处不仅可以通过的单个端点来访问应用的所有服务,而且在添加或移除服务实例时不用修改Gateway的路由配置。
- 10.1.添加依赖:
- 10.2.动态获取URL
(1)配置注册中心和动态路由规则:
10.3.服务名称转发:
11.过滤器:
标准过滤器类型:
11.1.网关过滤器GatewayFilter:
(1)Path路径过滤器:
Path路径过滤器可以实现URL重写,通过重写URL可以实现隐藏实际路径提高安全性,易于用户记忆和键入,易于被搜索引擎收录等优点,实现方式如下:
- RewritePathGatewayFilterFactory
- PrefixPathGatewayFilterFactory:
PrefixPath网关过滤器工厂为匹配的URL添加指定前缀。
- StripPrefixGatewayFilterFactory;
StripPrefix网关过滤器工厂采用一个参数StripPrefix,该参数表示在将请求发送到下游之前从请求中剥离的路径个数。
- SetPathGatewayFilterFactory:
SetPath网关过滤器工厂采用路径模板参数。它提供了一种通过允许模板化路径段来操作请求路径的简单方法,使用了SpringFramework中url模板,允许多个匹配段。
(2)Parameter参数过滤器:
AddRequestParameter网关过滤器工厂会将指定参数添加至匹配到的下游请求中。
(3)Status状态过滤器:
SetStatus网关过滤器工厂采用单个状态参数,它必须是有效的Spring HttpStatus。它可以是整数404或枚举NOT_FOUND的字符串表示。
11.2全局过滤器GlobalFilter
全局过滤器不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它是请求业务以及路由的URL转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。
11.3.自定义网关过滤器:
自定以网关过滤器需要实现已下两个接口:GatewayFilter,Ordered。
11.4.自定以全局过滤器:
自定以全局过滤器需要实现已下两个接口:GlobalFilter,Ordered。通过全局过滤器可以实现权限校验,安全性验证等功能。
11.5通过全局过滤器实现统一鉴权:
12.网关限流:
通过限流,我们可以很好地控制系统的QPS,从而达到保护系统的目的。
12.1.为什么需要限流:
比如Web服务,对外API,这种类型的服务有以下几种可能导致机器被拖垮:
- 用户增长过快(好事)
- 因为某个热点事件(微博热搜)
- 竞争对象爬虫
- 恶意的请求
这些情况都是无法预知的,不知道什么时候会有10倍甚至20倍的流量打进来,如果真碰上这种情况,扩容是根本来不及的。
12.2.限流算法:
常见的限流算法有:
- 计数器算法
- 漏桶(Leaky Bucket)算法
- 令牌桶(Token Bucket)算法
13.高可用网关:
业内通常用多少来衡量网站的可用性,例如QQ的可用性是4个9,就是说QQ能保证一年里,服务在99.99%的时间里是可用的,只有0.01的时间不可用,大约最多53分钟。
对于大多数网站,2个9是基本可用;3个9是叫高可用;4个9是拥有自动恢复能力的高可用。
实现高可用的主要手段是数据的冗余备份和服务的失效性转移,这两种手段具体可以怎么做呢?在网关里如何体现?主要有以下几个方向:
- 集群部署
- 负载均衡
- 健康检查
- 节点自动重启
- 熔断
- 服务降级
- 接口重试
13.1.Nginx+网关集群实现高可用网关