前言
Spring Cloud Gateway该项目提供了一个构建在 Spring 生态系统(包括
Spring 5
,
Spring Boot 2
,
Project Reactor
)之上的 API 网关,旨在提供一种简单而有效的方法来路由到 api,并为它们提供横切关注点,例如: 安全性、监视 / 度量和弹性扩容。
官方原文链接
1. 引入
要在项目中包含 Spring Cloud Gateway,请使用具有
org.springframework.cloud
组 ID 和
spring-cloud-starter-gateway
项目 ID 的 starter,如果包含了 starter,但不希望启用 gateway,请设置
spring.cloud.gateway.enabled=false
。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
注意:
1.Spring Cloud Gateway需要Spring Boot和Spring Webflux提供的Netty环境运行,所以不能在传统的servlet容器(tomcat,jboss)中或者war包的方式运行。
2. Spring Cloud Gateway是基于Spring Boot 2.x, Spring WebFlux, Project Reactor的响应式编程的,因此部分spring框架它上面可能不能工作(Spring Security ,spring data的mysql等传统数据库(Nosql可以使用))。如果不熟悉这些项目,建议首先阅读它们的文档,以便在使用 Spring Cloud Gateway 之前熟悉一些新概念。
2. 词汇
- Route:路由,网关的基本组件,它由一个 ID、一个目标 URI、一组Predicate和一组Filter组成。
-
Predicate:断言: 这是Java 8新特性。输入类型是
Spring Framework ServerWebExchange
,以匹配来自 HTTP 请求的任何内容,比如
header
或
parameter
。 -
Filter:过滤器。这些是
Spring Framework GatewayFilter
的实现,它们是用特定的工厂构建的。 这里,可以在发送下游请求之前或之后修改请求和响应。
3.工作流程
下面的图表概述了 Spring Cloud Gateway 的工作原理:
客户端向 Spring Cloud Gateway 网关发出请求。如果
Gateway Handler Mapping
确定请求与路由匹配,则将其发送到
Gateway Web Handler
。该
Handler
通过特定于请求的过滤器链来运行请求。用虚线划分过滤器的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。所有的前置过滤器执行完毕后,发出代理请求,最后执行后置过滤器。
注意:如果
route
的
url
没有声明端口号,则使用http或者https的默认端口号。
4.配置路由断言和过滤器
有两种配置断言和过滤器的方法: 简洁方式和完全扩展的参数。 下面的大多数例子都使用了简洁方式。
名称和参数名称将在每个部分的第一个或两个句子中作为代码列出。 参数通常按快捷配置所需的顺序列出。
4.1 简易配置
简易配置由固定的过滤器名称,后面跟着
=
和其他由
,
隔开的参数构成。
application.yml
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- Cookie=mycookie,mycookievalue
上面的示例使用两个参数定义了
Cookie
路由断言,这两个参数是 Cookie 名称(mycookie) 和与 mycookivalee 匹配的值。
4.2 完全展开的配置
完全展开的配置看起来更像带有
名称 / 值
对的标准 yaml 配置。 通常,会有一个 name 键和一个 args 键。 args 用于配置断言或过滤器的键值对。
application.yml
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- name: Cookie
args:
name: mycookie
regexp: mycookievalue
上面两个例子分别展示了断言的简易配置和完全展开的配置。