gateway sentinel 熔断 不起作用_《一起学sentinel》一
《一起學(xué)sentinel》一、一起搭建sentinel服務(wù)
一、概述
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。
Sentinel 具有以下特征(來自官網(wǎng)概述):
- 豐富的應(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 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應(yīng)的依賴并進(jìn)行簡單的配置即可快速地接入 Sentinel。
- 完善的 SPI 擴(kuò)展點(diǎn):Sentinel 提供簡單易用、完善的 SPI 擴(kuò)展接口。您可以通過實(shí)現(xiàn)擴(kuò)展接口來快速地定制邏輯。例如定制規(guī)則管理、適配動(dòng)態(tài)數(shù)據(jù)源等。
Sentinel 的主要特性:
Sentinel 分為兩個(gè)部分:
- 核心庫(Java 客戶端)不依賴任何框架/庫,能夠運(yùn)行于所有 Java 運(yùn)行時(shí)環(huán)境,同時(shí)對(duì) Dubbo / Spring Cloud 等框架也有較好的支持。
- 控制臺(tái)(Dashboard)基于 Spring Boot 開發(fā),打包后可以直接運(yùn)行,不需要額外的 Tomcat 等應(yīng)用容器。
二、概念簡述
1.核心術(shù)語
- Resource
資源,特指需要限流的內(nèi)容或?qū)ο?ul> - 具體實(shí)現(xiàn)為com.alibaba.csp.sentinel.slotchain.ResourceWrapper
//資源:
protected final String name;//資源名稱
?
protected final EntryType entryType;//是入口流量還是出口流量
?
protected final int resourceType;//資源控制類型
/**
public static final int COMMON = 0;
public static final int COMMON_WEB = 1;
public static final int COMMON_RPC = 2;
public static final int COMMON_API_GATEWAY = 3;
public static final int COMMON_DB_SQL = 4;
*/
//實(shí)例
//com.alibaba.csp.sentinel.slotchain.MethodResourceWrapper 方法資源包裝器
//com.alibaba.csp.sentinel.slotchain.StringResourceWrapper 字符串資源包裝器
- context
上下文,特指一個(gè)線程中的上下文,保存當(dāng)前調(diào)用的元數(shù)據(jù)
//包含以下元素
?
Node //Entry的統(tǒng)計(jì)
?
private final String name;//上下文名稱
?
private DefaultNode entranceNode;//當(dāng)前調(diào)用樹的跟節(jié)點(diǎn)
?
private Entry curEntry;//當(dāng)前調(diào)用節(jié)點(diǎn)
?
private String origin = "";//作為調(diào)用者或者觸發(fā)點(diǎn),分別控制不同的調(diào)用者或者觸發(fā)點(diǎn)
?
private final boolean async; - entry
入口,作為上下文中的鏈接項(xiàng)- 具體實(shí)現(xiàn)為com.alibaba.csp.sentinel.CtEntry
//鏈接上下鏈路
protected Entry parent = null;//父節(jié)點(diǎn)
protected Entry child = null;//子節(jié)點(diǎn)
protected ProcessorSlot<Object> chain;//核心插槽,后面會(huì)詳細(xì)講解
protected Context context;//鏈路上下文
- node
節(jié)點(diǎn)是用來保存某個(gè)資源的各種實(shí)時(shí)統(tǒng)計(jì)信息的,他是一個(gè)接口,通過訪問節(jié)點(diǎn),就可以獲取到對(duì)應(yīng)資源的實(shí)時(shí)狀態(tài),以此為依據(jù)進(jìn)行限流和降級(jí)操作 - FlowRule
- com.alibaba.csp.sentinel.slots.block.flow.FlowRule可以理解為限流規(guī)則
grade //代表示流控制的閥值類型,比如QPS或線程數(shù)
?
private int strategy = RuleConstant.STRATEGY_DIRECT;
//調(diào)用關(guān)系的策略
//STRATEGY_DIRECT 用于直接流量控制(by origin);
//STRATEGY_RELATE 用于相關(guān)流量控制(with relevant resource);
//STRATEGY_CHAIN 用于鏈?zhǔn)搅髁靠刂?by entrance resource).
?
controlBehavior//表示QPS成形行為(當(dāng)QPS超過閾值時(shí)對(duì)傳入請(qǐng)求的操作)。
?
- com.alibaba.csp.sentinel.slots.block.flow.FlowRule可以理解為限流規(guī)則
三、快速入手
1.1 公網(wǎng) Demo
如果希望最快的了解 Sentinel 在做什么,我們可以通過 Sentinel 新手指南 來運(yùn)行一個(gè)例子,并且能在云上控制臺(tái)上看到最直觀的監(jiān)控和流控效果等。
1.2 手動(dòng)接入 Sentinel 以及控制臺(tái)
下面的例子將展示應(yīng)用如何三步接入 Sentinel。同時(shí),Sentinel 也提供所見即所得的控制臺(tái),可以實(shí)時(shí)監(jiān)控資源以及管理規(guī)則。
STEP 1. 在應(yīng)用中引入Sentinel Jar包
如果應(yīng)用使用 pom 工程,則在 pom.xml 文件中加入以下代碼即可:
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.7.2</version>(最新的穩(wěn)定版本) </dependency>注意: 從 Sentinel 1.5.0 開始僅支持 JDK 1.7 或者以上版本。Sentinel 1.5.0 之前的版本最低支持 JDK 1.6。如果您未使用依賴管理工具,請(qǐng)到 Maven Center Repository 直接下載 JAR 包。
STEP 2. 定義資源
接下來,我們把需要控制流量的代碼用 Sentinel API SphU.entry("HelloWorld") 和 entry.exit() 包圍起來即可。在下面的例子中,我們將 System.out.println("hello world"); 這端代碼作為資源,用 API 包圍起來(埋點(diǎn))。參考代碼如下:
//第一種方式SphU.entry public static void main(String[] args) {initFlowRules();//(規(guī)則)while (true) {Entry entry = null;try {entry = SphU.entry("HelloWorld");/*您的業(yè)務(wù)邏輯 - 開始*/System.out.println("hello world");/*您的業(yè)務(wù)邏輯 - 結(jié)束*/} catch (BlockException e1) {/*流控邏輯處理 - 開始*/System.out.println("block!");/*流控邏輯處理 - 結(jié)束*/} finally {if (entry != null) {entry.exit();}}} } ? ? //第二種方式SphO.entry public static void main(String[] args) {initFlowRules();//(規(guī)則)while (true) {if (SphO.entry("HelloWorld")) {try {/*您的業(yè)務(wù)邏輯 - 開始*/System.out.println("hello world");/*您的業(yè)務(wù)邏輯 - 結(jié)束*/} finally {SphO.exit();}}else {/*流控邏輯處理 - 開始*/System.out.println("block!");/*流控邏輯處理 - 結(jié)束*/}} }- SphU.entry方式會(huì)拋出異常
- 如果沒有異常執(zhí)行正確邏輯
- 如果出現(xiàn)異常執(zhí)行限流和熔斷邏輯
- SphO.entry返回的是一個(gè)boolean值
- 如果true執(zhí)行正確邏輯
- 如果false執(zhí)行限流和熔斷邏輯
完成以上兩步后,代碼端的改造就完成了。當(dāng)然,也提供了 注解支持模塊,可以以低侵入性的方式定義資源。
STEP 3. 定義規(guī)則
接下來,通過規(guī)則來指定允許該資源通過的請(qǐng)求次數(shù),例如下面的代碼定義了資源 HelloWorld 每秒最多只能通過 20 個(gè)請(qǐng)求。
private static void initFlowRules(){List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource("HelloWorld");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 設(shè)置QPS限制為20。rule.setCount(20);rules.add(rule);FlowRuleManager.loadRules(rules); }完成上面 3 步,Sentinel 就能夠正常工作了。更多的信息可以參考 使用文檔。
STEP 4. 檢查效果
Demo 運(yùn)行之后,我們可以在日志 ~/logs/csp/${appName}-metrics.log.xxx 里看到下面的輸出:
|--timestamp-|------date time----|-resource-|p |block|s |e|rt 1529998904000|2018-06-26 15:41:44|HelloWorld|20|0 |20|0|0 1529998905000|2018-06-26 15:41:45|HelloWorld|20|5579 |20|0|728 1529998906000|2018-06-26 15:41:46|HelloWorld|20|15698|20|0|0 1529998907000|2018-06-26 15:41:47|HelloWorld|20|19262|20|0|0 1529998908000|2018-06-26 15:41:48|HelloWorld|20|19502|20|0|0 1529998909000|2018-06-26 15:41:49|HelloWorld|20|18386|20|0|0其中 p 代表通過的請(qǐng)求, block 代表被阻止的請(qǐng)求, s 代表成功執(zhí)行完成的請(qǐng)求個(gè)數(shù), e 代表用戶自定義的異常, rt 代表平均響應(yīng)時(shí)長。
可以看到,這個(gè)程序每秒穩(wěn)定輸出 "hello world" 20 次,和規(guī)則中預(yù)先設(shè)定的閾值是一樣的。
更詳細(xì)的說明可以參考: 如何使用
更多的例子可以參考: Sentinel Examples
STEP 5. 啟動(dòng) Sentinel 控制臺(tái)
您可以參考 Sentinel 控制臺(tái)文檔 啟動(dòng)控制臺(tái),可以實(shí)時(shí)監(jiān)控各個(gè)資源的運(yùn)行情況,并且可以實(shí)時(shí)地修改限流規(guī)則。
總結(jié)
以上是生活随笔為你收集整理的gateway sentinel 熔断 不起作用_《一起学sentinel》一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 找不到匹配的key exchange算法
- 下一篇: 古时有“四时八节”之说猜猜以下哪个节气是