Java之springcloud Sentinel案例講解
一、Sentinel是什么?
Sentinel (分布式系統(tǒng)的流量防衛(wèi)兵) 是阿里開源的一套用于服務容錯的綜合性解決方案。
它以流量為切入點,從流量控制、熔斷降級、系統(tǒng)負載保護等多個維度來保護服務的穩(wěn)定性。
二、使用步驟
1.下載地址
下載地址:https://github.com/alibaba/Sentinel/releases
java -jar sentinel-dashboard-1.7.0.jar
訪問:http://localhost:8080
用戶名密碼:sentinel/sentinel
2.導入依賴
<!--服務容錯 每一個服務 都引入 sentinel 客戶端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
3.添加配置
#spring:
# cloud:
sentinel:
transport:
port: 8081 #跟控制臺交流的端口,隨意指定一個未使用的端口即可
dashboard: localhost:8080 # 指定控制臺服務的地址
4.啟動jar

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

6 測試重復刷新后

該處使用的url網(wǎng)絡請求的數(shù)據(jù)。
三 容錯異常
FlowException)
降級
DegradeException)
參數(shù)熱點異常
ParamFlowException
系統(tǒng)
SystemBlockException
授權
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("進入。。。 MyUrlBlockHandler");
// 打印日志 R
log.error(e.getMessage(),e);
// 統(tǒng)一返回結果
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%的時間里,這20%時間叫做峰值時間。
公式:( 總PV數(shù) * 80% ) / ( 每天秒數(shù) * 20% ) = 峰值時間每秒請求數(shù)(QPS) 。
PV(page view)即頁面瀏覽量,通常是衡量一個網(wǎng)絡新聞頻道或網(wǎng)站甚至一條網(wǎng)絡新聞的主要指標。網(wǎng)頁瀏覽數(shù)是評價網(wǎng)站流量最常用的指標之一,簡稱為PV。
機器:峰值時間每秒QPS / 單臺機器的QPS = 需要的機器 。
每天300w PV 的在單臺機器上,這臺機器需要多少Q(mào)PS?
( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)。
一般需要達到139QPS,因為是峰值。(200萬pv才有100峰值qps)
二:TPS
TPS:Transactions Per Second(每秒傳輸?shù)氖挛锾幚韨€數(shù)),即服務器每秒處理的事務數(shù)。
TPS包括一條消息入和一條消息出,加上一次用戶數(shù)據(jù)庫訪問。(業(yè)務TPS = CAPS × 每個呼叫平均TPS)
一個事務是指一個客戶機向服務器發(fā)送請求然后服務器做出反應的過程??蛻魴C在發(fā)送請求時開始計時,收到服務器響應后結束計時,以此來計算使用的時間和完成的事務個數(shù)。
一般的,評價系統(tǒng)性能均以每秒鐘完成的技術交易的數(shù)量來衡量。系統(tǒng)整體處理能力取決于處理能力最低模塊的TPS值。
三:RT(Response-time)
響應時間是指:系統(tǒng)對請求作出響應的時間(一次請求耗時)。
響應時間:執(zhí)行一個請求從開始到最后收到響應數(shù)據(jù)所花費的總體時間,即從客戶端發(fā)起請求到收到服務器響應結果的時間。響應時間RT(Response-time),是一個系統(tǒng)最重要的指標之一,它的數(shù)值大小直接反應了系統(tǒng)的快慢。
四:Load(系統(tǒng)負載)
Linux的Load(系統(tǒng)負載),是一個讓新手不太容易了解的概念。load的就是一定時間內(nèi)計算機有多少個active_tasks,也就是說是計算機的任務執(zhí)行隊列的長度,cpu計算的隊列。
top/uptime等工具默認會顯示1分鐘、5分鐘、15分鐘的平均Load。
具體來說,平均Load是指,在特定的一段時間內(nèi)統(tǒng)計的正在CPU中運行的(R狀態(tài))、正在等待CPU運行的、處于不可中斷睡眠的(D狀態(tài))的任務數(shù)量的平均值。
最后,說一下CPU使用率和Load的關系吧。如果主要是CPU密集型的程序在運行(If CPU utilization is near 100 percent (user + nice + system), the workload sampled is CPU-bound.),
那么CPU利用率高,Load一般也會比較高。而I/O密集型的程序在運行,
可能看到CPU的%user, %system都不高,%iowait可能會有點高,這時的Load通常比較高。
同理,程序讀寫慢速I/O設備(如磁盤、NFS)比較多時,Load可能會比較高,而CPU利用率不一定高。這種情況,還經(jīng)常發(fā)生在系統(tǒng)內(nèi)存不足并開始使用swap的時候,Load一般會比較高,而CPU使用率并不高。
五:PV
頁面訪問次數(shù):Page View
六:UV
訪客數(shù)(去重復):Unique Visitor
七:帶寬
帶寬(bps)=總流量數(shù)(bit)/產(chǎn)生流量的時長(秒)=(PV頁面平均大小8)/統(tǒng)計時間(秒)
說明:公式中的 8 指的是將 Byte 轉換為 bit,即 8b/B,因為帶寬的單位是 bps(比特率),即bit per second,每秒二進制位數(shù),而容量單位一般使用 Byte。
假設某站點的日均 PV 是 10w,頁面平均大小 0.4 M,那么其平均帶寬需求是:
平均帶寬 = (10w * 0.4M * 8) / (60 * 60 * 24)= 3.7 Mbps
以上計算的僅僅是平均帶寬,我們在進行容量預估時需要的是峰值帶寬,即必須要保證站點在峰值流量時能夠正常運轉。假設,峰值流量是平均流量的5倍,這個5倍稱為峰值因 子。按照這個計算,實際需要的帶寬大約在3.7 Mbps * 5=18.5 Mbps 。
帶寬需求 = 平均帶寬 * 峰值因子
八:并發(fā)連接數(shù)
并發(fā)數(shù)是指系統(tǒng)同時能處理的請求數(shù)量,這個也是反應了系統(tǒng)的負載能力。
總結
| 功能 | Sentinel | Hystrix | resilience4j |
|---|---|---|---|
| 隔離策略 | 信號量隔離(并發(fā)線程數(shù)限流) | 線程池隔離/信號量隔離 | 信號量隔離 |
| 熔斷降級策略 | 基于響應時間、異常比率、異常數(shù) | 基于異常比率 | 基于異常比率、響應時間 |
| 實時統(tǒng)計實現(xiàn) | 滑動窗口(LeapArray) | 滑動窗口 | (基于 RxJava) |
| 動態(tài)規(guī)則配置 | 支持多種數(shù)據(jù)源 | 支持多種數(shù)據(jù)源 | 有限支持 |
| 擴展性 | 多個擴展點 | 插件的形式 | 接口的形式 |
| 基于注解的支持 | 支持 | 支持 | 支持 |
| 限流 | 基于 QPS,支持基于調用關系的限流 | 有限的支持 | Rate Limiter |
| 流量整形 | 支持預熱模式、勻速器模式、預熱排隊模式(流量規(guī)則處可配置) | 不支持 | 簡單的 Rate Limiter 模式 |
| 系統(tǒng)自適應保護 | 支持 | 不支持 | 不支持 |
| 控制臺 | 提供開箱即用的控制臺,可配置規(guī)則、查看秒級監(jiān)控、機器發(fā)現(xiàn)等 | 簡單的監(jiān)控查看 | 不提供控制臺,可對接其它監(jiān)控系統(tǒng) |
到此這篇關于Java之springcloud Sentinel案例講解的文章就介紹到這了,更多相關Java之springcloud Sentinel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析
這篇文章主要介紹了Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
java集合類ArrayList和Vector的區(qū)別面試精講
這篇文章主要為大家介紹了java集合類ArrayList和Vector的區(qū)別面試全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
Java的函數(shù)式接口@FunctionalInterface的使用說明
這篇文章主要介紹了Java的函數(shù)式接口@FunctionalInterface的使用說明,我們常用的一些接口Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解,需要的朋友可以參考下2024-01-01
SpringBoot實現(xiàn)Excel文件批量上傳導入數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)Excel文件批量上傳導入數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
關于Java實體類Serializable序列化接口的作用和必要性解析
序列化是將對象狀態(tài)轉化為可保持或者傳輸?shù)母袷竭^程,與序列化相反的是反序列化,完成序列化和反序列化,可以存儲或傳輸數(shù)據(jù),一般情況下,在定義實體類時會使用Serializable,需要的朋友可以參考下2023-05-05

