证明熔断成功
master-service - 限流(重点,解决不生效问题) spring: #配置文件名称,用来标识不同环境的配置。由 spring.profiles.active 的值来决定使用哪组配置。 ##限流 profiles: route_requestRateLimiter redis: host: localhost port: 6379 database: 0 application: # 应用名称 name: gateway-master cloud: gateway: discovery: locator: # 是否和服务注册与发现组件结合,设置为 true 后可以直接使用应用名称调用服务 enabled: true # 路由(routes:路由,它由唯一标识(ID)、目标服务地址(uri)、一组断言(predicates)和一组过滤器组成(filters)。filters 不是必需参数。) routes: # 路由标识(id:标识,具有唯一性) 限流 - id: route_requestRateLimiter # 目标服务地址(uri:地址,请求转发后的地址) uri: lb://gateway-service # 路由条件(predicates:断言,匹配 HTTP 请求内容) predicates: ## 匹配 GET 请求 - Method=GET # 过滤器(filters:过滤器,过滤规则) filters: ## 添加指定参数 - AddRequestParameter=age, three ## 限流 - name: RequestRateLimiter args: ### 限流过滤器的 Bean 名称 key-resolver: '#{@uriKeyResolver}' ### 希望允许用户每秒处理多少个请求 redis-rate-limiter.replenishRate: 1 ### 用户允许在一秒钟内完成的最大请求数 redis-rate-limiter.burstCapacity: 3 eureka: instance: # 使用 ip 代替实例名 prefer-ip-address: true # 实例的主机名 hostname: ${spring.cloud.client.ip-address} # 实例的 ID 规则 instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} client: serviceUrl: # 注册中心地址 defaultZone: ${eureka.instance.hostname}:8761/eureka/ logging: level: # log 级别 org.springframework.cloud.gateway: debug
停止注册中心工程(registry-service),网关工程(master-service)和服务工程 A/B(a-service、b-service)
把 master-service - application.yml 配置文件中最上面的 spring.profiles.active 的值更改route_requestRateLimiter
上面配置文件内容意思是访问的路径 :8000/age (网关地址/age)会被转发到 (uri/age),并传入 'age=three' 参数(注意为 Get 请求)
注意此处还需要配置 redis 的连接信息
注意此处是结合 redis 实现的限流,所以 filter 过滤器的 name 必须为 RequestRateLimiter
并且通过实现 KeyResolver 类来自定义限流策略,如下
master-service - 限流 - 策略 package com.zwc.gateway.config.filters; import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; /** * @ClassName UriKeyResolver * @Desc TODO Spring Cloud Gateway 网关限流过滤器 * @Date 2019/6/23 17:59 * @Version 1.0 */ public class UriKeyResolver implements KeyResolver { /* * @ClassName UriKeyResolver * @Desc TODO 根据请求的 uri 限流 * @Date 2019/6/29 17:25 * @Version 1.0 */ @Override public Mono<String> resolve(ServerWebExchange exchange) { return Mono.just(exchange.getRequest().getURI().getPath()); } }
启动本地 redis(redis-server.exe) 服务
启动注册中心工程(registry-service),网关工程(master-service)和服务工程 A/B(a-service、b-service)
项目启动成功后访问::8000/age
此时限流却无论如何都不生效,原因有如下两点
① redis-server 版本过低!我 Windows 本地是 redis-2.4.2 版本的,要用 3 以上的版本!!!
② 数据在 redis 中存储的时间只有几秒,所以得使用 monitor 指令来动态的观察!!!
打开 redis-cli.exe,输入命令 monitor
快速刷新地址::8000/age
页面上会出现 429,redis-cli.exe 中会出现很多数据交互(request_rate_limiter.xxx 开头的 key)
证明限流成功
master-service - 综合 spring: #配置文件名称,用来标识不同环境的配置。由 spring.profiles.active 的值来决定使用哪组配置。 ##综合 profiles: route_all redis: host: localhost port: 6379 database: 0 application: # 应用名称 name: gateway-master cloud: gateway: discovery: locator: # 是否和服务注册与发现组件结合,设置为 true 后可以直接使用应用名称调用服务 enabled: true # 路由(routes:路由,它由唯一标识(ID)、目标服务地址(uri)、一组断言(predicates)和一组过滤器组成(filters)。filters 不是必需参数。) routes: # 路由标识(id:标识,具有唯一性) 综合 - id: route_all # 目标服务地址(uri:地址,请求转发后的地址) uri: lb://gateway-service # 路由条件(predicates:断言,匹配 HTTP 请求内容) predicates: ## 转发地址格式为 uri/routeAll,/all 部分会被下面的过滤器给截取掉 - Path=http://www.likecs.com/all/routeAll ## 匹配 GET 请求 - Method=GET # 过滤器(filters:过滤器,过滤规则) filters: ## 截取路径位数 - StripPrefix=1 ## 添加指定参数 - AddRequestParameter=pass, yes ## 熔断 - name: Hystrix args: name: fallbackcmd ### fallback 时调用的方法 :8000/fallback fallbackUri: forward:/fallback ## 限流 - name: RequestRateLimiter args: ### 限流过滤器的 Bean 名称 key-resolver: '#{@uriKeyResolver}' ### 希望允许用户每秒处理多少个请求 redis-rate-limiter.replenishRate: 1 ### 用户允许在一秒钟内完成的最大请求数 redis-rate-limiter.burstCapacity: 3 eureka: instance: # 使用 ip 代替实例名 prefer-ip-address: true # 实例的主机名 hostname: ${spring.cloud.client.ip-address} # 实例的 ID 规则 instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} client: serviceUrl: # 注册中心地址 defaultZone: ${eureka.instance.hostname}:8761/eureka/ logging: level: # log 级别 org.springframework.cloud.gateway: debug
停止注册中心工程(registry-service),网关工程(master-service)和服务工程 A/B(a-service、b-service)
把 master-service - application.yml 配置文件中最上面的 spring.profiles.active 的值更改为 route_all