Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
Spring Cloud Gateway的特征- Java 8
- Spring Framework 5
- Spring Boot 2
- 动态路由
- 内置到Spring Handler映射中的路由匹配
- 基于HTTP请求的路由匹配 (Path, Method, Header, Host, etc…)
- 过滤器作用于匹配的路由
- 过滤器可以修改下游HTTP请求和HTTP响应 (Add/Remove Headers, Add/Remove Parameters, Rewrite Path, Set Path, Hystrix, etc…)
- 通过API或配置驱动
- 支持Spring Cloud DiscoveryClient配置路由,与服务发现与注册配合使用
使用过Zuul的人,都知道网关的核心肯定是Filter以及Filter Chain(Filter 责任链)。Spring Cloud Gateway也具有路由和Filter的概念。下面介绍一下Spring Cloud Gateway中的几个重要概念。
- Route(路由): 路由是网关的基本组件。它的定义是一个ID,一个目标URI,一组谓词和一组过滤器。如果聚合谓词为真,则匹配路由。
- Predicate(谓词): 这是一个 Java 8 Function Predicate。输入类型是一个 Spring Framework ServerWebExchange。这允许开发人员对HTTP请求中的任何内容进行匹配,例如头和参数。
- Filter(过滤器): 一个标准的Spring webFilter。Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。在这里,可以在发送下游请求之前或之后修改请求和响应。
Spring Cloud Gateway 核心处理流程如下所示。
Gateway的客户端向Spring Cloud Gateway发起请求,请求首先会被 Gateway Handler Mapping 接收,决定请求匹配的路由,然后发送给Gateway Web Handler。Handler 通过特定的请求filter链发送请求。
过滤链通过虚线分隔的原因是过滤器filter可以在代理请求发送之前或者之后执行逻辑。执行所有 pre 过滤逻辑,然后发出请求给代理服务(proxied service),之后将执行 post 过滤器逻辑。
Spring Cloud Gateway相关依赖项
将如下依赖项添加到Spring Cloud项目的pom.xml文件中。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Spring Cloud Gateway的Starter-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
Spring Cloud Gateway提供了一个gateway actuator,该EndPoint 提供了关于Filter和Routes的信息查询。可以在application.yml 中配置开启。
访问gateway 端点:
http://localhost:8080/actuator/gateway/routes
可以看到返回的路由信息:
Spring Cloud Gateway网关路由方式
新的gateway网关路由配置有两种方式:
1.通过@Bean自定义RouteLocator,在启动主类Application中配置。
2.在配置文件yml中配置。
这两种方式都可以实现网关路由是等价的,但是通常项目开发中会使用配置文件yml方式。
相关链接:
https://cloud.spring.io/spring-cloud-gateway/spring-cloud-gateway.html
,