springcloud alibab + sentinel1.8.1集成文档
集成版本說明:
springboot 2.5.2
spring cloud 2020.0.5
spring cloud alibaba 2.2.6.RELEASE
sentinel 1.8.1
nacos 1.4.2
spring cloud gateway
sentinel
- 一、sentinel
- 1、sentinel dashboard的安裝
- 1、下載
- 2、啟動
- 3、訪問web頁面,登錄
- 2、sentinel實時監(jiān)控服務(wù)
- 1、創(chuàng)建項目引入依賴
- 2、添加sentinel到配置文件
- 3、建立controller
- 3、sentinel流量控制
- 3.1、sentinel服務(wù)限流
- 3.2、sentinel服務(wù)熔斷
- 3.3、sentinel服務(wù)熱點規(guī)則
- 3.4、sentinel系統(tǒng)規(guī)則
- 3.5、sentinel服務(wù)授權(quán)規(guī)則
- 二、springcloud gateway整合nacos
- 1、nacos下載
- 2、網(wǎng)關(guān)服務(wù)注冊到nacos
- 2.1、添加依賴:
- 2.2、修改網(wǎng)關(guān)配置文件注冊網(wǎng)關(guān)服務(wù)到nacos中:
- 2.3:同樣的方法sdpserver服務(wù)注冊到nacos服務(wù)中
- 2.4:打開nacos控制臺查看是否已注冊:
- 三、springcloud gateway整合sentinel網(wǎng)關(guān)限流實現(xiàn)
- 1、添加alibaba對gateway-sentinel的集成依賴:
- 2、修改網(wǎng)關(guān)啟動器:
- 3、網(wǎng)關(guān)服務(wù)限流:
- 3.1、以routeID為api類型,進行流量控制。
- 3.2 以API分組為api類型
- 4、配置限流規(guī)則
- 四、流控數(shù)據(jù)持久化到nacos
- 1、添加依賴:
- 2、配置限流規(guī)則:
- 3、限流測試
- 3.1、初始加載nacos配置
- 3.2、有nacos的配置情況下,對sentinel控制臺修改
- 3.3 無nacos的配置情況,對sentinel控制臺修改
sentinel:分布式系統(tǒng)的流量防衛(wèi)兵。隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel 是面向分布式服務(wù)架構(gòu)的流量控制組件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統(tǒng)負載保護、熱點防護等多個維度來幫助開發(fā)者保障微服務(wù)的穩(wěn)定性。
histrix:斷路性,主要是做對于服務(wù)鏈路的保護和整個微服務(wù)系統(tǒng)的保護。
sentinel:以流量為切入點,可以做流量控制(控制到每一秒的請求數(shù),或者是并發(fā)的線程數(shù)),熔斷(對調(diào)用鏈路的保護,當(dāng)A=>B=>C時,C因為超時、異常等掛了,導(dǎo)致請求發(fā)生堆積,久而久之B長時間等待C返回中,B有可能把自己的線程資源耗盡,導(dǎo)致微服務(wù)出現(xiàn)許多現(xiàn)象,所以當(dāng)C出現(xiàn)類似現(xiàn)象時,要立即熔斷,快速做rollback,防止資源靠近)降級(熔斷必然會導(dǎo)致降級,降級是指將系統(tǒng)中的邊緣服務(wù)關(guān)閉,而保證系統(tǒng)的核心服務(wù)的運行,降級從一整個大的角度來講是對整個系統(tǒng)的保護,而熔斷是對鏈路的保護)
一、sentinel
1、sentinel dashboard的安裝
1、下載
- https://github.com/alibaba/Sentinel/releases
2、啟動
-
儀表盤是個jar包可以直接通過java -jar 的命令啟動 ,默認端口為8080
-
java -jar sentinel-dashboard-1.8.0.jar
-
默認賬號密碼為:sentinel sentinel
如果想要修改默認的賬號密碼和端口,可增加參數(shù) -
Dsentinel.dashboard.auth.username=sentinel
-
Dsentinel.dashboard.auth.password=123456
-
Dserver.port=9090
java -Dserver.port=9090 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456 -jar sentinel-dashboard.jar
- 添加sentinel對網(wǎng)關(guān)的控制
-Dcsp.sentinel.app.type=1
3、訪問web頁面,登錄
-
http://localhost:9090/#/login
默認賬號密碼為:sentinel sentinel
如果想要修改默認的賬號密碼,可增加參數(shù) -
Dsentinel.dashboard.auth.username=sentinel
-
Dsentinel.dashboard.auth.password=123456
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
本地啟動,訪問:localhost:9090,輸入賬戶密碼登錄后,可以看到如下頁面:
2、sentinel實時監(jiān)控服務(wù)
1、創(chuàng)建項目引入依賴
<properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><springboot.version>2.5.2</springboot.version> <spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version><spring.cloud.version>2020.0.5</spring.cloud.version> </properties><!--引入sentinel依賴--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency><!-- 引入nacos discover依賴--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency><!-- 全局維護版本--> <dependencyManagement> <dependencies><!-- Spring Cloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency> <dependency><!-- Import dependency management from Spring Boot --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${springboot.version}</version><type>pom</type><scope>import</scope> </dependency> </dependencies> </dependencyManagement> ```- sentinel默認為延時加載,不會在啟動之后立即創(chuàng)建服務(wù)監(jiān)控,需要對服務(wù)進行調(diào)用才會初始化
2、添加sentinel到配置文件
其中,spring.cloud.sentinel.eager=true 可使 你的SpringCloud應(yīng)用啟動時,直接與Sentinel建立心跳連接,訪問sentinel 控制臺就可以看到服務(wù)連接情況,不需要第一次訪問應(yīng)用的某個接口,才連接sentinel。
spring:cloud:sentinel:transport:dashboard: localhost:9090 #指定dashboard的ip端口port: 8719 #sentinel日志端口eager: true #直接連接sentinel3、建立controller
@RestController @RequestMapping("/product") public class ProductController {@Value("${server.port}")private Integer port;/*直接調(diào)用/product/getProduct,sentinel就會監(jiān)控在某一時刻/product/getProduct的并發(fā)訪問,有可能是并發(fā)的線程數(shù),有可能是并發(fā)的請求數(shù)監(jiān)控以后會把sentinel的日志傳給sentinel dashboard,dashboard拿到日之后會進行分析*/@GetMapping("/getProduct")public Result getProduct(@RequestParam("id") Integer id){return Result.success("端口:" + port + ",id:" + id);}}3、sentinel流量控制
3.1、sentinel服務(wù)限流
流控效果:
- 快速失敗:返回失敗的方法,未定義則返回默認信息。
- warm up:單機閾值是指每秒設(shè)定只能處理20個請求,如果每秒請求數(shù)超過了20,那么經(jīng)過10秒的預(yù)熱后,才會開始每秒接受20個請求,初始接受請求數(shù)是20/3,其他請求直接拋棄。慢慢的變多,10秒的預(yù)熱時長后,才能接受20個。
- 排隊等待:單機閾值是指設(shè)定每秒只能處理20條請求,如果超過20條就排隊等待,等待超過3000毫秒的,直接拋棄。
3.2、sentinel服務(wù)熔斷
- 慢調(diào)用比例:一秒內(nèi)的請求數(shù)超過了5,并且超過50%的請求返回時間都大于了最大RT時間,則觸發(fā)降級,打開熔斷器,熔斷窗口期為10s。
- 異常比例:請求數(shù)超過了5條,且超過50%的請求都拋出異常,則觸發(fā)熔斷,程序降級,熔斷時長為10s,超過10s后恢復(fù)。
- 異常數(shù):如果近一分鐘的請求數(shù)大于5,且異常數(shù)達到2條,那么觸發(fā)熔斷,熔斷時長為20秒。
3.3、sentinel服務(wù)熱點規(guī)則
假設(shè)我們對一個接口進行熱點參數(shù)限流訪問,保護接口不被突發(fā)的流量擊垮。
但如果對整個接口設(shè)置,假定接口支持最大qps=1000/s,那么有2個問題:
- 當(dāng)流量高峰來臨,接口超過1000/s時,這時部分請求會被限流然后快速失敗,但因為是對整個接口做的限流,這時訪問非熱點商品,也可能出現(xiàn)限流,影響了用戶體驗
- 可能項目里會對熱點商品查詢做單獨的優(yōu)化,比如緩存等,它比普通商品詳情接口而言能承擔(dān)更高的qps閾值,對整個接口設(shè)置限流閾值粒度太粗,設(shè)高了可能應(yīng)用拖垮,設(shè)低了優(yōu)化后的程序沒利用起來
因此需要用到sentinel熱點參數(shù)規(guī)則。但Sentinel的熱點限流規(guī)則本來是用于熱點數(shù)據(jù)場景的,但目前對sentinel-web-servlet(基于普通servlet)和sentinel-spring-webmvc-adapter(基于springmvc)兩種適配都不支持。
因此以下只做配置說明:
在 sentinel-dashboard 中添加熱點規(guī)則
- 資源名(getProductDetail):@SentinelResource(value = “getProductDetail”) 中的 value 值;
- 參數(shù)索引(0):針對該接口的第 0 個參數(shù);
- 單機閾值(50):不是 1 的情況下,允許的 QPS 就是 10;
- 參數(shù)類型(int):索引位置是 0 的參數(shù)的類型是 int;
- 參數(shù)值(74829):如果該接口的第0個參數(shù)的值是74829;
- 限流閾值(100):允許的 QPS 就是100;
- 統(tǒng)計時間窗口(1):統(tǒng)計的時間單位,一般都是 1s;
配完了之后,對于被 @SentinelResource(value = “getProductDetail”) 標(biāo)注的接口,如果參數(shù) id 帶的值是 74829,那么允許它的 QPS 就是 100;對于 id 值是其他的值的請求,允許其 QPS 就是 50;
3.4、sentinel系統(tǒng)規(guī)則
系統(tǒng)規(guī)則和熱點規(guī)則不一樣,熱點規(guī)則是針對方法設(shè)定的,系統(tǒng)規(guī)則是針對一個應(yīng)用設(shè)定的;
系統(tǒng)規(guī)則的 5 中預(yù)置類型
- LOAD:只有在 Linux 系統(tǒng)的機器上才會生效,可以根據(jù)當(dāng)前操作系統(tǒng)的負載,來決定是否觸發(fā)保護(把請求拒絕掉);
- RT:這個應(yīng)用上,所有請求的平均響應(yīng)時間,如果超過某個值,就停止新的請求;
- 線程數(shù):這個應(yīng)用上,所有的請求消耗的線程數(shù)加起來,如果超過某個值,就停止新的請求;
- 入口 QPS:這個應(yīng)用上,所有接口的 QPS 加起來,如果超過某個值,就停止新的請求;
- CPU 使用率:CPU 的使用率,如果超過一個百分比,就停止新的請求;
發(fā)生系統(tǒng)規(guī)則中配置的情況的時候,會把整個應(yīng)用都斷掉,所有的接口對不能對外提供服務(wù)了,這個設(shè)計很少用,因為粒度太大了,用 Sentinel 一般都是做細粒度的維護,如果設(shè)置了系統(tǒng)規(guī)則,可能自己都不知道怎么回事,系統(tǒng)就用不了了
3.5、sentinel服務(wù)授權(quán)規(guī)則
- resource:資源名,即限流規(guī)則的作用對象
- limitApp:對應(yīng)的黑名單/白名單,不同 origin 用逗號分隔,如 appA,appB
- strategy:限制模式,AUTHORITY_WHITE 為白名單模式,AUTHORITY_BLACK 為黑名單模式,默認為白名單模式
如果配置的策略是黑名單且requester在配置在limitApp中,則請求攔截;如果配置的策略是白名單且requester在配置不在limitApp中,則請求攔截;否則請求不攔截。
二、springcloud gateway整合nacos
1、nacos下載
下載后解壓,打開bin目錄雙擊startup.cmd或者進入cmd命令行敲startup.cmd命令啟動,若啟動失敗,修改nacos配置,找到set MODE="cluster"把集群改為單機:
rem set MODE="cluster"set MODE="standalone"2、網(wǎng)關(guān)服務(wù)注冊到nacos
2.1、添加依賴:
<!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--loadbalancer--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!-- Spring Cloud Nacos Config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- Spring Cloud Nacos Discovery --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>2.2、修改網(wǎng)關(guān)配置文件注冊網(wǎng)關(guān)服務(wù)到nacos中:
bootstrap.yml:
spring:application:name: sdp-gatewayprofiles:active: devbootstrap-dev.yml:
spring:cloud:nacos:config:server-addr: localhost:8848file-extension: yamldiscovery:server-addr: localhost:8848application.yml:
spring:application:name: sdp-gatewayprofiles:active: devapplication-dev.yml(暫時將網(wǎng)關(guān)路由的分發(fā)配置在項目中):
server:port: 12000 spring:cloud:sentinel:transport:port: 8719dashboard: localhost:9090eager: truegateway: # discovery: # locator: # enabled: true #開啟從注冊中心動態(tài)創(chuàng)建路由的功能,利用微服務(wù)名進行路由routes:- id: sdpprojecturi: lb://sdpserverpredicates:- Path=/sdpserver/**management:endpoints:web:exposure:include: '*' #暴露所有路由規(guī)則2.3:同樣的方法sdpserver服務(wù)注冊到nacos服務(wù)中
2.4:打開nacos控制臺查看是否已注冊:
三、springcloud gateway整合sentinel網(wǎng)關(guān)限流實現(xiàn)
1、添加alibaba對gateway-sentinel的集成依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!-- sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!--sentinel gateway--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><!--sentinel gateway adapter--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-spring-cloud-gateway-adapter</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-parameter-flow-control</artifactId></dependency>2、修改網(wǎng)關(guān)啟動器:
加上System.setProperty(“csp.sentinel.app.type”, “1”);重啟gateway服務(wù),添加sentinel對網(wǎng)關(guān)的控制,啟動后,進入sentinel控制臺查看網(wǎng)關(guān)服務(wù)是否被sentinel所監(jiān)控到。
3、網(wǎng)關(guān)服務(wù)限流:
3.1、以routeID為api類型,進行流量控制。
3.2 以API分組為api類型
就是對接口進行分組,然后對不同組的接口,實施不同的限流策略。
添加API分組,對API進行限流,需要先對API進行分組。如下圖所示:
配置模式:精確、前綴和正則三種模式。
-
精確模式是指對URL的路徑完全匹配時,進行限流。例如,匹配串配置為/sdpserver/1
-
前綴模式是指對URL的路徑前綴匹配時,進行限流。例如,匹配串配置為/sdpserver/*
-
正則模式是指對URL的路徑符合正則表示式規(guī)則時,進行限流。例如,匹配串配置為/sdpserver/\d*
4、配置限流規(guī)則
根據(jù)API分組配置限流規(guī)則,API名稱可以選擇不同的API分組,進行配置。
四、流控數(shù)據(jù)持久化到nacos
1、添加依賴:
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-parameter-flow-control</artifactId></dependency>2、配置限流規(guī)則:
spring: cloud:sentinel:transport:port: 8719dashboard: localhost:9090eager: truedatasource:flow:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-flow-rulesgroupId: SENTINEL_GROUPrule-type: flowdegrade:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-degrade-rulesgroupId: SENTINEL_GROUPrule-type: degradesystem:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-system-rulesgroupId: SENTINEL_GROUPrule-type: systemauthority:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-authority-rulesgroupId: SENTINEL_GROUPrule-type: authorityparam-flow:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-param-flow-rulesgroupId: SENTINEL_GROUPrule-type: param-flowgw-flow:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-gw-rulesgroupId: SENTINEL_GROUPrule-type: gw-flowgw-api-group:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-gw-api-rulesgroupId: SENTINEL_GROUPrule-type: gw-api-group3、限流測試
3.1、初始加載nacos配置
1、nacos有如下配置文件,對資源“/rest/config/bar”設(shè)置限流規(guī)則。
2、啟動sentinel后,可以看到sentinel控制臺已經(jīng)讀取到sdprest-flow-rules的限流規(guī)則。
3.2、有nacos的配置情況下,對sentinel控制臺修改
1、添加一條新的限流規(guī)則
2、新增后,可以看見nacos配置文件中,已經(jīng)新增了這條配置。
3.3 無nacos的配置情況,對sentinel控制臺修改
1、如圖在nacos中刪除這條流控規(guī)則。
2、可看見sentinel控制臺流控規(guī)則已清空。
3、在sentinel控制臺添加一條規(guī)則。
4、回到nacos中可以看見,限流規(guī)則已創(chuàng)建。
naco配置參數(shù)說明:
-
resource:資源名稱,可以是網(wǎng)關(guān)中的 route 名稱或者用戶自定義的 API 分組名稱。
-
resourceMode:規(guī)則是針對 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)還是用戶在 Sentinel 中定義的 API 分組(RESOURCE_MODE_CUSTOM_API_NAME),默認是 route。
-
grade:限流指標(biāo)維度,同限流規(guī)則的grade字段。
-
count:限流閾值
-
intervalSec:統(tǒng)計時間窗口,單位是秒,默認是 1 秒。
-
controlBehavior:流量整形的控制效果,同限流規(guī)則的controlBehavior字段,目前支持快速失敗和勻速排隊兩種模式,默認是快速失敗。
-
burst:應(yīng)對突發(fā)請求時額外允許的請求數(shù)目。
-
maxQueueingTimeoutMs:勻速排隊模式下的最長排隊時間,單位是毫秒,僅在勻速排隊模式下生效。
- paramItem
:參數(shù)限流配置。若不提供,則代表不針對參數(shù)進行限流,該網(wǎng)關(guān)規(guī)則將會被轉(zhuǎn)換成普通流控規(guī)則;否則會轉(zhuǎn)換成熱點規(guī)則。其中的字段:
- parseStrategy:從請求中提取參數(shù)的策略,目前支持提取來源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 參數(shù)(PARAM_PARSE_STRATEGY_URL_PARAM)四種模式。
- fieldName:若提取策略選擇 Header 模式或 URL 參數(shù)模式,則需要指定對應(yīng)的 header 名稱或 URL 參數(shù)名稱。
- pattern:參數(shù)值的匹配模式,只有匹配該模式的請求屬性值會納入統(tǒng)計和流控;若為空則統(tǒng)計該請求屬性的所有值。(1.6.2 版本開始支持)
- matchStrategy:參數(shù)值的匹配策略,目前支持精確匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正則匹配(PARAM_MATCH_STRATEGY_REGEX)。(1.6.2 版本開始支持)
總結(jié)
以上是生活随笔為你收集整理的springcloud alibab + sentinel1.8.1集成文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis清除一级缓存的几种方法
- 下一篇: vue文件目录解析