1、重试

spring:cloud:gateway:discovery:locator:enabled: truelowerCaseServiceId: trueroutes:- id: gate_hiuri: lb://gateway-hipredicates:- Path=/retry/*filters:- StripPrefix=1- name: Retryargs:retries: 3series: SERVER_ERRORmethods: GET,POST

retries:重试次数
series: SERVER_ERROR,下游服务报5XX系列的错误触发重试机制
methods:重试的HTTP方法

hi服务hello接口

    @GetMapping("hello")public String hello(@RequestParam String name) {int i = 1 / 0;return "hi," + name + " ! " + "访问端口号:" + port;}

启动eureka、hi、limit服务

2、熔断Hystrix

添加 hystrix 依赖

        <!-- hystrix --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>

熔断配置

server:port: 8026eureka:client:serviceUrl:defaultZone: http://localhost:8088/eureka/spring:application:name: gateway-limitcloud:gateway:discovery:locator:enabled: truelowerCaseServiceId: trueroutes:- id: gateway_hiuri: lb://gateway-hipredicates:- Path=/hi/*filters:- StripPrefix=1#熔断- name: Hystrixargs:name: localfallbackfallbackUri: forward:/fallback

回调方法在网关服务

@RestController
public class IndexController {@RequestMapping("/fallback")public String fallback() {System.out.println("fallback");return "local fallback";}
}

启动服务 eureka、hi、gateway-limit
正常访问:
http://localhost:8026/hi/hello?name=yzm

关闭hi服务,再次访问

服务hi不可达,网关回调fallback()方法

修改:
将回调方法部署到ha服务上

    @RequestMapping("/fallback")public String fallback() {System.out.println("fallback");return "ha fallback";}

注释gateway服务上的fallback()方法

@RestController
public class IndexController {//    @RequestMapping("/fallback")public String fallback() {System.out.println("fallback");return "local fallback";}}
spring:application:name: gateway-limitcloud:gateway:discovery:locator:enabled: truelowerCaseServiceId: trueroutes:- id: gateway_hiuri: lb://gateway-hipredicates:- Path=/hi/*filters:- StripPrefix=1#熔断- name: Hystrixargs:name: remotefallbackfallbackUri: forward:/fallback- id: gateway_hauri: lb://gateway-hapredicates:- Path=/fallback

启动服务 eureka、ha、gateway-limit,不用启动hi
访问 http://localhost:8026/hi/hello?name=yzm

3、Redis实现限流

添加依赖 redis-reactive

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency>

限流配置

spring:application:name: gateway-limitcloud:gateway:discovery:locator:enabled: truelowerCaseServiceId: trueroutes:- id: gateway_hiuri: lb://gateway-hipredicates:- Path=/hi/limit/*filters:- StripPrefix=2#限流- name: RequestRateLimiterargs:key-resolver: '#{@remoteAddrKeyResolver}'redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率redis-rate-limiter.burstCapacity: 3 #令牌桶容量# redis连接配置redis:host: 192.168.8.128port: 6379password: 1234database: 0

key-resolver:用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象。

键解析器

/*** 用于限流的键的解析器的 Bean 对象名字。* 它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象。* 默认情况下,使用PrincipalNameKeyResolver,以请求认证的java.security.Principal作为限流键。*/
@Component
public class RemoteAddrKeyResolver implements KeyResolver {@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {// 根据IP地址限流String hostAddress = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();System.out.println("hostAddress = " + hostAddress);// 根据请求地址限流String uriPath = exchange.getRequest().getURI().getPath();System.out.println("uriPath = " + uriPath);// 根据用户ID//String userId = exchange.getRequest().getQueryParams().getFirst("userId");return Mono.just(hostAddress);}
}

正常访问

快速刷新

4、使用过滤器实现令牌桶限流

引入依赖

        <!-- 令牌桶 --><dependency><groupId>com.github.vladimir-bukhtoyarov</groupId><artifactId>bucket4j-core</artifactId><version>4.0.0</version></dependency>

定义过滤器

/*** 根据IP Address限流*/
@Data
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
public class RateLimitByIpGatewayFilter implements GatewayFilter, Ordered {//桶的最大容量,即能装载 Token 的最大数量int capacity;//每次 Token 补充量int refillTokens;//补充 Token 的时间间隔Duration refillDuration;private static final Map<String, Bucket> CACHE = new ConcurrentHashMap<>();private Bucket createNewBucket() {Refill refill = Refill.of(refillTokens, refillDuration);Bandwidth limit = Bandwidth.classic(capacity, refill);return Bucket4j.builder().addLimit(limit).build();}@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();Bucket bucket = CACHE.computeIfAbsent(ip, b -> createNewBucket());log.info("IP: " + ip + ",TokenBucket Available Tokens: " + bucket.getAvailableTokens());if (bucket.tryConsume(1)) {return chain.filter(exchange);} else {exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);return exchange.getResponse().setComplete();}}@Overridepublic int getOrder() {return -1000;}
}

配置路由

package com.yzm.gatewaylimit.config;import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.time.Duration;@Configuration
public class RouteConfig {@Beanpublic RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {return builder.routes()// 根据令牌限流.route(p -> p.path("/ip/**").filters(f -> f.stripPrefix(1).filter(new RateLimitByIpGatewayFilter(3,1, Duration.ofSeconds(1)))).uri("http://httpbin.org:80")).build();}
}

桶最大容量3个,每秒产出1个token

快速刷新

相关链接

首页
上一篇:Gateway过滤器

SpringCloud之Gateway网关熔断、限流相关推荐

  1. 基于gateway网关实现限流

    前言 在前面的限流方案介绍中,我们谈到了网关在微服务体系架构中的重要作用,网关不经具备大家熟知的动态路由,请求拦截等功能外,还可以基于网关实现分布式环境下的限流,下面我们以gatway为例,用代码进行 ...

  2. 秒杀项目之网关服务限流熔断降级分布式事务

    目录 一.网关服务限流熔断降级 二.Seata--分布式事务 2.1 分布式事务基础 2.1.1 事务 2.1.2 本地事务 2.1.3 分布式事务 2.1.4 分布式事务场景 2.2 分布式事务解决 ...

  3. Spring Cloud Alibaba配置实例nacos+sentinel+dubbo实行服务注册、配置中心、熔断限流

    通过Spring Cloud Alibaba相关组件nacos+sentinel+dubbo实行服务注册.配置中心.熔断限流等功能 1.本机安装nacos和sentinel-dashboard服务端 ...

  4. 「微服务系列 13」熔断限流隔离降级

    我们知道微服务分布式依赖关系错综复杂,比方说前端的请求转化为后端调用的服务请求,一个前端请求会转为成很多个后端调用的服务请求,那么这个时候后台的服务出现不稳定或者延迟,如果没有好的限流熔断措施,可能会 ...

  5. Redis 集群分布式锁与 API 网关分布式限流

    https://www.infoq.cn/article/FoQGIk*BzdQWJJ0tKqrJ Redis 集群的历史 Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twempr ...

  6. 解决SpringCloud的Gateway网关无法访问服务的静态资源

    解决SpringCloud的Gateway网关无法访问服务的静态资源 在重构项目的时候,配置gateway网关后,利用网关地址访问服务,发现服务的静态资源报了404 报错如下: gateway网关配置 ...

  7. 36、熔断-限流-降级

    目录 一.服务雪崩 二.熔断-限流-降级概述 三.熔断限流技术选型 四.sentinel限流 1 - 基于QPS限流 2 - Throttling策略 3 - sentinel预热/冷启动 五.sen ...

  8. SpringCloud Gateway 服务网关,限流

    SpringCloud Gateway 提供了基于Redis 和lua脚本实现的令牌桶算法进行限流,即 RequestRateLimiterGatewayFilterFactory类,通过设置过滤器实 ...

  9. 微服务网关GateWay 过滤+路由+限流

    文章目录 1 微服务网关概述 2 微服务网关微服务搭建 3 微服务网关跨域 4 微服务网关过滤器 5 微服务网关限流 5.1 思路分析 5.2 令牌桶算法 5.3 网关限流代码实现 1 微服务网关概述 ...

  10. SpringCloud Alibaba 实战之《限流与熔断:Sentinel 在项目中的最佳实践》

    上一讲我们讲解了微服务的雪崩效应与如何基于 Sentinel 实现初步微服务限流,掌握了部署 Sentinel Dashboard与配置 Sentinel Core 客户端的技巧.本讲咱们继续 Sen ...

最新文章

  1. 吴恩达新课发布1天,引3万人观看 | 完整PPT
  2. 福布斯2021年十大最佳人工智能硕士课程,清华、港大入选
  3. 请用理智的头脑和正确的途径关爱帮助灾区
  4. 平民软件OneProxy的强大
  5. git remote扩展
  6. PAT甲级1045 Favorite Color Stripe (30 分):[C++题解]最佳彩色带、DP、公共子序列变形
  7. linux怎么复制手册,程序员的Linux上手手册(2) - 基础文件操作命令
  8. VMware ubuntu 虚拟机只剩下lo回环网卡,上不了网(无法上网、无法连接网络)(环回)
  9. 从内存中加载并启动一个exe
  10. colab加载google drive并且调试时跳过不运行
  11. 关于Python的应用发布技术
  12. ubuntu tomcat安装环境变量配置
  13. 快速开发框架工作笔记001---项目开发中整理_整合好的_springcloud快速开发框架_springcloud框架_springcloud架构
  14. python sorted函数
  15. Zemax操作23--衍射光栅仿真(上)
  16. 云计算零基础(八) 破解密码
  17. 电子皮肤综述阅读-鲍哲南-2019
  18. Koa2实现电影微信公众号前后端开发学习视频
  19. 计算机采用什么交换技术,计算机 交换技术是什么?
  20. layui tab用法大全,一键复制粘贴即可使用

热门文章

  1. 【YoloV5】学习笔记 P1——CUDA安装
  2. Pushing the boundaries of molecular representation for drug discovery with graph attention mechanism
  3. 使用R语言自定义设置lty参数以指定ROC曲线线条类型
  4. 生态道路探索:技术管理者私享会,圆满举行!
  5. 机器学习 —— 聚类算法--商业选址案例
  6. 【文献阅读】播存网络体系结构普适模型及实现模式
  7. 计算机考研推荐学校211张雪峰,为何考研多是普本,很少有985和211的学生?张雪峰说出实情...
  8. 数控车循环指令应用与技巧!
  9. python练习10——基础训练(猴子摘桃)
  10. 圣诞节礼物之——圣诞节主题的免费屏幕保护程序