曾梦想执剑走天涯,我是程序猿【AK】
目录
- 简述概要
- 知识图谱
- 什么是SpringCloudGateway
- 功能特征
- 应用场景
- 核心概念
- 配置文件
- 工作原理
- 路由谓词工厂(内置的)
- [After 路由谓词工厂](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-after-route-predicate-factory)
- Before 路由谓词工厂
- 路由之间谓词工厂
- Cookie 路由谓词工厂
- 标头路由谓词工厂
- 主机路由谓词工厂
- 方法路由谓词工厂
- 路径路由谓词工厂
- 查询路由谓词工厂
- RemoteAddr 路由谓词工厂
- 修改远程地址解析方式
- 权重路由谓词工厂
- XForwarded 远程地址路由谓词工厂
简述概要
了解SpringCloud Gateway微服务网关
知识图谱
什么是SpringCloudGateway
- Spring Cloud官方推出的第二代网关框架,定位于取代Netflix Zuul。相比Zuul来说,Spring Cloud Gate提供更优秀的性能,更强大的功能。(Zuul1.x是同步阻塞的设计,性能低,但2.x版本也基于Netty,zuul2.x版本与springcloudgateway性能差距其实不大)
- 由WebFlux+Netty+Reactor实现的响应式的API网关。它不能在传统的servlet容器中工作,也不能构建成war包。
- 目的为微服务架构提供一种简单且有效的API路由的管理方式,并给予Fliter的方式提供网关的基本功能,例如安全认证、监控、限流等。
功能特征
- 基于 Spring 框架和 Spring Boot 构建
- 能够匹配任何请求属性上的路由。
- 谓词(Predicate)和过滤器(Fliter)特定于路由。
- 断路器集成(Sentinel、Hystrix)
- Spring Cloud Discovery客户端集成(Nacos、Eruka)
- 易于编写谓词和过滤器
- 请求速率限制
- 路径重写
应用场景
全局性流控
日志统计
防止SQL注入
防止Web攻击
屏蔽工具扫描
黑白IP名单
证书加解密处理
服务级别流控
服务降级与熔断
路由与负载均衡、灰度策略
服务过滤、聚合与发现
权限验证与用户等级策略
业务规则与参数检验
多级缓存策略
核心概念
- 路由(route)
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成、如果断言为真则说明请求的URL和配置的路由匹配。
- 断言(predicates)
Java8中的断言函数,SpringCloudGateway中的断言函数类型是spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。
- 过滤器(Filter)
SpringCloudGateway中的filter分为Gateway Filter和Global Fliter、Filter可以对请求和响应进行处理。
配置文件
spring:cloud:# Spring Cloud Gateway 配置项,对应 GatewayProperties 类gateway:# 路由配置项,对应 RouteDefinition 数组routes:## 各个微服务- id: system-admin-api # 路由的服务唯一编号uri: grayLb://system-serverpredicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组- Path=/admin-api/system/**filters:- RewritePath=/admin-api/system/v3/api-docs, /v3/api-docs # 配置,保证转发到 /v3/api-docs- id: system-app-api # 路由的编号uri: grayLb://system-serverpredicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组- Path=/app-api/system/**filters:- RewritePath=/app-api/system/v3/api-docs, /v3/api-docs
工作原理
客户端向 Spring Cloud Gateway 发出请求。如果网关处理程序映射确定请求与路由匹配,则会将其发送到网关 Web 处理程序。该处理程序通过特定于请求的过滤器链运行请求。过滤器被虚线分开的原因是过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“预”过滤器逻辑。然后发出代理请求。发出代理请求后,将运行“post”过滤器逻辑。
路由谓词工厂(内置的)
Spring Cloud Gateway 将路由作为 Spring WebFluxHandlerMapping基础设施的一部分进行匹配。Spring Cloud Gateway 包含许多内置的路由谓词工厂。所有这些谓词都匹配 HTTP 请求的不同属性。您可以将多个路由谓词工厂与逻辑and语句组合起来。
After 路由谓词工厂
路由谓词工厂After采用一个参数 a datetime(它是一个 java ZonedDateTime)。此谓词匹配指定日期时间之后发生的请求。以下示例配置后路由谓词:
spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]
Before 路由谓词工厂
路由谓词工厂Before采用一个参数 a datetime(它是一个 java ZonedDateTime)。该谓词匹配在指定的 之前发生的请求datetime。以下示例配置 before 路由谓词:
spring:cloud:gateway:routes:- id: before_routeuri: https://example.orgpredicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
路由之间谓词工厂
路由谓词工厂Between有两个参数,datetime1它们datetime2 是javaZonedDateTime对象。datetime1该谓词匹配 之前和之后发生的请求datetime2。参数datetime2必须在 后面datetime1。以下示例配置了 Between 路由谓词:
spring:cloud:gateway:routes:- id: between_routeuri: https://example.orgpredicates:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
Cookie 路由谓词工厂
路由Cookie谓词工厂采用两个参数:cookiename和 a regexp(这是一个 Java 正则表达式)。此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。以下示例配置 cookie 路由谓词工厂:、
spring:cloud:gateway:routes:- id: cookie_routeuri: https://example.orgpredicates:- Cookie=chocolate, ch.p
标头路由谓词工厂
路由Header谓词工厂采用两个参数:theheader和 a regexp(这是一个 Java 正则表达式)。此谓词与具有给定名称且其值与正则表达式匹配的标头匹配。以下示例配置标头路由谓词:
spring:cloud:gateway:routes:- id: header_routeuri: https://example.orgpredicates:- Header=X-Request-Id, \d+
主机路由谓词工厂
路由谓词工厂Host采用一个参数:主机名列表patterns。该模式是 Ant 风格的模式,以.为分隔符。该谓词匹配Host与模式匹配的标头。以下示例配置主机路由谓词:
spring:cloud:gateway:routes:- id: host_routeuri: https://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org
方法路由谓词工厂
路由Method谓词工厂采用一个methods参数,该参数是一个或多个参数:要匹配的 HTTP 方法。以下示例配置方法路由谓词:
spring:cloud:gateway:routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET,POST
路径路由谓词工厂
路由Path谓词工厂采用两个参数:一个 Spring 列表PathMatcher patterns和一个名为 的可选标志matchTrailingSlash(默认为true)。以下示例配置路径路由谓词:
spring:cloud:gateway:routes:- id: path_routeuri: https://example.orgpredicates:- Path=/red/{segment},/blue/{segment}
如果请求路径是,则此路由匹配,例如:/red/1or /red/1/or /red/blueor /blue/green。
如果matchTrailingSlash设置为,则不会匹配false请求路径。/red/1/
该谓词提取 URI 模板变量(例如segment,在前面的示例中定义的)作为名称和值的映射,并将其放置在 中,ServerWebExchange.getAttributes()并使用 中定义的键ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE。这些值可供GatewayFilter工厂使用
可以使用实用程序方法(称为get)来更轻松地访问这些变量。以下示例展示了如何使用该get方法:
Map<String, String> uriVariables = ServerWebExchangeUtils.getUriTemplateVariables(exchange);String segment = uriVariables.get("segment");
查询路由谓词工厂
路由Query谓词工厂有两个参数:一个必需参数param和一个可选参数regexp(这是一个 Java 正则表达式)。以下示例配置查询路由谓词:
spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=green
如果请求包含green查询参数,则前面的路由匹配。
spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=red, gree.
RemoteAddr 路由谓词工厂
路由RemoteAddr谓词工厂采用 的列表(最小大小为 1)sources,它们是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址,16是子网掩码)。以下示例配置 RemoteAddr 路由谓词:
spring:cloud:gateway:routes:- id: remoteaddr_routeuri: https://example.orgpredicates:- RemoteAddr=192.168.1.1/24
修改远程地址解析方式
默认情况下,RemoteAddr 路由谓词工厂使用传入请求中的远程地址。如果 Spring Cloud Gateway 位于代理层后面,这可能与实际的客户端 IP 地址不匹配。
您可以通过设置自定义来自定义远程地址的解析方式RemoteAddressResolver。Spring Cloud Gateway 附带一个非默认远程地址解析器,该解析器基于X-Forwarded-For 标头, XForwardedRemoteAddressResolver。
XForwardedRemoteAddressResolver有两个静态构造函数方法,它们采用不同的安全方法:
- XForwardedRemoteAddressResolver::trustAll返回RemoteAddressResolver始终采用X-Forwarded-For标头中找到的第一个 IP 地址的 a。这种方法很容易受到欺骗,因为恶意客户端可以为 设定一个初始值X-Forwarded-For,该值将被解析器接受。
- XForwardedRemoteAddressResolver::maxTrustedIndex采用与 Spring Cloud Gateway 前面运行的可信基础设施数量相关的索引。例如,如果 Spring Cloud Gateway 只能通过 HAProxy 访问,则应使用值 1。如果在访问 Spring Cloud Gateway 之前需要可信基础设施的两跳,则应使用值 2。
考虑以下标头值:、
X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3
权重路由谓词工厂
路由谓词工厂Weight有两个参数:group和weight(一个 int)。权重按每组计算。以下示例配置权重路由谓词:
spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2
XForwarded 远程地址路由谓词工厂
路由XForwarded Remote Addr谓词工厂采用 的列表(最小大小为 1)sources,它们是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址,16是子网掩码)。
此路由谓词允许根据 HTTP 标头过滤请求X-Forwarded-For。
这可以与反向代理(例如负载均衡器或 Web 应用程序防火墙)一起使用,其中仅当请求来自这些反向代理所使用的可信 IP 地址列表时才应允许请求。
以下示例配置 XForwardedRemoteAddr 路由谓词:
spring:cloud:gateway:routes:- id: xforwarded_remoteaddr_routeuri: https://example.orgpredicates:- XForwardedRemoteAddr=192.168.1.1/24
持续更新......
---- 永不磨灭的番号:我是AK