重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
線上的sentinel 在測試壓測時候可以正常被限流 但是在正常的流量中 發現被限流的接口很少 (我發誓肯定都配置了限流規則)
文中的 服務名稱以及地址 都被改寫了
排查步驟1.檢查相關配置 以及 pom依賴配置 發現SentinelGatewayFilter 重復配置
2.猜測可能是配置沒有進行初始化 或者初始化存在問題 去掉相關的配置初始化 直接使用sentinel -dashboard 進行配置
3.部署并搭建dashborad 添加相關配置 (spring.cloud.sentinel.transport.dashboard=localhost:8888
),使服務啟動注冊到sentinel-dashboard中 訪問 localhost:8888 (默認是端口8080 可以在啟動時候指定 java -Dserver.port=8888 -jar ./sentinel-dashboard-1.8.6.jar &) 需要登錄 默認賬號密碼 都是sentinel 效果如下
4.在流控規則中 添加具體的流控配置 因為我們沒有配置API 所以只有 根據routeId 配置
5.接下來使用 壓測工具進行 壓測 發現限流規則 并沒有生效
6.開始漫長的尋找不生效原因
。。。。。。。。。。。。。。
7.后來找到 可能是版本原因 升級 如下組件的版本
com.alibaba.cloud spring-cloud-starter-alibaba-sentinel 2.2.1.RELEASE com.alibaba.cloud spring-cloud-alibaba-sentinel-gateway 2.2.0.RELEASE8.后來 因為其他的版本不兼容問題 只能整理升級 springboot springcloud springcloud-alibaba
于是根據 spring-cloud-alibaba 官方提供的版本說明 進行了 版本 升級 官方版本說明地址 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
目前使用的版本
spring cloud alibaba 2.2.7.RELEASE
spring cloud Hoxton.SR12
spring boot 2.3.12.RELEASE
9.升級過后,首先去掉 代碼中 sentinel 的重復配置 同時在nacos的限流配置中 僅保留一個接口的限流配置 同時增加 nacos中 sentinel 相關的配置
10.啟動 使用jmter 壓測 發現限流生效了
后續的改進
去掉配置的 異常攔截 (舊的配置中定義了 ErrorWebExceptionHandler 處理器) 使用sentinel的攔截配置
調整多個過濾器的順序 (異常處理器→限流攔截器→全局日志攔截器 ->cat 鏈路->cat過濾)
官方網關限流文檔: https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html
阿里巴巴cloud官方文檔 : https://github.com/alibaba/spring-cloud-alibaba/blob/2022.x/spring-cloud-alibaba-docs/src/main/asciidoc-zh/sentinel.adoc
后記 以下兩個問題 也耽誤了很久
問題1. 配置了某個服務的某個接口 限流規則 導致某個服務的其他的接口 也被限流
有問題的配置 {“resource”:“mall_service”,“apiDefinitions”:[{“matchStrategy”:0,“pattern”:“/mall-service/entry/scene/xxx”}],“count”:10,“intervalSec”:1,“controlBehavior”:0}
問題表現 在請求 /該服務下另一個接口 也被限流 sspmall-service/client/points/user/balance
解決辦法
指定resource 名稱為 特殊的名稱 而不是微服務的名稱
指定resorceMode=1 含義是 使用自定義API限流
正確的配置
{“resource”:“mall_service_entry_scene_xxx”,“resourceMode”:1,“apiDefinitions”:[{“matchStrategy”:0,“pattern”:“/mall-service/entry/scene/xxx”}],“count”:10,“intervalSec”:1,“controlBehavior”:0}
resource是 同一個自定義API組的名稱 以及 限流規則中使用的 自定義API組名稱
問題二 本地部署的 dashboard 和 test環境部署的dashboard 采集的鏈路不一致
本地部署的效果圖
測試環境上的效果圖
注意觀察 一個是叫 請求鏈路 一個叫做簇點鏈路 還有資源名 想差很大 同時 當簇點鏈路為測試環境中的時 接口的限流將失效
本地部署在自己電腦上 同時服務也是在idea中運行
test環境dashboard 部署在服務器(java -jar方式) 而應用是部署在k8s環境中 同時 dashboard和 應用通信的端口不同
解決辦法: 測試環境中的dashboard 也部署到和應用相同的k8s環境里
誤區 因為看到 測試環境中的鏈路 和 zuul 集成 sentinel的時候 鏈路一樣 導致一直在找 zuul是否被生效了 而忽略了 dashboard請求 gateway-service 端口不同 導致鏈路采集有誤
the end
三年過年沒回家了 明天將踏上回家路
新春快樂
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧