摘要:有沒有那么一個框架能夠把熔斷跟限流都給做了,以前沒有,但是現(xiàn)在有了,我這屬于自問自答哈這個框架就是阿里最新開源的。后來我才發(fā)現(xiàn)我錯了,大錯特錯,這是一個新的框架,潛力實力阿里開源。
前言
在 Spring Cloud 體系中,熔斷降級我們會使用 Hystrix 框架,限流通常會在 Zuul 中進行處理,Zuul 中沒有自帶限流的功能,我們可以自己做限流或者集成第三方開源的限流框架。最新一代的網(wǎng)關(guān) Spring Cloud Gateway 則自帶了限流的功能。
有沒有那么一個框架能夠把熔斷跟限流都給做了,以前沒有,但是現(xiàn)在有了,我這屬于自問自答哈!這個框架就是阿里最新開源的 Sentinel。
第一眼見到 Sentinel 有一種很熟悉的感覺,似曾相識啊!Redis 里面集群的那個哨兵模式不就是 Sentinel 嘛。后來我才發(fā)現(xiàn)我錯了,大錯特錯,這是一個新的框架,潛力 + 實力 = 阿里開源。
Sentinel 是什么?本段介紹來源于Sentinel Github主頁介紹
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統(tǒng)負載保護等多個維度保護服務(wù)的穩(wěn)定性。
Sentinel 具有以下特征:
豐富的應(yīng)用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應(yīng)用等。
完備的實時監(jiān)控:Sentinel 同時提供實時的監(jiān)控功能。您可以在控制臺中看到接入應(yīng)用的單臺機器秒級數(shù)據(jù),甚至 500 臺以下規(guī)模的集群的匯總運行情況。
廣泛的開源生態(tài):Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應(yīng)的依賴并進行簡單的配置即可快速地接入 Sentinel。
完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現(xiàn)擴展接口來快速地定制邏輯。例如定制規(guī)則管理、適配動態(tài)數(shù)據(jù)源等。
Sentinel 的主要特性:
Sentinel 的開源生態(tài):
初次見面的我們先來簡單的體驗下 Sentinel 吧,在你的Maven項目中增加 Sentinel 的依賴:
com.alibaba.csp sentinel-core 1.4.1
Sentinel中需要限流的稱之為資源,對資源進行處理,下面來看最簡單的一段代碼:
public static void main(String[] args) { initFlowRules(); 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(); } } } } private static void initFlowRules(){ Listrules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("HelloWorld"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // Set limit QPS to 20. rule.setCount(20); rules.add(rule); FlowRuleManager.loadRules(rules); }
第一行中初始化限流的規(guī)則,創(chuàng)建了一個資源叫 HelloWorld,設(shè)置了這個資源的QPS 為 20。
在業(yè)務(wù)開始前使用SphU.entry();方法標識開始,結(jié)束使用entry.exit();,如果觸發(fā)了流控邏輯就會拋出BlockException異常讓用戶自行處理。
代碼運行之后,我們可以在日志 ~/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:通過的請求,
block:被阻止的請求
s:成功執(zhí)行完成的請求個數(shù)
e:用戶自定義的異常
rt:平均響應(yīng)時長。
我是Mac系統(tǒng),日志是在這個目錄下,Windows我沒試過,應(yīng)該也在用戶的主目錄下
上面這個列子是官方的示列,如果你覺得沒有看到你想要的效果,因為一直在循環(huán),也不知道有沒有限流成功,我們可以稍微改動一下進行測試就知道了。
將while循環(huán)改成for循環(huán), 次數(shù)為10000次,只輸出一句話,不做任何限制,執(zhí)行完成的時間大概在40毫秒左右。
long startTime = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { System.out.println("hello world"); } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime);
下面加上限流的邏輯,執(zhí)行完成的時間基本上就超過100毫秒了,可見限流起了作用。
for (int i = 0; i < 10000; i++) { Entry entry = null; try { entry = SphU.entry("HelloWorld"); // 資源中的邏輯. System.out.println("hello world"); } catch (BlockException e1) { System.out.println("blocked!"); } finally { if (entry != null) { entry.exit(); } } } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime);歡迎加入我的知識星球,一起交流技術(shù),免費學(xué)習(xí)猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領(lǐng)下組隊學(xué)習(xí)Sentinel,等你哦!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73518.html
摘要:以流量為切入點,從流量控制熔斷降級系統(tǒng)負載保護等多個維度保護服務(wù)的穩(wěn)定性分布式系統(tǒng)的流量防衛(wèi)兵。歡迎關(guān)注我們獲得更多的好玩實踐 之前分享過 一篇 《Spring Cloud Gateway 原生的接口限流該怎么玩》, 核心是依賴Spring Cloud Gateway 默認提供的限流過濾器來實現(xiàn) 原生RequestRateLimiter 的不足 配置方式 spring: clou...
摘要:以流量為切入點,從流量控制熔斷降級系統(tǒng)負載保護等多個維度保護服務(wù)的穩(wěn)定性分布式系統(tǒng)的流量防衛(wèi)兵。歡迎關(guān)注我們獲得更多的好玩實踐 之前分享過 一篇 《Spring Cloud Gateway 原生的接口限流該怎么玩》, 核心是依賴Spring Cloud Gateway 默認提供的限流過濾器來實現(xiàn) 原生RequestRateLimiter 的不足 配置方式 spring: clou...
摘要:但是比較可惜的是已經(jīng)宣布對停止更新。客戶端整合每個微服務(wù)客戶端都需要整合的客戶端封裝與配置,才能將監(jiān)控信息上報給展示以及實時的更改限流或熔斷規(guī)則等。下面我們就分兩部分來看看,如何使用來實現(xiàn)接口限流。 最近管點閑事浪費了不少時間,感謝網(wǎng)友libinwalan的留言提醒。及時糾正路線,繼續(xù)跟大家一起學(xué)習(xí)Spring Cloud Alibaba。 Nacos作為注冊中心和配置中心的基礎(chǔ)教程,...
摘要:現(xiàn)狀分布式場景中。因此要對在原服務(wù)不可用時進行熔斷降級處理。分析熔斷降級可以服務(wù)端限流網(wǎng)關(guān)限流客戶端限流。它提供兩種資源隔離的模式信號量隔離和線程池隔離。支持流控熔斷降級系統(tǒng)保護等。它支持并發(fā)數(shù)的流量控制也支持熔斷降級。 現(xiàn)狀 分布式場景中。若服務(wù)不穩(wěn)定,會導(dǎo)致調(diào)用方服務(wù)也不可用,從而造成雪崩效應(yīng)。因此要對在原服務(wù)不可用時進行熔斷降級處理。 分析 熔斷降級可以服務(wù)端限流、網(wǎng)關(guān)限流、客戶...
閱讀 3197·2021-11-25 09:43
閱讀 3407·2021-11-11 16:54
閱讀 822·2021-11-02 14:42
閱讀 3740·2021-09-30 09:58
閱讀 3664·2021-09-29 09:44
閱讀 1279·2019-08-30 15:56
閱讀 2097·2019-08-30 15:54
閱讀 2985·2019-08-30 15:43