溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java之springcloud Sentinel的示例分析

發(fā)布時(shí)間:2021-08-10 12:00:28 來源:億速云 閱讀:125 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Java之springcloud Sentinel的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、Sentinel是什么?

Sentinel (分布式系統(tǒng)的流量防衛(wèi)兵) 是阿里開源的一套用于服務(wù)容錯(cuò)的綜合性解決方案。
它以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度來保護(hù)服務(wù)的穩(wěn)定性。

二、使用步驟

1.下載地址

下載地址:https://github.com/alibaba/Sentinel/releases
java -jar sentinel-dashboard-1.7.0.jar
訪問:http://localhost:8080
用戶名密碼:sentinel/sentinel

2.導(dǎo)入依賴

<!--服務(wù)容錯(cuò) 每一個(gè)服務(wù) 都引入 sentinel 客戶端-->																								
<dependency>																																							
    <groupId>com.alibaba.cloud</groupId>																																							
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>																																							
</dependency>																																							

3.添加配置

#spring:																																							
#  cloud:																																							
    sentinel:																																							
      transport:																																							
        port: 8081 #跟控制臺(tái)交流的端口,隨意指定一個(gè)未使用的端口即可																																							
        dashboard: localhost:8080 # 指定控制臺(tái)服務(wù)的地址																																							

4.啟動(dòng)jar

Java之springcloud Sentinel的示例分析

5 運(yùn)行接口后就才能被監(jiān)控,設(shè)置流控規(guī)則

Java之springcloud Sentinel的示例分析

6 測試重復(fù)刷新后

Java之springcloud Sentinel的示例分析

該處使用的url網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)。

三 容錯(cuò)異常

FlowException)

降級(jí)
DegradeException)
參數(shù)熱點(diǎn)異常
ParamFlowException
系統(tǒng)
SystemBlockException
授權(quán)
AuthorityException

自定義sentinel異常 BlockExceptionAspect

@Slf4j																																																				
@Component																																																				
public class BlockExceptionAspect  implements UrlBlockHandler {																																																				
																																																				
    @Override																																																				
    public void blocked(HttpServletRequest httpServletRequest,																																																				
                        HttpServletResponse httpServletResponse, BlockException e) throws IOException {																																																				
																																																				
																																																				
        System.out.println("進(jìn)入。。。 MyUrlBlockHandler");																																																				
        // 打印日志																																																				R
        log.error(e.getMessage(),e);																																																				
        // 統(tǒng)一返回結(jié)果																																																				
        R appResult = null;																																																				
        if (e instanceof FlowException) {																																																				
            appResult = new R(ResponseEnum.FLOW_BLOCK,null);																																																				
        } else if (e instanceof DegradeException) {																																																				
            appResult = new R(ResponseEnum.DEG_BLOCK,null);																																																				
        } else if (e instanceof ParamFlowException) {																																																				
            appResult = new R(ResponseEnum.DEG_BLOCK,null);																																																				
        } else if (e instanceof SystemBlockException) {																																																				
            appResult = new R(ResponseEnum.DEG_BLOCK,null);																																																				
        } else if (e instanceof AuthorityException) {																																																				
            appResult = new R(ResponseEnum.DEG_BLOCK,null);																																																				
        }																																																				
        httpServletResponse.setCharacterEncoding("utf-8");																																																				
        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);																																																				
																																																				
        httpServletResponse.getWriter().print(JSON.toJSONString(appResult));																																																				
																																																				
    }																																																				
}																																																				

一: QPS每秒查詢率(Query Per Second)
原理:每天80%的訪問集中在20%的時(shí)間里,這20%時(shí)間叫做峰值時(shí)間。

公式:( 總PV數(shù) * 80% ) / ( 每天秒數(shù) * 20% ) = 峰值時(shí)間每秒請(qǐng)求數(shù)(QPS) 。

PV(page view)即頁面瀏覽量,通常是衡量一個(gè)網(wǎng)絡(luò)新聞?lì)l道或網(wǎng)站甚至一條網(wǎng)絡(luò)新聞的主要指標(biāo)。網(wǎng)頁瀏覽數(shù)是評(píng)價(jià)網(wǎng)站流量最常用的指標(biāo)之一,簡稱為PV。

機(jī)器:峰值時(shí)間每秒QPS / 單臺(tái)機(jī)器的QPS = 需要的機(jī)器 。

每天300w PV 的在單臺(tái)機(jī)器上,這臺(tái)機(jī)器需要多少Q(mào)PS?

( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)。

一般需要達(dá)到139QPS,因?yàn)槭欠逯怠?200萬pv才有100峰值qps)

二:TPS
TPS:Transactions Per Second(每秒傳輸?shù)氖挛锾幚韨€(gè)數(shù)),即服務(wù)器每秒處理的事務(wù)數(shù)。

TPS包括一條消息入和一條消息出,加上一次用戶數(shù)據(jù)庫訪問。(業(yè)務(wù)TPS = CAPS × 每個(gè)呼叫平均TPS)

一個(gè)事務(wù)是指一個(gè)客戶機(jī)向服務(wù)器發(fā)送請(qǐng)求然后服務(wù)器做出反應(yīng)的過程??蛻魴C(jī)在發(fā)送請(qǐng)求時(shí)開始計(jì)時(shí),收到服務(wù)器響應(yīng)后結(jié)束計(jì)時(shí),以此來計(jì)算使用的時(shí)間和完成的事務(wù)個(gè)數(shù)。

一般的,評(píng)價(jià)系統(tǒng)性能均以每秒鐘完成的技術(shù)交易的數(shù)量來衡量。系統(tǒng)整體處理能力取決于處理能力最低模塊的TPS值。

三:RT(Response-time)
響應(yīng)時(shí)間是指:系統(tǒng)對(duì)請(qǐng)求作出響應(yīng)的時(shí)間(一次請(qǐng)求耗時(shí))。

響應(yīng)時(shí)間:執(zhí)行一個(gè)請(qǐng)求從開始到最后收到響應(yīng)數(shù)據(jù)所花費(fèi)的總體時(shí)間,即從客戶端發(fā)起請(qǐng)求到收到服務(wù)器響應(yīng)結(jié)果的時(shí)間。響應(yīng)時(shí)間RT(Response-time),是一個(gè)系統(tǒng)最重要的指標(biāo)之一,它的數(shù)值大小直接反應(yīng)了系統(tǒng)的快慢。

四:Load(系統(tǒng)負(fù)載)
Linux的Load(系統(tǒng)負(fù)載),是一個(gè)讓新手不太容易了解的概念。load的就是一定時(shí)間內(nèi)計(jì)算機(jī)有多少個(gè)active_tasks,也就是說是計(jì)算機(jī)的任務(wù)執(zhí)行隊(duì)列的長度,cpu計(jì)算的隊(duì)列。

top/uptime等工具默認(rèn)會(huì)顯示1分鐘、5分鐘、15分鐘的平均Load。

具體來說,平均Load是指,在特定的一段時(shí)間內(nèi)統(tǒng)計(jì)的正在CPU中運(yùn)行的(R狀態(tài))、正在等待CPU運(yùn)行的、處于不可中斷睡眠的(D狀態(tài))的任務(wù)數(shù)量的平均值。

最后,說一下CPU使用率和Load的關(guān)系吧。如果主要是CPU密集型的程序在運(yùn)行(If CPU utilization is near 100 percent (user + nice + system), the workload sampled is CPU-bound.),

那么CPU利用率高,Load一般也會(huì)比較高。而I/O密集型的程序在運(yùn)行,

可能看到CPU的%user, %system都不高,%iowait可能會(huì)有點(diǎn)高,這時(shí)的Load通常比較高。

同理,程序讀寫慢速I/O設(shè)備(如磁盤、NFS)比較多時(shí),Load可能會(huì)比較高,而CPU利用率不一定高。這種情況,還經(jīng)常發(fā)生在系統(tǒng)內(nèi)存不足并開始使用swap的時(shí)候,Load一般會(huì)比較高,而CPU使用率并不高。

五:PV
頁面訪問次數(shù):Page View

六:UV
訪客數(shù)(去重復(fù)):Unique Visitor

七:帶寬
帶寬(bps)=總流量數(shù)(bit)/產(chǎn)生流量的時(shí)長(秒)=(PV頁面平均大小8)/統(tǒng)計(jì)時(shí)間(秒)

說明:公式中的 8 指的是將 Byte 轉(zhuǎn)換為 bit,即 8b/B,因?yàn)閹挼膯挝皇?bps(比特率),即bit per second,每秒二進(jìn)制位數(shù),而容量單位一般使用 Byte。

假設(shè)某站點(diǎn)的日均 PV 是 10w,頁面平均大小 0.4 M,那么其平均帶寬需求是:

平均帶寬 = (10w * 0.4M * 8) / (60 * 60 * 24)= 3.7 Mbps

以上計(jì)算的僅僅是平均帶寬,我們?cè)谶M(jìn)行容量預(yù)估時(shí)需要的是峰值帶寬,即必須要保證站點(diǎn)在峰值流量時(shí)能夠正常運(yùn)轉(zhuǎn)。假設(shè),峰值流量是平均流量的5倍,這個(gè)5倍稱為峰值因 子。按照這個(gè)計(jì)算,實(shí)際需要的帶寬大約在3.7 Mbps * 5=18.5 Mbps 。

帶寬需求 = 平均帶寬 * 峰值因子

八:并發(fā)連接數(shù)
并發(fā)數(shù)是指系統(tǒng)同時(shí)能處理的請(qǐng)求數(shù)量,這個(gè)也是反應(yīng)了系統(tǒng)的負(fù)載能力。

總結(jié)

功能SentinelHystrixresilience4j
隔離策略信號(hào)量隔離(并發(fā)線程數(shù)限流)線程池隔離/信號(hào)量隔離信號(hào)量隔離
熔斷降級(jí)策略基于響應(yīng)時(shí)間、異常比率、異常數(shù)基于異常比率基于異常比率、響應(yīng)時(shí)間
實(shí)時(shí)統(tǒng)計(jì)實(shí)現(xiàn)滑動(dòng)窗口(LeapArray)滑動(dòng)窗口(基于 RxJava)
動(dòng)態(tài)規(guī)則配置支持多種數(shù)據(jù)源支持多種數(shù)據(jù)源有限支持
擴(kuò)展性多個(gè)擴(kuò)展點(diǎn)插件的形式接口的形式
基于注解的支持支持支持支持
限流基于 QPS,支持基于調(diào)用關(guān)系的限流有限的支持Rate Limiter
流量整形支持預(yù)熱模式、勻速器模式、預(yù)熱排隊(duì)模式(流量規(guī)則處可配置)不支持簡單的 Rate Limiter 模式
系統(tǒng)自適應(yīng)保護(hù)支持不支持不支持
控制臺(tái)提供開箱即用的控制臺(tái),可配置規(guī)則、查看秒級(jí)監(jiān)控、機(jī)器發(fā)現(xiàn)等簡單的監(jiān)控查看不提供控制臺(tái),可對(duì)接其它監(jiān)控系統(tǒng)

以上是“Java之springcloud Sentinel的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI