分布式限流--基于Spring

1 实现方式:

自定义注解+拦截器+Redis实现限流 (单体和分布式均适用,全局限流)

##############################################################################################

下面开始编码

2 自定义注解:

@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Limiter {
   int limit() default 10;
   int sec() default 10;
}

3 拦截器:

public class LimitInterceptor implements HandlerInterceptor {
 @Autowired
 private RedisTemplate<String, Integer> redisTemplate; //使用RedisTemplate操作redis
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response,   Object handler) 
 throws Exception {
  if (handler instanceof HandlerMethod) {
     HandlerMethod handlerMethod = (HandlerMethod) handler;
     Method method = handlerMethod.getMethod();
     if (!method.isAnnotationPresent(Limiter.class)) {
         return true;
     }
     Limiter limiter = method.getAnnotation(Limiter.class);
     if (limiter == null) {
         return true;
     }
     int limit = limiter.limit();
     int sec = limiter.sec();
     String key = IPUtil.getIpAddr(request) + request.getRequestURI();
     Integer maxLimit = redisTemplate.opsForValue().get(key);
     if (maxLimit == null) {
         redisTemplate.opsForValue().set(key, 1, sec, TimeUnit.SECONDS); //set时一定要加过期时间
     } else if (maxLimit < limit) {
         redisTemplate.opsForValue().set(key, maxLimit + 1, sec, TimeUnit.SECONDS);
     } else {
         output(response, "请求太频繁!");
         return false;
     }
  }
  return true;
 }
 
 public void output(HttpServletResponse response, String msg) throws IOException {
     response.setContentType("application/json;charset=UTF-8");
     ServletOutputStream outputStream = null;
     try {
         outputStream = response.getOutputStream();
         outputStream.write(msg.getBytes("UTF-8"));
     } catch (IOException e) {
       e.printStackTrace();
     } finally {
       outputStream.flush();
       outputStream.close();
     }
 }
 
 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
 ModelAndView modelAndView) throws Exception {
 
 }
 
 @Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
  Exception ex) throws Exception {
 
 }
 
}

4 controller:

@Controller
@RequestMapping("/study")
public class limitController {
    @ResponseBody
    @RequestMapping("/test")
    @Limiter(limit = 10,sec = 100) //加上自定义注解即可
    public String test (HttpServletRequest request,@RequestParam(value = "username",required = false)
     String userName){
        //TODO somethings……
        return "hello world !";
    }
}

5 配置文件

/*springmvc的配置文件中加入自定义拦截器*/
<mvc:interceptors>
 <mvc:interceptor>
 <mvc:mapping path="/**"/>
 <bean class="com.study.controller.limit.LimitInterceptor/>
 </mvc:interceptor>
</mvc:interceptors>

6 测试

使用PostMan工具就可以对我们的接口进行测试。

参考:https://github.com/crossoverJie/distributed-redis-tool

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,我知道一些常用的分布式限流工具。以下是一些比较流行的限流工具: 1. Redis: 使用 Redis 可以简单地实现限流,特别是滑动窗口限流。 2. Guava RateLimiter: Guava 是 Google 的 Java 工具包,其中 RateLimiter 可以提供高效的令牌桶限流。 3. Bucket4J: Bucket4J 是一个 Java 库,可以提供功能强大的令牌桶和漏桶限流。 4. Netflix Zuul: Netflix Zuul 是一个微服务网关,内置了对限流的支持,可以很方便地在应用程序的边界处实现限流。 这些工具都有不同的优势和特性,请根据您的具体需求和环境选择适合您的工具。 ### 回答2: 有一些好用的分布式限流工具可以帮助我们实现系统的流量控制和限流,以下是其中几个常用的: 1. Alibaba Sentinel(阿里巴巴开源):一个功能强大的分布式系统流量防卫士,支持实时的流量控制、熔断降级、系统保护等功能,提供了丰富的配置和管理方式。 2. Spring Cloud Gateway:Spring Cloud生态系统中的一个网关工具,可以通过使用过滤器和限流机制来实现分布式限流,支持基于QPS、令牌桶等算法进行限流控制。 3. Nacos(阿里巴巴开源):一个用于动态服务发现、配置管理和服务治理的平台,其中包含了限流的功能,可以通过配置限流规则来实现请求的限制。 4. Redis+Lua脚本:通过在Redis中使用Lua脚本来实现限流功能。可以利用Redis的高性能和原子操作特性,结合令牌桶、漏桶等算法来实现流量控制。 5. ZooKeeper:一个分布式协调服务,可以用于实现分布式限流。可以利用ZooKeeper的有序节点特性和Watch机制来控制请求的并发量。 这些工具各有特点,具体选择取决于应用场景和需求。在实际使用时,需要根据系统的规模、性能需求和业务特点等因素,综合考虑选择合适的分布式限流工具。 ### 回答3: 当今的分布式系统越来越复杂和庞大,限流是保证系统稳定性和高可用性的重要策略之一。以下是我所知的几个好用的分布式限流工具: 1. Redis:Redis是一个高性能的内存数据存储系统,通过其提供的分布式缓存和限流功能可以实现简单而高效的限流逻辑。需要利用Redis的计数器或令牌桶等数据结构,将请求和访问进行计数,在达到限流阈值时进行拒绝或延迟处理。 2. Sentinel:Sentinel是阿里巴巴开源的一款分布式流量控制组件,它提供了流量控制、熔断降级、系统负载等功能。通过在每个服务节点上配置规则,可以统一限制请求的数量,避免系统被过多的请求压垮。 3. Nginx:Nginx是一款高性能的开源Web服务器,也可以用作分布式限流工具。通过配置Nginx反向代理服务器的限流策略,可以限制请求的并发数、连接数等,而且能够根据不同的URL或IP设置不同的限流策略。 4. Alibaba Yet Another Distributed Rate Limiter (Sentinel):Sentinel是一个用于流量控制的分布式限流组件,由Alibaba开源。它具有动态规则的特性,可以基于各种参数和维度(如QPS、线程数、CPU负载等)对请求进行限流,以保护系统免受过载。 以上是一些我所知道的分布式限流工具,每个工具都有其独特的特点和适用场景。根据具体的需求和系统架构,选择适合的工具进行分布式限流是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值