本文Demo摘自 《重新定义》
在项目里利用 cpu 的使用率来做限流其实不是很常用,或者基本不会使用这种方法进行,限流,除非该项目有他特殊 的需要,因为我们不能保证是其他 应用或者服务引起的 cpu 使用率增加,还是由于访问量大,导致 cpu 使用率增加, 因为一台机器 cpu使用率不是说你一个 java服务就能控制的,所以用这个判断是有误差的,本文就是一个为了扩展大家思路而写的。
思想就是 我们通过观察 机器 cpu使用率,然后设定一个阀值,超过阀值不允许访问。
@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 文件中配置路由地址的映射。代码如下
@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使用情况,如图
然后我们访问 http://localhost:8082/test/rateLimit ,由于我设置的阀值是 0.05,当前 cpu 使用率是0.16 ,所以被限制访问了
项目结构,需要源码,加微信