摘要:以流量為切入點,從流量控制熔斷降級系統負載保護等多個維度保護服務的穩定性分布式系統的流量防衛兵。歡迎關注我們獲得更多的好玩實踐
之前分享過 一篇 《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
在實際生產過程中,必定不能滿足我們的需求
生產中路由信息是保存數據庫持久化或者配置中心,RequestRateLimiterGatewayFilterFactory 并不能隨著持久化數據的改變而動態改變限流參數,不能做到實時根據流量來改變流量閾值
Sentinel Spring Cloud Gateway 流控支持 Sentinel 是什么?隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性,分布式系統的流量防衛兵。
從 1.6.0 版本開始,Sentinel 提供了 Spring Cloud Gateway 的適配模塊,可以提供兩種資源維度的限流:
route 維度:即在 Spring 配置文件中配置的路由條目,資源名為對應的 routeId
自定義 API 維度:用戶可以利用 Sentinel 提供的 API 來自定義一些 API 分組
配置本地路由規則及其sentinel數據源com.alibaba.cloud spring-cloud-alibaba-sentinel-gateway com.alibaba.csp sentinel-datasource-nacos
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數據源中的限流策略
常用限流策略 常量
以客戶端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效果演示filter(ServerWebExchange exchange, GatewayFilterChain chain) { Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); Mono 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 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個線程測試一下
通過上圖可以結果證明sentinel限流確實有效
動態修改限流參數sentinel-datasource-nacos 作為sentinel的數據源,可以從如上 nacos 管理臺實時刷新限流參數及其閾值
目前sentinel dashboard 1.6.2 暫未實現gateway 流控圖形化控制 , 1.7.0 會增加此功能
總結以上源碼參考個人項目 基于Spring Cloud、OAuth2.0開發基于Vue前后分離的開發平臺
QQ: 2270033969 一起來聊聊你們是咋用 spring cloud 的吧。
歡迎關注我們獲得更多的好玩JavaEE 實踐
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75662.html
摘要:以流量為切入點,從流量控制熔斷降級系統負載保護等多個維度保護服務的穩定性分布式系統的流量防衛兵。歡迎關注我們獲得更多的好玩實踐 之前分享過 一篇 《Spring Cloud Gateway 原生的接口限流該怎么玩》, 核心是依賴Spring Cloud Gateway 默認提供的限流過濾器來實現 原生RequestRateLimiter 的不足 配置方式 spring: clou...
摘要:應對突發請求時額外允許的請求數目。勻速排隊模式下的最長排隊時間,單位是毫秒,僅在勻速排隊模式下生效。和為后續參數匹配特性預留,目前未實現。 1. 前言 4月25號,Sentinel 1.6.0 正式發布,帶來 Spring Cloud Gateway 支持、控制臺登錄功能、改進的熱點限流和注解 fallback 等多項新特性,該出手時就出手,緊跟時代潮流,昨天剛發布,今天我就要給大家分...
摘要:常見的限流方式,比如適用線程池隔離,超過線程池的負載,走熔斷的邏輯。在令牌桶算法中,存在一個桶,用來存放固定數量的令牌。,令牌桶每秒填充平均速率。 轉載請標明出處: https://www.fangzhipeng.com本文出自方志朋的博客 在高并發的系統中,往往需要在系統中做限流,一方面是為了防止大量的請求使服務器過載,導致服務不可用,另一方面是為了防止網絡攻擊。 常見的限流方式,...
摘要:歡迎訪問我的歡迎訪問我的內容所有原創文章分類匯總及配套源碼,涉及等本篇概覽本篇概覽本文是實戰系列的第八篇,經過前面的學習,咱們對過濾器已了解得差不多,今天來補全過濾器的最后一個版塊限流默認的限流器是基于實現的,限流算法是大家熟悉的令牌桶關于歡迎訪問我的GitHubhttps://github.com/zq2599/blog_demos內容:所有原創文章分類匯總及配套源碼,涉及Java、Doc...
閱讀 3026·2023-04-25 18:06
閱讀 3271·2021-11-22 09:34
閱讀 2856·2021-08-12 13:30
閱讀 2044·2019-08-30 15:44
閱讀 1659·2019-08-30 13:09
閱讀 1629·2019-08-30 12:45
閱讀 1715·2019-08-29 11:13
閱讀 3608·2019-08-28 17:51