limiter

基于Guava RateLimiter实现限流

自闭症网瘾萝莉.ら 提交于 2020-05-08 12:24:27
Guava RateLimiter 客户端限流 (单机版本) <dependency> <groupId> com.google.guava </groupId> <artifactId> guava </artifactId> <version> 18.0 </version> </dependency> import com.google.common.util.concurrent.RateLimiter ; import lombok.extern.slf4j. Slf4j ; import org.springframework.web.bind.annotation. GetMapping ; import org.springframework.web.bind.annotation. RestController ; import java.util.concurrent.TimeUnit ; /** * RateLimiter 只能存在单机项目 */ @RestController @Slf4j public class RateLimiterController { //每一秒2个令牌限流 RateLimiter limiter = RateLimiter. create ( 2.0 ) ; /** * 非阻塞限流 * * @param count 每秒消耗令牌

spring cloud gateWay 404

こ雲淡風輕ζ 提交于 2020-05-04 17:33:51
gateWay网关负载均衡报404错误,我的yml文件配置 spring: cloud: gateway: locator: enabled: true loadbalancer: # 服务找不到404 use404: true routes: # 认证中心 - id: lxyyf-auth uri: lb://lxyyf-auth predicates: - Path=/auth/** filters: # 验证码处理 - ValidateCodeGatewayFilter # 前端密码解密 - PasswordDecoderFilter #UPMS 模块 - id: lxyyf-upms-biz uri: lb://lxyyf-upms-biz predicates: - Path=/admin/** filters: # 限流配置 - name: RequestRateLimiter args: key-resolver: '#{@remoteAddrKeyResolver}' redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20 # 降级配置 - name: Hystrix args: name: default fallbackUri: 'forward:/fallback' #

跟我学SpringCloud | 第十四篇:Spring Cloud Gateway高级应用

时光毁灭记忆、已成空白 提交于 2020-04-21 07:00:24
SpringCloud系列教程 | 第十四篇:Spring Cloud Gateway高级应用 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明,本系列教程全采用以上版本 上一篇我们聊了Gateway和注册中心的使用,以及 Gataway 中 Filter 的基本使用,这篇文章我们将继续介绍 Filter 的一些高级功能。 熔断 限流 重试 1. 限速路由器 限速在高并发场景中比较常用的手段之一,可以有效的保障服务的整体稳定性,Spring Cloud Gateway 提供了基于 Redis 的限流方案。所以我们首先需要添加对应的依赖包spring-boot-starter-data-redis-reactive <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency> 配置文件中需要添加 Redis 地址和限流的相关配置 server: port: 8080 spring: application: name: spring-cloud-gateway redis: host: localhost

go-kit 微服务 服务熔断(hystrix-go 实现)

烈酒焚心 提交于 2020-04-09 01:04:40
go-kit 微服务 服务熔断(hystrix-go 实现) 对客户端请求login方法添加熔断 Hystrix 在微服务架构中,每个服务都是相互关联的,比如我们下单服务和扣钱服务是分开的,现在扣钱服务出现的bug不能正常服务 Hystrix可以让我们在在微服务架构中对服务间的调用进行控制,加入一些调用延迟或者服务降级的容错机制。 Hystrix的设计原则 对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护 在复杂的分布式系统中,阻止某一个依赖服务的故障在整个系统中蔓延 提供fail-fast(快速失败)和快速恢复的支持 提供fallback优雅降级的支持 支持近实时的监控、报警以及运维操作 编写Hystrix类 import ( "errors" "github.com/afex/hystrix-go/hystrix" "sync" ) var config = hystrix.CommandConfig{ Timeout: 5000, //执行command的超时时间(毫秒) MaxConcurrentRequests: 8, //command的最大并发量 SleepWindow: 1000, //过多长时间,熔断器再次检测是否开启。单位毫秒 ErrorPercentThreshold: 30, //错误率

SpringBoot+Redis+Lua限流

折月煮酒 提交于 2020-03-13 14:54:17
新建SpringBoot项目 引入依赖 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.66</version> </dependency> 3. applicaton.properties文件中添加redis配置 # Redis数据库索引 默认为0 spring.redis.database=0 # Redis地址 spring.redis.host=localhost # Redis端口

高并发利器之限流

早过忘川 提交于 2020-01-07 18:52:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 何为限流? 在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了就没了。通过限流,我们可以很好地控制系统的qps,从而达到保护系统的目的。 常见限流算法 1、计算器算法 计数器算法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。那么我们可以这么做:在一开 始的时候,我们可以设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请求与第一个 请求的间隔时间还在1分钟之内,那么说明请求数过多;如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置 counter。 public class CounterTest { public long timeStamp = getNowTime(); public int reqCount = 0; public final int limit = 100; // 时间窗口内最大请求数 public final long interval = 1000; // 时间窗口ms public boolean grant() {

利用AOP手写一个简单的熔断和限流

女生的网名这么多〃 提交于 2020-01-07 03:43:37
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> MAVEN依赖 <!-- aspectj --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.2</version> </dependency> 注解类 @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RateLimiter { int timeout() default -1; int count() default -1; } AOP 处理类 @Component @Aspect public class RatelimiterAop { private static ConcurrentHashMap<String, Semaphore> LIMITER = new

高并发之api接口,分布式,防刷限流,如何做?

*爱你&永不变心* 提交于 2019-12-16 18:08:33
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在开发分布式高并发系统时,我们通常有三种方法保护系统:缓存、降级、限流。 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,直接返回简单结果,而不继续执行后面正常的业务流程,待高峰或者问题解决后再打开 限流 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理 相关概念 PV: page view 访问量 即页面浏览量或点击量,用户每次刷新即被计算一次 UV: unique view 独立访客 访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次 IP: IP(独立IP):即Internet Protocol,指独立IP数。00:00-24:00内相同IP地址之被计算一次 QPS: query per second,即每秒访问量。qps很大程度上代表了系统的繁忙度,每次请求可能存在多次的磁盘io,网络请求,多个cpu时间片,一旦qps超过了预先设置的阀值,可以考量扩容增加服务器,避免访问量过大导致的宕机 RT: response time,每次请求的响应时间,直接决定用户体验性 信号量 1. Semaphore 简介

接口限流算法:漏桶算法和令牌桶算法

拥有回忆 提交于 2019-12-05 18:23:37
漏桶算法 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。这一点和线程池原理是很相似的。 把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。 需要注意的是,在某些情况下,漏桶算法不能够有效地使用网络资源,因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。 令牌桶算法 令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。 单机限流 Google的Guava包中的RateLimiter类就是令牌桶算法的解决方案。 首先说下单机限流 package yzy.guava.test; import com.google.common.base.Optional; import com

Spring Cloud Gateway 扩展支持动态限流

喜你入骨 提交于 2019-12-04 21:19:30
之前分享过 一篇 《Spring Cloud Gateway 原生的接口限流该怎么玩》 , 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生RequestRateLimiter 的不足 配置方式 spring: cloud: gateway: routes: - id: requestratelimiter_route uri: lb://pigx-upms order: 10000 predicates: - Path=/admin/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 1 redis-rate-limiter.burstCapacity: 3 key-resolver: "#{@remoteAddrKeyResolver}" #SPEL表达式去的对应的bean - StripPrefix=1 RequestRateLimiterGatewayFilterFactory public GatewayFilter apply(Config config) { KeyResolver resolver = getOrDefault(config.keyResolver, defaultKeyResolver);