Spring Cloud alibaba閘道器 sentinel zuul 四 限流熔斷
spring cloud alibaba 集成了 他內部開源的 Sentinel 熔斷限流框架
Sentinel 介紹
官方網址
隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
Sentinel 具有以下特徵:
- 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、訊息削峰填谷、叢集流量控制、實時熔斷下游不可用應用等。
完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級資料,甚至 500 臺以下規模的叢集的彙總執行情況。 - 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模組,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。
- 完善的 SPI 擴充套件點:Sentinel 提供簡單易用、完善的 SPI 擴充套件介面。您可以通過實現擴充套件介面來快速地定製邏輯。例如定製規則管理、適配動態資料來源等。
Sentinel 的主要特性:
Sentinel 的開源生態:
介紹一下 如果搭建。本次並不會一點點延伸更深層次的地方。只教大家快速使用。等spring cloud gateway更新完成之後會帶大家更深層次的挖掘 Sentinel 的功能。
Sentinel的快速搭建
直接下載官網已經打好的jar包
release地址 https://github.com/alibaba/Sentinel/releases
原始碼編譯
git clone https://github.com/alibaba/Sentinel.git
然後進入目錄執行 mvn clean package
命令啟動
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
如果需要docker 的話 可編寫 docker Dockerfile
# 基於哪個映象
FROM java:8
# 拷貝檔案到容器,也可以直接寫成ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar /app.jar
ADD ./*.jar app.jar
RUN mkdir -p /var/logs/Sentinel
RUN mkdir -p /var/logs/jvm
RUN mkdir -p /var/logs/dump
RUN bash -c 'touch /app.jar'
# 開放8080埠
EXPOSE 8080
# 配置容器啟動後執行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-XX:-PrintGCDetails","-XX:-PrintGCTimeStamps","-XX:-HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=/var/logs/dump/oom_dump.dump","-Xloggc:/var/logs/jvm/app.log","-Dfile.encoding=UTF8","-Duser.timezone=GMT+08","-XX:CMSInitiatingOccupancyFraction=90","-XX:MaxGCPauseMillis=200","-XX:StringTableSize=20000","-XX:+UseG1GC","-Xss256k","-Xmx1024m","-Xms512m","-jar","/app.jar"]
執行 docker 映象製作
docker build --tag sentinel:1.0 .
--tag projectname:version 注意寫法
然後docker run 啟動映象。這裡作者使用的docker映象方式啟動
docker run -d -p9088:8080 304342c105e9
然後控制檯輸入 http://localhost:9088/ 使用者名稱密碼 sentinel/sentinel
登入引數配置:
從 Sentinel 1.6.0 起,Sentinel 控制檯引入基本的登入功能,預設使用者名稱和密碼都是 sentinel。可以參考 鑑權模組文件 配置使用者名稱和密碼。
- Dsentinel.dashboard.auth.username=sentinel 用於指定控制檯的登入使用者名稱為 sentinel;
- Dsentinel.dashboard.auth.password=123456 用於指定控制檯的登入密碼為 123456;如果省略這兩個引數,預設使用者和密碼均為 sentinel;
- Dserver.servlet.session.timeout=7200 用於指定 Spring Boot 服務端 session 的過期時間,如 7200 表示 7200 秒;60m 表示 60 分鐘,預設為 30 分鐘;
輸入密碼登入
服務已啟動我們在整合 閘道器zuul 服務於sentinel的整合。
pom 新增
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
操作新增倆個檔案在resources下面
- api.json
[
{
"apiName": "cloud-discovery-server",
"predicateItems": [
{
"pattern": "/server/**"
},
{
"pattern": "/server/server/**",
"matchStrategy": 1
},
{
"items": [
{
"pattern": "/server/**"
}
]
}
]
},
{
"apiName": "cloud-discovery-client",
"predicateItems": [
{
"pattern": "/client/**"
}
]
}
]
啟動服務並進行之前的一次訪問
- gateway.json
[
{
"resource": "cloud-discovery-server",
"count": 1
},
{
"resource": "cloud-discovery-client",
"count": 10,
"intervalSec": 2,
"controlBehavior": 1,
"maxQueueingTimeoutMs": 200,
"paramItem": {
"parseStrategy": 3,
"fieldName": "test"
}
}
]
多次請求 curl http://localhost:9083/server/server/hello?name=tom
然後在控制檯
api.json 對應的是控制檯 api 管理
使用者自定義的 API 定義分組,可以看做是一些 URL 匹配的組合。比如我們可以定義一個 API 叫 my_api,請求 path 模式為 /foo/** 和 /baz/** 的都歸到 my_api 這個 API 分組下面。限流的時候可以針對這個自定義的 API 分組維度進行限流。
gateway 對應的是控制檯流控管理
- resource:資源名稱,可以是閘道器中的 route 名稱或者使用者自定義的API 分組名稱。
- resourceMode:規則是針對 API Gateway 的route(RESOURCE_MODE_ROUTE_ID)還是使用者在 Sentinel 中定義的API 分組(RESOURCE_MODE_CUSTOM_API_NAME),預設是route。
- grade:限流指標維度,同限流規則的grade 欄位。
- count:限流閾值
- intervalSec:統計時間視窗,單位是秒,預設是1 秒(目前僅對引數限流生效)。
- controlBehavior:流量整形的控制效果,同限流規則的 controlBehavior 欄位,目前支援快速失敗和勻速排隊兩種模式,預設是快速失敗。
- burst:應對突發請求時額外允許的請求數目(目前僅對引數限流生效)。
- maxQueueingTimeoutMs:勻速排隊模式下的最長排隊時間,單位是毫秒,僅在勻速排隊模式下生效。
- paramItem:引數限流配置。若不提供,則代表不針對引數進行限流,該閘道器規則將會被轉換成普通流控規則;否則會轉換成熱點規則。其中的欄位:
- parseStrategy:從請求中提取引數的策略,目前支援提取來源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、
- Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 引數(PARAM_PARSE_STRATEGY_URL_PARAM)四種模式。
- fieldName:若提取策略選擇 Header 模式或 URL 引數模式,則需要指定對應的 header 名稱或 URL 引數名稱。
- pattern 和 matchStrategy:為後續引數匹配特性預留,目前未實現。
其實在控制檯上 可以看到請求鏈路、還有流量規則。編輯的位置,都能匹配這是各種的組合配置。因為Sentinel 是阿里巴巴開源的流控框架。非常簡單實用。文件也非常全面,強烈推薦能自己去官網學習這些資料。我這裡只是做一個簡單的整合。
Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
如何喜歡可以關注分享本公眾號。
版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。轉載請附帶公眾號二維