前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Gateway基于CPU使用率实现限流

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

作者头像
胖虎
发布2019-06-26 17:12:33
1.1K0
发布2019-06-26 17:12:33
举报
文章被收录于专栏:晏霖

前言

本文Demo摘自 《重新定义》

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

正文

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

代码清单

代码语言:javascript
复制
@Componentpublic 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 文件中配置路由地址的映射。代码如下

代码语言:javascript
复制
@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);
    }
}
代码语言:javascript
复制
代码说明:

大家看到我当前并没有使用 任何注册中心,只是把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使用情况,如图

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 晏霖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
    • 代码清单
    相关产品与服务
    微服务引擎 TSE
    微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档