本文为《深入理解Spring Cloud与微服务构建》第二版的读书笔记,有兴趣可以买来看看,各种配置介绍很详细,还有核心源码的讲解。
一、什么是Gateway?
Spring Cloud Gateway是Spring Cloud 官方推出的第二代网关框架,用于代替Netflix Zuul。
Gateway不仅提供了统一的路由方式,并且基于Filter链的方式提供了网关的基本功能,同时建立在Spring Framework 5之上,使用了非阻塞模式,并支持长连接Websocket。
Gateway在性能上优于Netflix Zuul,并且实现了Zuul的几乎所有功能。在使用和功能上,用Gateway替换掉Zuul的成本非常低,几乎可以实现无缝切换。
Gateway作为整个分布式系统的流量入口,有这举足轻重的作用:
- 协议转换,路由转发;
- 流量聚合,对流量进行监控,日志输出;
- 作为整个系统的前端工程,对流量进行控制,有限流的作用;
- 作为系统的前端边界,外部流量只能通过网关才能访问系统;
- 可以在网关层做权限判断,请求过滤;
- 可以在网关层做缓存;
二、Gateway功能实现
Gateway主要有三个核心组件:
断言(Predicate):请求先到Gateway Handle Mapping,通过断言判断交给哪个Gateway Web Handler处理,如果没有成功匹配,则直接返回错误信息;
过滤器(Filter):夹在断言和路由中间,以过滤器链的方式,分为请求前PRE过滤器,和请求后的POST过滤器
路由(Route):通过断言选择对应的路由(中间会经过过滤器处理),确定实际请求的服务实例
1. 断言(Predicate)
断言来自Java8的接口,该接口接收一个输入参数,返回一个布尔值,包含多种默认方法将断言组合成其他复杂的逻辑。断言决定了请求由哪一个路由处理。
服务网关内置了8类断言工厂,由下图所示:
2. 过滤器(Filter)
在断言之后,路由处理之前,会经过PRE类型的过滤器链处理,路由处理返回响应结果后,会经过POST过滤器处理再返回给前端。
PRE过滤器一般可以实现参数的校验,权限校验,流量监控,日志输出,协议转化等功能,必要时候还可以进行请求头的修改,请求的重定向的功能。
POST过滤器可以实现响应内容和响应头的修改,也可以做流量监控,日志输出。
过滤器根据范围可以分为针对单个路由的网关过滤器(Gateway Filter)和针对所有路由的全局网关过滤器(Global Gateway Filter)
三、限流
高并发系统往往需要做限流,一方面是为了防止流量突发使服务器过载,另一方面是为了防止流量攻击。
一般限流都发生在网关层,Spring Cloud一般是在Gateway,Hystrix使用线程池隔离,当超过线程池的负载时,熔断线路,走Fallback的逻辑。
常见的限流维度:
- 通过IP限流
- 通过请求URL限流
- 通过用户访问频次限流
Gateway提供了一个限流功能的PRE过滤器 RequestRateLimiterGatewayFilterFactory,使用了Redis和lua脚本实现了令牌桶算法算法。