Spring Cloud Gateway基于CPU使用率实现限流

前言

 本文Demo摘自 《重新定义》

在项目里利用 cpu 的使用率来做限流其实不是很常用,或者基本不会使用这种方法进行,限流,除非该项目有他特殊 的需要,因为我们不能保证是其他 应用或者服务引起的 cpu 使用率增加,还是由于访问量大,导致 cpu 使用率增加, 因为一台机器 cpu使用率不是说你一个 java服务就能控制的,所以用这个判断是有误差的,本文就是一个为了扩展大家思路而写的。

 

正文

 

思想就是 我们通过观察 机器 cpu使用率,然后设定一个阀值,超过阀值不允许访问。

代码清单

 

@Component
public class GatewayRateLimitFilterByCpu implements GatewayFilter, Ordered {

    private final Logger log = LoggerFactory.getLogger(GatewayRateLimitFilterByCpu.class);

    @Autowired
    private MetricsEndpoint metricsEndpoint;

    private static final String METRIC_NAME = "system.cpu.usage";

    private static final double MAX_USAGE = 0.050D;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取网关所在机器的CPU使用情况
        Double systemCpuUsage = metricsEndpoint.metric(METRIC_NAME, null)
                .getMeasurements()
                .stream()
                .filter(Objects::nonNull)
                .findFirst()
                .map(MetricsEndpoint.Sample::getValue)
                .filter(Double::isFinite)
                .orElse(0.0D);

        boolean isOpenRateLimit = systemCpuUsage >MAX_USAGE;
        log.debug("system.cpu.usage: {}, isOpenRateLimit:{} ",systemCpuUsage , isOpenRateLimit);
        if (isOpenRateLimit) {
            //当CPU的使用超过设置的最大阀值开启限流
            exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
            return exchange.getResponse().setComplete();
        } else {
            return chain.filter(exchange);
        }
    }

    @Override
    public int getOrder() {
        return 0;
    }

}

 

我们通过 api 方式 配置过滤器作用到某个路由,其实我们也可以在yml 文件中配置路由地址的映射。代码如下

@SpringBootApplication
public class GatewayApplication {

    @Autowired
    private GatewayRateLimitFilterByCpu gatewayRateLimitFilterByCpu;

    @Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/test/rateLimit")
                        .filters(f -> f.filter(gatewayRateLimitFilterByCpu))
                        .uri("http://localhost:8000/hello/rateLimit")
                        .id("rateLimit_route")
                ).build();
    }
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

代码说明:

大家看到我当前并没有使用 任何注册中心,只是把api 映射到某个路由,其实这种做法是不正确的,由于写的是 demo 我就这样做了,实际中我们千万要用 yml 文件做服务与网关的映射。

想了解更多 gateway 学习资料 请观看好友的博客 :https://www.lhdyx.cn/article/84 

想了解关于 gateway 其他限流方式请点击: https://blog.csdn.net/weixin_38003389/article/details/88999062

加我微信可以联系到上述博客的作者哦!!~

 

测试

在测试前我们先准备一个 客户端,这个客户端很简单,只需要开放一个接口 /hello/rateLimit 即可,返回一个字符串,并且 端口是8000,一定要看我上面路由设置哦。我们启动这个客户端,然后在启动我们的网关。

 在地址栏 输入 http://localhost:8082/actuator/metrics/system.cpu.usage 可以查看本机 cpu使用情况,如图

《Spring Cloud Gateway基于CPU使用率实现限流》

然后我们访问 http://localhost:8082/test/rateLimit ,由于我设置的阀值是 0.05,当前 cpu 使用率是0.16 ,所以被限制访问了

 

 

《Spring Cloud Gateway基于CPU使用率实现限流》

 

 

项目结构,需要源码,加微信

《Spring Cloud Gateway基于CPU使用率实现限流》

 

《Spring Cloud Gateway基于CPU使用率实现限流》《Spring Cloud Gateway基于CPU使用率实现限流》

 

    原文作者:胖虎。。
    原文地址: https://blog.csdn.net/weixin_38003389/article/details/89000754
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞