公司網(wǎng)頁(yè)設(shè)計(jì)費(fèi)計(jì)入什么科目網(wǎng)站建設(shè)優(yōu)化公司
文章目錄
- Spring Cloud Alibaba Sentinel流量防衛(wèi)兵
- 1. 分布式遇到的問題
- 2.解決的方法
- Sentinel: 分布式系統(tǒng)的流量防衛(wèi)兵
- 1. 簡(jiǎn)介和特折
- Sentinel流量防衛(wèi)兵的搭建
- 1.引入依賴
- 2.添加配置類
- 3.運(yùn)行類上添加@SentinelResource,并配置blockHandler和fallback
- 4. linux中放入Sentinel控制臺(tái)程序jar包,并執(zhí)行
- 應(yīng)用接入控制臺(tái)(可選下面那種,簡(jiǎn)單)
- 1.使用整合包(這種)
- 2.通過nacos持久化
- 3.設(shè)置規(guī)則 json
Spring Cloud Alibaba Sentinel流量防衛(wèi)兵
1. 分布式遇到的問題
服務(wù)可用性問題
服務(wù)可用性場(chǎng)景
服務(wù)雪崩效應(yīng)
因服務(wù)提供者的不可用導(dǎo)致服務(wù)調(diào)用者的不可用,并將不可用逐漸放大的過程,就叫服務(wù)雪崩效應(yīng)導(dǎo)致服務(wù)不可用的原因:
在服務(wù)提供者不可用的時(shí)候,會(huì)出現(xiàn)大量重試的情況:用戶重試、代碼邏輯重試,這些重試最終導(dǎo)致:進(jìn)一步加大請(qǐng)求流量。所以歸根結(jié)底導(dǎo)致雪崩效應(yīng)的最根本原因是:大量請(qǐng)求線程同步等待造成的資源耗盡。當(dāng)服務(wù)調(diào)用者使用同步調(diào)用時(shí), 會(huì)產(chǎn)生大量的等待線程占用系統(tǒng)資源。一旦線程資源被耗盡,服務(wù)調(diào)用者提供的服務(wù)也將處于不可用狀態(tài), 于是服務(wù)雪崩效應(yīng)產(chǎn)生了。
2.解決的方法
-
超時(shí)機(jī)制
在不做任何處理的情況下,服務(wù)提供者不可用會(huì)導(dǎo)致消費(fèi)者請(qǐng)求線程強(qiáng)制等待,而造成系統(tǒng)資源耗盡。加入超時(shí)機(jī)制,一旦超時(shí),就釋放資源。由于釋放資源速度較快,一定程度上可以抑制資源耗盡的問題。 -
服務(wù)限流
設(shè)置閾值,操作臨界值不再進(jìn)行向后端請(qǐng)求. -
隔離
每當(dāng)向服務(wù)發(fā)起一個(gè)請(qǐng)求時(shí),就是會(huì)發(fā)起一個(gè)http請(qǐng)求,每一個(gè)http請(qǐng)求就要開啟一個(gè)線程,然后等待服務(wù)返回信息,這容易導(dǎo)致線程的堆積,所以就可以用http的URI作為一個(gè)標(biāo)識(shí),然后相同的URI可以開啟一個(gè)線程池,然后線程池中限定線程數(shù),這樣就可以設(shè)置拒絕策略,當(dāng)線程池滿了,就可以快速的拋出異?;蛘呔芙^請(qǐng)求,用線程池做到線程隔離來(lái)達(dá)到限流。 -
服務(wù)熔斷
熔斷就是有一個(gè)閾值,向服務(wù)發(fā)起請(qǐng)求后,如果不成功,就會(huì)記錄次數(shù),然后當(dāng)連續(xù)失敗次數(shù)達(dá)到閾值時(shí),下次請(qǐng)求的時(shí)候就會(huì)直接把這個(gè)服務(wù)停止。請(qǐng)求有三種狀態(tài),可以請(qǐng)求(開),不可請(qǐng)求(關(guān)),還有一個(gè)中間狀態(tài),相當(dāng)于半開狀態(tài),半開狀態(tài)是什么意思呢,就是可以嘗試著去請(qǐng)求,就可以在關(guān)閉狀態(tài)后一段時(shí)間,發(fā)一個(gè)請(qǐng)求嘗試一下是否可以請(qǐng)求成功,如果不成功,繼續(xù)保持關(guān)閉狀態(tài),如果請(qǐng)求成功,則變成開放狀態(tài)。
-
服務(wù)降級(jí)
降級(jí)其實(shí)就相當(dāng)于,當(dāng)我們向一個(gè)服務(wù)發(fā)起請(qǐng)求,當(dāng)請(qǐng)求超時(shí)了,就會(huì)把這次請(qǐng)求記錄到服務(wù)中,然后就會(huì)嘗試向其他服務(wù)發(fā)請(qǐng)求,如果還沒成功,就對(duì)這次請(qǐng)求進(jìn)行處理(怎么處理取決于業(yè)務(wù)需求如)就相當(dāng)于try
catch一樣的邏輯,當(dāng)然Sentinel底層使用aop來(lái)實(shí)現(xiàn)的。
Sentinel: 分布式系統(tǒng)的流量防衛(wèi)兵
點(diǎn)擊進(jìn)入官方文檔
1. 簡(jiǎn)介和特折
- Sentinel 介紹 隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來(lái)越重要。Sentinel
是面向分布式、多語(yǔ)言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,主要以流量為切入點(diǎn),從流量路由、流量控制、流量整形、熔斷降級(jí)、系統(tǒng)自適應(yīng)過載保護(hù)、熱點(diǎn)流量防護(hù)等多個(gè)維度來(lái)幫助開發(fā)者保障微服務(wù)的穩(wěn)定性。 - Sentinel具有以下特征:
- 豐富的應(yīng)用場(chǎng)景: Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場(chǎng)景,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷、實(shí)時(shí)熔斷下游不可用應(yīng)用等。
- 完備的實(shí)時(shí)監(jiān)控: Sentinel 同時(shí)提供實(shí)時(shí)的監(jiān)控功能。您可以在控制臺(tái)中看到接入應(yīng)用的單臺(tái)機(jī)器秒級(jí)數(shù)據(jù),甚至 500 臺(tái)以下規(guī)模的集群的匯總運(yùn)行情況。
- 廣泛的開源生態(tài): Sentinel 提供開箱即用的與其它開源框架/庫(kù)的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應(yīng)的依賴并進(jìn)行簡(jiǎn)單的配置即可快速地接入 Sentinel。
- 完善的 SPI
擴(kuò)展點(diǎn): Sentinel 提供簡(jiǎn)單易用、完善的 SPI 擴(kuò)展點(diǎn)。您可以通過實(shí)現(xiàn)擴(kuò)展點(diǎn),快速的定制邏輯。例如定制規(guī)則管理、適配數(shù)據(jù)源等
Sentinel流量防衛(wèi)兵的搭建
1.引入依賴
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.0</version>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId><version>1.8.0</version>
</dependency>
2.添加配置類
這里的配置類也就是aop增強(qiáng)的時(shí)候所用的切點(diǎn),但是這里用的時(shí)@Bean注入而不是 注解
@Configuration
public class SentinelConfig {@Beanpublic SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();}
}
3.運(yùn)行類上添加@SentinelResource,并配置blockHandler和fallback
@RestController
public class UserController {@GetMapping("/user/{id}")@SentinelResource(value = "findOrderByUserId",fallback = "fallback", fallbackClass = UserController.class,blockHandler = "handleException", blockHandlerClass = UserController.class)public String findOrderByUserId(@PathVariable("id") Integer id) {if (id == 4) {throw new IllegalArgumentException("非法參數(shù)異常");}return "正常返回";}public static String fallback(Integer id, Throwable e) {return "===被異常降級(jí)啦===";}public static String handleException(Integer id, BlockException e) {return "===被限流啦===";}/*** 定義流控規(guī)則*/@PostConstructprivate static void initFlowRules() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();//設(shè)置受保護(hù)的資源rule.setResource("findOrderByUserId");// 設(shè)置流控規(guī)則 QPSrule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 設(shè)置受保護(hù)的資源閾值// Set limit QPS to 20.rule.setCount(1);rules.add(rule);// 加載配置好的規(guī)則FlowRuleManager.loadRules(rules);}
}
4. linux中放入Sentinel控制臺(tái)程序jar包,并執(zhí)行
不讓上傳自己去外網(wǎng)下把這是網(wǎng)址
1.8.0版本
linux啟動(dòng)代碼
java -Dserver.port=8858 -Dsentinel.dashboard.auth.username=sentinel
-Dsentinel.dashboard.auth.password=123456 -jar sentinel-dashboard-1.8.0.jar
應(yīng)用接入控制臺(tái)(可選下面那種,簡(jiǎn)單)
控制臺(tái)加入jar包
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.0</version>
</dependency>
寫入?yún)?shù)
控制臺(tái)
訪問地址 虛擬機(jī)IP/設(shè)置的端口號(hào) (8858)賬號(hào)剛剛設(shè)置sentinel,密碼123456
不出現(xiàn)這個(gè)也會(huì)正常,看一下機(jī)器列表有沒有你就行啦,畢竟開源要什么自行車
1.使用整合包(這種)
一個(gè)依賴即可
可去掉上方加入的三個(gè)jar包,嫌麻煩不去除也可
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置文件
# 添加sentinel的控制臺(tái)地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8858# 可以理解為應(yīng)用端的端口號(hào) 服務(wù)端是上面配置的8858
# 指定應(yīng)用與Sentinel控制臺(tái)交互的端口,應(yīng)用本地會(huì)起一個(gè)該端口占用的HttpServer, 可以省略
spring.cloud.sentinel.transport.port=8719
直接運(yùn)行即可
2.通過nacos持久化
引入依賴
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>
新建一個(gè)bootstrp.properties文件
spring.cloud.nacos.config.server-addr=192.168.14.58:8848
#spring.application.name=sentinel-app
spring.cloud.sentinel.transport.dashboard=192.168.14.58:8858
spring.cloud.sentinel.datasource.flow.nacos.serverAddr=192.168.14.58:8848
spring.cloud.sentinel.datasource.flow.nacos.dataId=${spring.application.name}-flow-rules
spring.cloud.sentinel.datasource.flow.nacos.groupId=DEFAULT_GROUP
spring.cloud.sentinel.datasource.flow.nacos.data-type=json
spring.cloud.sentinel.datasource.flow.nacos.rule-type=flow
spring.cloud.sentinel.datasource.degrade.nacos.serverAddr=192.168.14.58:8848
spring.cloud.sentinel.datasource.degrade.nacos.dataId=${spring.application.name}-degrade-rules
spring.cloud.sentinel.datasource.degrade.nacos.groupId=DEFAULT_GROUP
spring.cloud.sentinel.datasource.degrade.nacos.data-type=json
spring.cloud.sentinel.datasource.degrade.nacos.rule-type=degrade
在nacos中創(chuàng)建 就是前面建立的點(diǎn)擊跳轉(zhuǎn)
3.設(shè)置規(guī)則 json
流量控制
[{// 資源名"resource": "/test",// 針對(duì)來(lái)源,若為 default 則不區(qū)分調(diào)用來(lái)源"limitApp": "default",// 限流閾值類型(1:QPS;0:并發(fā)線程數(shù))"grade": 1,// 閾值"count": 1,// 是否是集群模式"clusterMode": false,// 流控效果(0:快速失敗;1:Warm Up(預(yù)熱模式);2:排隊(duì)等待)"controlBehavior": 0,// 流控模式(0:直接;1:關(guān)聯(lián);2:鏈路)"strategy": 0,// 預(yù)熱時(shí)間(秒,預(yù)熱模式需要此參數(shù))"warmUpPeriodSec": 10,// 超時(shí)時(shí)間(排隊(duì)等待模式需要此參數(shù))"maxQueueingTimeMs": 500,// 關(guān)聯(lián)資源、入口資源(關(guān)聯(lián)、鏈路模式)"refResource": "rrr"}
]
降級(jí)規(guī)則
[{// 資源名"resource": "/test1","limitApp": "default",// 熔斷策略(0:慢調(diào)用比例,1:異常比率,2:異常計(jì)數(shù))"grade": 0,// 最大RT、比例閾值、異常數(shù)"count": 200,// 慢調(diào)用比例閾值,僅慢調(diào)用比例模式有效(1.8.0 引入)"slowRatioThreshold": 0.2,// 最小請(qǐng)求數(shù)"minRequestAmount": 5,// 當(dāng)單位統(tǒng)計(jì)時(shí)長(zhǎng)(類中默認(rèn)1000)"statIntervalMs": 1000,// 熔斷時(shí)長(zhǎng)"timeWindow": 10}
]
熱點(diǎn)規(guī)則
[{// 資源名"resource": "/test1",// 限流模式(QPS 模式,不可更改)"grade": 1,// 參數(shù)索引"paramIdx": 0,// 單機(jī)閾值"count": 13,// 統(tǒng)計(jì)窗口時(shí)長(zhǎng)"durationInSec": 6,// 是否集群 默認(rèn)false"clusterMode": 默認(rèn)false,// "burstCount": 0,// 集群模式配置"clusterConfig": {// "fallbackToLocalWhenFail": true,// "flowId": 2,// "sampleCount": 10,// "thresholdType": 0,// "windowIntervalMs": 1000},// 流控效果(支持快速失敗和勻速排隊(duì)模式)"controlBehavior": 0,// "limitApp": "default",// "maxQueueingTimeMs": 0,// 高級(jí)選項(xiàng)"paramFlowItemList": [{// 參數(shù)類型"classType": "int",// 限流閾值"count": 222,// 參數(shù)值"object": "2"}]}
]
系統(tǒng)規(guī)則
[{// RT"avgRt": 1,// CPU 使用率"highestCpuUsage": -1,// LOAD"highestSystemLoad": -1,// 線程數(shù)"maxThread": -1,// 入口 QPS"qps": -1}
]
授權(quán)規(guī)則
[{// 資源名"resource": "sentinel_spring_web_context",// 流控應(yīng)用"limitApp": "/test",// 授權(quán)類型(0代表白名單;1代表黑名單。)"strategy": 0}
]