spring cloud gateway 实现限流概要思路

Map computeIfAbsent方法说明

使用场景

用spring cloud gateway实现限流的时候遇到了computeIfAbsent的语法(demo如下:令牌桶)

限流一般有两个实现方式,令牌桶和漏桶:令牌桶是初始化令牌(容器)的个数,通过拿走里边的令牌就能通过, 没有令牌就报错,可以设置向容器中增加令牌的速度和最大个数;漏桶是向里边放入请求,当请求数量达到最大值后,丢弃,漏桶中的数据以一定速度流出,没有则不流出

  @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
        //若ip不存在则创建一个Bucket(令牌桶)
        Bucket bucket = LOCAL_CACHE.computeIfAbsent(ip, k -> createNewBucket());
        log.debug("IP:{} ,令牌通可用的Token数量:{} " ,ip,bucket.getAvailableTokens());
        if (bucket.tryConsume(1)) {
            return chain.filter(exchange);
        } else {
            //当可用的令牌书为0是,进行限流返回429状态码
            exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
            return exchange.getResponse().setComplete();
        }
    }

 上面涉及语法 

Bucket bucket = LOCAL_CACHE.computeIfAbsent(ip, k -> createNewBucket());// 方法定义


语法讲解

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
    ...
}

// java8之前。从map中根据key获取value操作可能会有下面的操作
Object key = map.get("key");
if (key == null) {
    key = new Object();
    map.put("key", key);
}

// java8之后。上面的操作可以简化为一行,若key对应的value为空,会将第二个参数的返回值存入并返回
Object key2 = map.computeIfAbsent("key", k -> new Object());
 
发布了223 篇原创文章 · 获赞 145 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/zzhuan_1/article/details/84848980