转载

Spring Cloud Gateway 扩展支持动态限流 原 荐

冷冷沉思录 Boot Cloud

正文

Spring Cloud Gateway 扩展支持动态限流

Spring Cloud Gateway 扩展支持动态限流 原 荐
  冷冷gg 发布于 29分钟前

字数 957

阅读 60

收藏 1

limiter Spring Spring Cloud Sentinel Nacos

挑战A.I.,赢百万奖金......了解更多详情>>> Spring Cloud Gateway 扩展支持动态限流 原 荐

之前分享过 一篇 《Spring Cloud Gateway 原生的接口限流该怎么玩》 , 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现

原生RequestRateLimiter 的不足

  • 配置方式
spring:
  cloud:
    gateway:
      routes:
      - id: requestratelimiter_route
        uri: lb://pigx-upms
        order: 10000
        predicates:
        - Path=/admin/**
        filters:
        - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 1  
            redis-rate-limiter.burstCapacity: 3
            key-resolver: "#{@remoteAddrKeyResolver}" #SPEL表达式去的对应的bean
        - StripPrefix=1
  • RequestRateLimiterGatewayFilterFactory
public GatewayFilter apply(Config config) {
	KeyResolver resolver = getOrDefault(config.keyResolver, defaultKeyResolver);
	RateLimiter<object> limiter = getOrDefault(config.rateLimiter,
			defaultRateLimiter);
	boolean denyEmpty = getOrDefault(config.denyEmptyKey, this.denyEmptyKey);
	HttpStatusHolder emptyKeyStatus = HttpStatusHolder
			.parse(getOrDefault(config.emptyKeyStatus, this.emptyKeyStatusCode));

	return (exchange, chain) -> {
				return exchange.getResponse().setComplete();
			});
		});
	};
}
  • 在实际生产过程中,必定不能满足我们的需求

    生产中路由信息是保存数据库持久化或者配置中心, RequestRateLimiterGatewayFilterFactory 并不能随着持久化数据的改变而动态改变限流参数,不能做到实时根据流量来改变流量阈值

Sentinel Spring Cloud Gateway 流控支持

Sentinel 是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性,分布式系统的流量防卫兵。

从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流: route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组

pom 依赖

<!--Spring Cloud Alibaba 封装的 sentinel 模块-->
<dependency>
    <groupid>com.alibaba.cloud</groupid>
    <artifactid>spring-cloud-alibaba-sentinel-gateway</artifactid>
</dependency>

<!--使用nacos 保存限流规则-->
<dependency>
    <groupid>com.alibaba.csp</groupid>
    <artifactid>sentinel-datasource-nacos</artifactid>
</dependency>

配置本地路由规则及其sentinel数据源

spring:
  application:
    name: sentinel-spring-cloud-gateway
  cloud:
    gateway:
      enabled: true
      discovery:
        locator:
          lower-case-service-id: true
      routes:
      - id: pigx_route
        uri: https://api.readhub.cn
        predicates:
        - Path=/topic/**
    sentinel:
      datasource.ds1.nacos:
        server-addr: 127.0.0.1:8848
        data-id: gw-flow
        group-id: DEFAULT_GROUP
        ruleType: gw-api-group
      filter:
        enabled: true

配置nacos数据源中的限流策略

Spring Cloud Gateway 扩展支持动态限流 原 荐

  • 常用限流策略 常量
以客户端IP作为限流因子
public static final int PARAM_PARSE_STRATEGY_CLIENT_IP = 0;
以客户端HOST作为限流因子
public static final int PARAM_PARSE_STRATEGY_HOST = 1;
以客户端HEADER参数作为限流因子
public static final int PARAM_PARSE_STRATEGY_HEADER = 2;
以客户端请求参数作为限流因子
public static final int PARAM_PARSE_STRATEGY_URL_PARAM = 3;
以客户端请求Cookie作为限流因子
public static final int PARAM_PARSE_STRATEGY_COOKIE = 4;
  • 核心源码解析 SentinelGatewayFilter

sentinel通过扩展Gateway的过滤器,通过选择的不同 GatewayParamParser 过处理请求限流因子和数据源中的配置进行比较 源码如下:

public Mono<void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);

    Mono<void> asyncResult = chain.filter(exchange);
    if (route != null) {
        String routeId = route.getId();
        Object[] params = paramParser.parseParameterFor(routeId, exchange,
            r -> r.getResourceMode() == SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID);
        String origin = Optional.ofNullable(GatewayCallbackManager.getRequestOriginParser())
            .map(f -> f.apply(exchange))
            .orElse("");
        asyncResult = asyncResult.transform(
            new SentinelReactorTransformer<>(new EntryConfig(routeId, EntryType.IN,
                1, params, new ContextConfig(contextName(routeId), origin)))
        );
    }

    Set<string> matchingApis = pickMatchingApiDefinitions(exchange);
    for (String apiName : matchingApis) {
        Object[] params = paramParser.parseParameterFor(apiName, exchange,
            r -> r.getResourceMode() == SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME);
        asyncResult = asyncResult.transform(
            new SentinelReactorTransformer<>(new EntryConfig(apiName, EntryType.IN, 1, params))
        );
    }

    return asyncResult;
}

效果演示

  • 以上nacos 配置为 每秒只能通过5个请求,我们使用 jmeter 4.0 来并发10个线程测试一下 Spring Cloud Gateway 扩展支持动态限流 原 荐 Spring Cloud Gateway 扩展支持动态限流 原 荐 Spring Cloud Gateway 扩展支持动态限流 原 荐

  • 通过上图可以结果证明sentinel限流确实有效

动态修改限流参数

sentinel-datasource-nacos
1.7.0

总结

  • 以上源码参考个人项目 基于Spring Cloud、OAuth2.0开发基于Vue前后分离的开发平台
  • QQ: 2270033969 一起来聊聊你们是咋用 spring cloud 的吧。

Spring Cloud Gateway 扩展支持动态限流 原 荐

欢迎关注我们获得更多的好玩JavaEE 实践

© 著作权归作者所有

打印

上一篇: Spring的事务传播行为

下一篇: Spring Cloud Gateway 扩展支持多版本控制及灰度发布

Spring Cloud Gateway 扩展支持动态限流 原 荐

冷冷gg

Spring Cloud Gateway 扩展支持动态限流 原 荐
Spring Cloud Gateway 扩展支持动态限流 原 荐

初出茅庐

我们都是从 Hello World 开始的!

领取条件:技能积分大于 200,且被推荐的博客数量大于 3 篇。

粉丝 638

博文 127

码字总数 66119

作品 1

潍坊

UI设计师

提问

加载中

评论( 1 )

Spring Cloud Gateway 扩展支持动态限流 原 荐
如梦技术

14分钟前

:+1:深度实践性好文

删除一条评论

评论删除后,数据将无法恢复

取消

确定

相关文章 最新文章

微服务网关Zuul迁移到Spring Cloud Gateway

背景 在之前的文章中,我们介绍过微服务网关Spring Cloud Netflix Zuul,前段时间有两篇文章专门介绍了Spring Cloud的全新项目Spring Cloud Gateway,以及其中的过滤器工厂。本文将会介绍将微...

aoho

2018/09/24

0

0

Spring Cloud Gateway 扩展支持动态限流 原 荐
Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel

本文对Hystrix、Resilience4j、Sentinel进行对比,并探讨如何使用一行代码这种极简的方式,将Hystrix迁移到Sentinel。 Hystrix 自从前段时间 宣布停止维护之后,社区推荐了 resilience4j。这...

中间件小哥

02/22

0

0

阿里Sentinel支持Spring Cloud Gateway啦

1. 前言 4月25号,Sentinel 1.6.0 正式发布,带来 Spring Cloud Gateway 支持、控制台登录功能、改进的热点限流和注解 fallback 等多项新特性,该出手时就出手,紧跟时代潮流,昨天刚发布,今...

尹吉欢

04/26

0

0

Spring Cloud Gateway 扩展支持动态限流 原 荐
Spring Cloud Gateway 限流操作

开发高并发系统时有三把利器用来保护系统:缓存、降级和限流,API网关作为所有请求的入口,请求量大,我们可以通过对并发访问的请求进行限速来保护系统的可用性。 常用的限流算法比如有令牌桶...

尹吉欢

2018/07/23

0

0

Spring Cloud Gateway 扩展支持动态限流 原 荐
Spring Cloud Alibaba发布第二个版本,Spring 发来贺电

还是熟悉的面孔,还是熟悉的味道,不同的是,这次的配方升级了。 今年10月底,Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布:阿里巴巴开源 Spring Cloud Alibaba,并发布了...

中间件小哥

2018/12/28

0

0

没有更多内容

加载失败,请刷新页面

加载更多
教你三个最实用的应急类办公技巧,让你轻松化解工作中的抓狂

都说职场如战场,我们作为初入职场的小白总是很容易因为自身的工作经验不足导致在办公过程中出现各种岔子却又苦于无法补救。 那么面对这些工作中的难题我们应该怎么办呢?今天小编就来分享三...

趣味资源馆

27分钟前

0

0

Spring Cloud Gateway 扩展支持动态限流 原 荐
mapStruct java bean映射工具(1)

在一个成熟的工程中,尤其是现在的分布式系统中,应用与应用之间,还有单独的应用细分模块之后,DO 一般不会让外部依赖,这时候需要在提供对外接口的模块里放 DTO 用于对象传输,也即是 DO 对...

edison_kwok

27分钟前

1

0

Spring Cloud Gateway 扩展支持动态限流

之前分享过 一篇 《Spring Cloud Gateway 原生的接口限流该怎么玩》, 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生RequestRateLimiter 的不足 配置方式 spring: clou...

冷冷gg

29分钟前

60

1

Spring Cloud Gateway 扩展支持动态限流 原 荐
jstat命令查看jvm的GC情况

参考链接: https://blog.csdn.net/dumbant/article/details/80199213 垃圾回收统计 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCS......

qimh

41分钟前

2

0

视觉AI风口一触即发,虹软AI沙龙点金深圳

7月26日,虹软AI沙龙在深圳湾科技生态园空间举办。AI沙龙是基于虹软视觉开放平台的开发者交流沙龙,旨在通过分享最新的实战案例,帮助开发者解决技术及落地难题,让技术更贴近实用场景。 本次...

丸子码农

44分钟前

1

0

没有更多内容

加载失败,请刷新页面

加载更多
原文  https://my.oschina.net/giegie/blog/3080518
正文到此结束
Loading...