Spring Cloud Gateway

术语

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接口是有条件地应用于所有路由的特殊过滤器.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值