当前位置: 首页 > news >正文

做鱫视频网站成品网站1688入口网页版怎样

做鱫视频网站,成品网站1688入口网页版怎样,企业网站建设 知乎,新公司名称核准在哪个网站我们可以使用策略模式来统一单机限流和分布式限流的实现,提高代码的可扩展性和可维护性。 思路是定义一个 RateLimitStrategy 接口,并分别实现单机限流策略 LocalRateLimitStrategy 和分布式限流策略 DistributedRateLimitStrategy。在 AOP 切面中,根据配置决定使用哪种限流策…

我们可以使用策略模式来统一单机限流和分布式限流的实现,提高代码的可扩展性和可维护性。

思路是定义一个 RateLimitStrategy 接口,并分别实现单机限流策略 LocalRateLimitStrategy 和分布式限流策略 DistributedRateLimitStrategy。在 AOP 切面中,根据配置决定使用哪种限流策略。

定义策略接口

public interface RateLimitStrategy {boolean tryAcquire(String key, double qps, long timeout, TimeUnit timeUnit);
}

实现单机限流策略

import com.google.common.util.concurrent.RateLimiter;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;public class LocalRateLimitStrategy implements RateLimitStrategy {private final Map<String, RateLimiter> rateLimiters = new ConcurrentHashMap<>();@Overridepublic boolean tryAcquire(String key, double qps, long timeout, TimeUnit timeUnit) {RateLimiter limiter = rateLimiters.computeIfAbsent(key, k -> RateLimiter.create(qps));if (timeout > 0) {return limiter.tryAcquire(timeout, timeUnit);} else {return limiter.tryAcquire();}}
}

实现分布式限流策略

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;public class DistributedRateLimitStrategy implements RateLimitStrategy {private final RedisTemplate<String, Object> redisTemplate;public DistributedRateLimitStrategy(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;}@Overridepublic boolean tryAcquire(String key, double qps, long timeout, TimeUnit timeUnit) {long window = timeUnit.toSeconds(timeout);List<String> keys = Collections.singletonList(key);String luaScript = buildLuaScript();RedisScript<Long> redisScript = new DefaultRedisScript<>(luaScript, Long.class);Long currentCount = redisTemplate.execute(redisScript, keys, Collections.singletonList(window), Collections.singletonList(qps));return currentCount <= qps;}private String buildLuaScript() {return "local key = KEYS[1]\n" +"local window = tonumber(ARGV[1])\n" +"local qps = tonumber(ARGV[2])\n" +"local current = redis.call('incrBy', key, 1)\n" +"if current == 1 then\n" +"    redis.call('expire', key, window)\n" +"end\n" +"if current > qps then\n" +"    return redis.call('decrBy', key, 1)\n" +"else\n" +"    return current\n" +"end";}
}

修改切面逻辑

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Aspect
@Component
public class RateLimitAspect {@Autowiredprivate RateLimitStrategy rateLimitStrategy;@Around("@annotation(rateLimitAnnotation)")public Object around(ProceedingJoinPoint joinPoint, RateLimit rateLimitAnnotation) throws Throwable {String key = joinPoint.getSignature().toLongString();double qps = rateLimitAnnotation.qps();long timeout = rateLimitAnnotation.timeout();TimeUnit timeUnit = rateLimitAnnotation.timeUnit();boolean acquired = rateLimitStrategy.tryAcquire(key, qps, timeout, timeUnit);if (!acquired) {throw new RuntimeException("Rate limit exceeded");}return joinPoint.proceed();}
}

在切面逻辑中,我们注入了 RateLimitStrategy 的实现类。根据配置决定使用单机限流还是分布式限流策略。

使用示例

@RestController
public class DemoController {@Autowiredprivate RateLimitStrategy rateLimitStrategy;@GetMapping("/test")@ApiRateLimit(qps = 10, timeout = 60, timeUnit = TimeUnit.SECONDS)public String test() {return "hello world";}
}

在使用时,我们只需要在方法上标注 @RateLimit 注解即可,而不需要关心底层使用的是单机限流还是分布式限流。

配置限流策略

在 Spring 配置中,我们可以根据需求注入不同的 RateLimitStrategy 实现类:

// 单机限流配置
@Bean
public RateLimitStrategy localRateLimitStrategy() {return new LocalRateLimitStrategy();
}// 分布式限流配置
@Bean
public RateLimitStrategy distributedRateLimitStrategy(RedisTemplate<String, Object> redisTemplate) {return new DistributedRateLimitStrategy(redisTemplate);
}

通过使用策略模式,我们将限流算法与具体的限流策略解耦,提高了代码的可扩展性和可维护性。未来如果需要新的限流策略,只需要实现 RateLimitStrategy 接口并配置即可,无需修改核心的限流逻辑。

http://www.mnyf.cn/news/44813.html

相关文章:

  • 专业建站外包百度收藏夹使用方法
  • 律师事务所在线咨询免费1688关键词怎么优化
  • 曰本真人做爰免费网站全球搜钻
  • 电子政务网站建设公司网销怎么做才能做好
  • 申请注册邮箱站长工具seo综合查询降级
  • 系统网站设计免费推广渠道有哪些
  • 手机网站app制作成都seo公司排名
  • 做外贸的阿里巴巴网站是哪个好培训机构营业执照如何办理
  • 网站开发合同补充协议百度sem推广
  • 国外网站视频播放器百度竞价渠道代理
  • 烟台做网站打电话话术搜索词和关键词
  • 环保网站查询碾米是否做备案网络推广工具有哪些
  • 网站建设功能评估表免费检测网站seo
  • 微信用大型网站站做跳板关键词分为哪几类
  • 做网站吸引客户全国免费发布信息平台
  • wordpress网站无法访问网站推广方法
  • 网站空间多久续一次费成都高端企业网站建设
  • 搜狐焦点石家庄房产网合肥seo整站优化
  • 好的设计公司网站宁波做网站的公司
  • 南昌做网站电话武汉谷歌seo
  • 如何建立内外网网站seo免费推广
  • 网站界面类型北京百度搜索排名优化
  • 青岛网站推广方案宁波网站推广平台效果好
  • 企业网站教程seo视频教程我要自学网
  • 江苏建筑工程网网站建设加推广优化
  • 佛山品牌网站设计制作百度推广销售话术
  • 中国轻工建设公司网站汕头网站关键词推广
  • 个体户可以备案网站吗百度浏览器官方网站
  • 课程网站开发背景和意义谷歌三件套下载
  • 网站建设 系统维护googleplay官网