SpringCloud之Gateway网关熔断、限流
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网关熔断、限流相关推荐
- 基于gateway网关实现限流
前言 在前面的限流方案介绍中,我们谈到了网关在微服务体系架构中的重要作用,网关不经具备大家熟知的动态路由,请求拦截等功能外,还可以基于网关实现分布式环境下的限流,下面我们以gatway为例,用代码进行 ...
- 秒杀项目之网关服务限流熔断降级分布式事务
目录 一.网关服务限流熔断降级 二.Seata--分布式事务 2.1 分布式事务基础 2.1.1 事务 2.1.2 本地事务 2.1.3 分布式事务 2.1.4 分布式事务场景 2.2 分布式事务解决 ...
- Spring Cloud Alibaba配置实例nacos+sentinel+dubbo实行服务注册、配置中心、熔断限流
通过Spring Cloud Alibaba相关组件nacos+sentinel+dubbo实行服务注册.配置中心.熔断限流等功能 1.本机安装nacos和sentinel-dashboard服务端 ...
- 「微服务系列 13」熔断限流隔离降级
我们知道微服务分布式依赖关系错综复杂,比方说前端的请求转化为后端调用的服务请求,一个前端请求会转为成很多个后端调用的服务请求,那么这个时候后台的服务出现不稳定或者延迟,如果没有好的限流熔断措施,可能会 ...
- Redis 集群分布式锁与 API 网关分布式限流
https://www.infoq.cn/article/FoQGIk*BzdQWJJ0tKqrJ Redis 集群的历史 Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twempr ...
- 解决SpringCloud的Gateway网关无法访问服务的静态资源
解决SpringCloud的Gateway网关无法访问服务的静态资源 在重构项目的时候,配置gateway网关后,利用网关地址访问服务,发现服务的静态资源报了404 报错如下: gateway网关配置 ...
- 36、熔断-限流-降级
目录 一.服务雪崩 二.熔断-限流-降级概述 三.熔断限流技术选型 四.sentinel限流 1 - 基于QPS限流 2 - Throttling策略 3 - sentinel预热/冷启动 五.sen ...
- SpringCloud Gateway 服务网关,限流
SpringCloud Gateway 提供了基于Redis 和lua脚本实现的令牌桶算法进行限流,即 RequestRateLimiterGatewayFilterFactory类,通过设置过滤器实 ...
- 微服务网关GateWay 过滤+路由+限流
文章目录 1 微服务网关概述 2 微服务网关微服务搭建 3 微服务网关跨域 4 微服务网关过滤器 5 微服务网关限流 5.1 思路分析 5.2 令牌桶算法 5.3 网关限流代码实现 1 微服务网关概述 ...
- SpringCloud Alibaba 实战之《限流与熔断:Sentinel 在项目中的最佳实践》
上一讲我们讲解了微服务的雪崩效应与如何基于 Sentinel 实现初步微服务限流,掌握了部署 Sentinel Dashboard与配置 Sentinel Core 客户端的技巧.本讲咱们继续 Sen ...
最新文章
- 吴恩达新课发布1天,引3万人观看 | 完整PPT
- 福布斯2021年十大最佳人工智能硕士课程,清华、港大入选
- 请用理智的头脑和正确的途径关爱帮助灾区
- 平民软件OneProxy的强大
- git remote扩展
- PAT甲级1045 Favorite Color Stripe (30 分):[C++题解]最佳彩色带、DP、公共子序列变形
- linux怎么复制手册,程序员的Linux上手手册(2) - 基础文件操作命令
- VMware ubuntu 虚拟机只剩下lo回环网卡,上不了网(无法上网、无法连接网络)(环回)
- 从内存中加载并启动一个exe
- colab加载google drive并且调试时跳过不运行
- 关于Python的应用发布技术
- ubuntu tomcat安装环境变量配置
- 快速开发框架工作笔记001---项目开发中整理_整合好的_springcloud快速开发框架_springcloud框架_springcloud架构
- python sorted函数
- Zemax操作23--衍射光栅仿真(上)
- 云计算零基础(八) 破解密码
- 电子皮肤综述阅读-鲍哲南-2019
- Koa2实现电影微信公众号前后端开发学习视频
- 计算机采用什么交换技术,计算机 交换技术是什么?
- layui tab用法大全,一键复制粘贴即可使用
热门文章
- 【YoloV5】学习笔记 P1——CUDA安装
- Pushing the boundaries of molecular representation for drug discovery with graph attention mechanism
- 使用R语言自定义设置lty参数以指定ROC曲线线条类型
- 生态道路探索:技术管理者私享会,圆满举行!
- 机器学习 —— 聚类算法--商业选址案例
- 【文献阅读】播存网络体系结构普适模型及实现模式
- 计算机考研推荐学校211张雪峰,为何考研多是普本,很少有985和211的学生?张雪峰说出实情...
- 数控车循环指令应用与技巧!
- python练习10——基础训练(猴子摘桃)
- 圣诞节礼物之——圣诞节主题的免费屏幕保护程序