术语
Route:gateway的基本构建块。它由一个ID、一个目标URI、一组Predicate和一组Filter定义。如果聚合Predicate为真,则匹配路由。
Predicate:这是一个Java 8函数谓词。输入类型为Spring Framework ServerWebExchange。这使您可以匹配HTTP请求中的任何内容,例如标头或参数。
Filter:这些是使用特定工厂构造的GatewayFilter实例。使用这些可以在发送下游请求之前或之后修改请求和响应。
Predicate
Spring Cloud Gateway 匹配路由作为Spring WebFlux HandlerMapping基础架构的一部分。Spring Cloud Gateway包括许多内置的路由predicate工厂。这些predicate匹配HTTP请求的不同属性。可以将多个路由predicate工厂语句组合在一起。
The Path Route Predicate Factory
Path Route Predicate 工厂接受两个参数:Spring PathMatcher模式列表和一个名为matchTrailingSlash的可选标志(默认为true)。
Filter
Filter 允许以某种方式修改传入的HTTP请求或传出的HTTP响应。Filter]的作用域是特定的路由。Spring Cloud Gateway包括许多内置的GatewayFilter工厂
熔断
CircuitBreaker GatewayFilter Factory
使用Spring Cloud CircuitBreaker api将Gateway路由封装在一个断路器中。Spring Cloud CircuitBreaker支持多个可与Spring Cloud Gateway一起使用的库。Spring Cloud开箱即用地支持Resilience4J。
FallbackHeaders GatewayFilter Factory
FallbackHeaders工厂允许您在fallbackUri转发请求头中添加Spring Cloud CircuitBreaker执行异常细节
限流
RequestRateLimiter GatewayFilter Factory
使用RateLimiter实现来确定是否允许当前请求继续进行。如果不是,则返回HTTP 429 - Too Many Requests(默认)状态
这个过滤器接受一个可选的keyResolver参数和特定于速率限制器的参数,keyResolver是一个实现keyResolver接口的bean。用于产生限制请求的key。KeyResolver的默认实现是PrincipalNameKeyResolver,它从ServerWebExchange检索Principal并调用Principal. getname()。
Redis RateLimiter
限流的实现类,在最新gateway 4.1.5 版本中,唯一的实现类,使用令牌桶算法。需要引入spring-boot-starter-data-redis-reactive,使用的算法是令牌桶算法。
redis-rate-limiter:属性定义每秒允许多少请求(不丢弃任何请求)。这是令牌桶被填充的速率。
redis-rate-limiter.burstCapacity:属性是用户在一秒钟内允许的最大请求数(不丢弃任何请求)。这是令牌桶可以容纳的令牌数量。将此值设置为零将阻止所有请求。
redisrate -limiter.requestedTokens:属性表示一个请求需要多少令牌。这是为每个请求从桶中获取的令牌数量,默认为1。
spring:
application:
name: gateway
cloud:
gateway:
httpclient:
connect-timeout: 1000
response-timeout: 2s
routes:
- id: rate_limited_route
uri: http://localhost:8083
metadata:
response-timeout: 2000
connect-timeout: 1000
predicates:
- Path=/menu/**
filters:
- CircuitBreaker=myCircuitBreaker
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
redis-rate-limiter.requestedTokens: 1
- id: rate_circuit_breaker
uri: http://localhost:8083
metadata:
response-timeout: 2000
connect-timeout: 1000
predicates:
- Path=/domain/**
filters:
- CircuitBreaker=myCircuitBreaker
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
redis-rate-limiter.requestedTokens: 1
resilience4j:
circuitbreaker:
configs:
default:
slidingWindowType: TIME_BASED
slidingWindowSize: 10
FailureRateThreshold: 50
slowCallRateThreshold: 50
slowCallDurationThreshold: 600
minimumNumberOfCalls: 2
permittedNumberOfCallsInHalfOpenState: 3
waitDurationInOpenState: 50s
registerHealthIndicator: true
timelimiter:
configs:
default:
timeoutDuration: 10s
cancelRunningFuture: false
阿里sentinel
对网关流量控制,Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑。需要引入如下依赖:
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-sentinel'
implementation 'com.alibaba.cloud:spring-cloud-alibaba-sentinel-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
spring:
application:
name: gateway
cloud:
sentinel:
eager: true
transport:
port: 8719
dashboard: localhost:8080
scg:
fallback:
mode: response
content-type: 'application/json'
response-status: 429
response-body: '{"code":"429","msg":"Too Many Requests"}'
gateway:
httpclient:
connect-timeout: 1000
response-timeout: 2s
routes:
- id: rate_limited_route
uri: http://localhost:8083
metadata:
response-timeout: 2000
connect-timeout: 1000
predicates:
- Path=/menu/**
熔断和限流规则,需要在Sentinel 控制台中配置,不过默认在控制台中配置是存储在内存中,在gateway重启后丢失。生产环境中使用 Sentine推荐方式是使用push 模式的动态数据源,控制台将规则配置存储在支持Sentine push 模式的动态数据源中,Sentine 使用push 模式更新规则配置,Sentine 提供了对ZooKeeper, Apollo, Nacos 的的动态数据源实现。
Default Filters
要添加过滤器并将其应用于所有路由,可以使用spring.cloud.gateway.default-filters
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Red, Default-Blue
- PrefixPath=/httpbin
Global Filters
GlobalFilter接口是有条件地应用于所有路由的特殊过滤器.