一.Gateway是什么
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,
Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
二.Gateway能做什么
Spring Cloud Gateway 可以看做是一个 Zuul 1.x 的升级版和代替品,比 Zuul 2 更早的使用 Netty 实现异步 IO,从而实现了一个简单、比 Zuul 1.x 更高效的、与 Spring Cloud 紧密配合的 API 网关。
Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱即用功能,并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用。
比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、或者 Host、或者 Query 来做路由。
比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也都可以直接用。当然自定义 Filter 也非常方便。
特征
(1)基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
(2)动态路由;
(3)Predicates 和 Filters 作用于特定路由;
(4)集成 Hystrix 断路器;
(5)集成 Spring Cloud DiscoveryClient;
(6)易于编写的 Predicates 和 Filters;
(7)限流;
(8)路径重写;
三.Gateway原理
1、工作原理:
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。
Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
核心逻辑就是路由转发,执行过滤器链。
重要概念:
(1)路由(Route)。路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配
(2)断言(Predicate)。Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。
Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。
(3)过滤器(Filter)。一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。
过滤器Filter将会对请求和响应进行修改处理。
1、路由断言Factories
Spring Cloud Gateway将路由作为Spring WebFlux HandlerMapping
基础结构的一部分进行匹配。Spring Cloud Gateway包含许多内置的路由断言Factories。
这些断言都匹配HTTP请求的不同属性。多个路由断言Factories可以通过 and
组合使用。
2、Spring Cloud Netflix Zuul和Spring Cloud Gateway的区别
Zuul基于servlet 2.5(与3.x一起使用),使用API阻止,不支持长期连接,例如websockets。
另一方面,Spring Cloud Gateway基于Spring Framework 5,Project Reactor(允许与Spring WebFlux集成)和Spring Boot 2使用API而不会阻塞。
这使它与长期连接(Websockets) 兼容,并且与Spring有更好的集成。
此外,随着Spring Boot 2和Spring Cloud 2的发布,与Zuul相比,Spring Cloud Gateway具有卓越的性能。由于事件循环的Netty的喂养SC网关和Web服务器默认springboot2。
网上很多地方都说Zuul是阻塞的,Gateway是非阻塞的,这么说是不严谨的,准确的讲Zuul1.x是阻塞的,而在2.x的版本中,Zuul也是基于Netty,也是非阻塞的,如果一定要说性能,其实这个真没多大差距。