微服務——服務保護Sentinel

雪崩問題

在單體項目里面,如果某一個模塊出問題會導致整個項目都有問題。

在微服務項目里面,單獨一個服務出問題理論上是不會影響別的服務的。?但是如果有別的業務需要調用這一個模塊的話還是會有問題。??

問題產生原因和解決思路

最初那只是一個小小的故障。后來隨著調用的服務越來越多,然后等待時消耗完了系統資源,然后就集體蹦了。

解決方案

高并發引發的問題可以通過限流解決.

請求限流用于避免服務故障。

線程隔離用于避免故障擴散.限制了線程數之后這個服務就不會因為調用別的服務導致自身資源消耗殆盡。

?為了防止線程資源一直被占用,這里還要做一個服務熔斷,讓出線程給別的服務。

發生熔斷時直接走提前編寫的fallback邏輯。這個就是服務降級。舍棄一部分保證整個微服務群的健康。

技術實現

Sentinel

初識sentinel

可以在控制臺去配置限流規則,熔斷規則等等。

Sentinel 的使用可以分為兩個部分:

  • 核心庫(Jar包):不依賴任何框架/庫,能夠運行于 Java 8 及以上的版本的運行時環境,同時對 Dubbo / Spring Cloud 等框架也有較好的支持。在項目中引入依賴即可實現服務限流、隔離、熔斷等功能。

  • 控制臺(Dashboard):Dashboard 主要負責管理推送規則、監控、管理機器信息等。

?利用給好的jar包,在命令行用如下命令啟動

java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

訪問http://localhost:8090頁面,就可以看到sentinel的控制臺了:

需要輸入賬號和密碼,默認都是:sentinel

登錄后,即可看到控制臺,默認會監控sentinel-dashboard服務本身:

?

微服務整合

訪問一次之后,就可以順利被監控了。?

docker部署

拉取鏡像

docker pull docker.io/bladex/sentinel-dashboard

創建容器

docker run --name sentinel -d -p 8858:8858 -d 鏡像id

然后剩下的就是改改ip+端口,都是和上面一樣的使用方法。

這個東西應該就是讓微服務自己把自己的狀況快照發送到sentinel,然后由sentinel根據定義的規則決定是否限流熔斷等等。不是由sentinel主動發起監控,不然云服務器里面的sentinel怎么可能監控的到我本地的運行項目。

tmd,搞錯了。這個玩意沒辦法從云端監控我的本地項目,只有第一次是本地項目主動發起的。剩下的都是要由sentinel發起監控.

請求限流

快速入門

可以看見,設置每秒一條之后,多出的請求會被sentinel攔截。?

添加一個每秒10的閾值之后使用jmeter進行50條線程2s內跑完的任務進行壓力測試。

結果無誤,2s內只有20條請求正常響應,剩下的全都被異常處理了。

流控模式

關聯?

關聯模式:這個模式是在某兩個業務差不多同時發生時,通過限流其中一個業務的方式為另一個業務讓行。?

?然后給query加流控規則,當update1s超過5個請求時對query限流。

jmeter測試,1000個線程100s執行完,也就是每秒10個請求.? 可以的看見query被限流了。

鏈路

sentinel默認只會監控controller的資源,所以要用到sentinel的注解。

?鏈路模式中,是對不同來源的兩個鏈路做監控。但是sentinel默認會給進入SpringMVC的所有請求設置同一個root資源,會導致鏈路模式失效。

?重新配置之后可以看見,service層的資源也被監控了。為其中一個goods設置流控。

流控效果

warm up

使用jmeter進行200個線程20s的壓測,初始時成功的只有3個,說明初始閾值就是3,20s里后面每一秒內能通過的線程數也是組件上升。

排隊等待

?

使用jemter進行300個線程20s執行完的壓測,qps是15.可以看見,后面大多數請求的響應時間都是接近5s了。這里起到了一個流量整形的作用。

熱點參限流

?只有那些通過@SentinelResource注解配置的資源才有效。

?所以要現在controller的資源上面添加注解。

重啟后可以看見hot的簇點鏈路。

?在左側的熱點規則那里進行配置才會有高級選項.然后如下配置

使用jmeter發起3個500線程100s的請求,分別對應三種參數,qps為5.

然后結果如下,jmeter中101的是每秒2個成功,102是每秒4個,103是全部。

隔離和降級

FeginClient整合Sentinel

例如在查詢訂單的時候,會發起遠程調用去查詢用戶信息。這里就可以編寫調用失敗后的降級邏輯。

?這里啟動時會有一個循環依賴的錯誤。

這里要在order-service服務里面自動注入UserClient時加上@Lazy注解。

或者是在啟動類里添加@ComponentScan來掃描feign的包.兩個方法都可以

    @Autowired@Lazyprivate UserClient userClient;

這里運行時也還是會有循環依賴的報錯.要將父工程里面的springcloud版本號改成SR8。這次才是真正解決問題.加上@Lazy只是延遲問題發生的時機。

這次在service層的hot下終于可以看見利用feign發起遠程調用的接口了。

?

線程隔離(艙壁模式)

低扇出就是這個服務需要調用的服務較少。

線程池的做法是會開啟獨立線程的,而信號量的做法則不會。

?

在jmeter中開啟10個線程要求0s內完成。理論上是由8個線程會被拒絕的.

但是因為前面做了降級處理,會返回一個空對象而不是報錯所以在控制臺才可以看見報錯的日志信息。不多不少,正好8個.?

?

熔斷降級

下面是sentinel斷路器的三個狀態和狀態之間的切換。需要配置的兩個重要參數有,熔斷持續時間和熔斷的閾值。

慢調用??

?

發生熔斷之后成功阻塞了這個接口。?

異常比例、異常數
?

?

授權規則

?

測試,然后嘗試直接訪問order-service時就會報錯.

然后通過gateway網關訪問就可以正常訪問

自定義異常結果

修改返回的限流異常為授權攔截.

通過實現下面的接口將所有不同類型的異常分別處理。

?

@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {String msg = "未知異常";int status = 429;if (e instanceof FlowException) {msg = "請求被限流了";} else if (e instanceof ParamFlowException) {msg = "請求被熱點參數限流";} else if (e instanceof DegradeException) {msg = "請求被降級了";} else if (e instanceof AuthorityException) {msg = "沒有權限訪問";status = 401;}response.setContentType("application/json;charset=utf-8");response.setStatus(status);response.getWriter().println("{\"msg\": " + msg + ", \"status\": " + status + "}");}
}

規則持久化

sentinel把規則保存在內存里,重啟就會自動丟失。

規則管理模式

實現push模式

一、修改order-service服務

1.引入依賴

在order-service中引入sentinel監聽nacos的依賴:

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2.配置nacos地址

在order-service中的application.yml文件配置nacos地址及監聽的配置信息:

spring:cloud:sentinel:datasource:flow:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-flow-rulesgroupId: SENTINEL_GROUPrule-type: flow # 還可以是:degrade、authority、param-flow

flow是持久化的,defrade是降級的

二、修改sentinel-dashboard源碼

SentinelDashboard默認不支持nacos的持久化,需要修改源碼。

tmd,看著教程巨幾把麻煩,以后用服務器廠商提供的應該也不用我來搞這些,就不做了,以后有需求再來看吧.

可以看見最后實現效果如下,在指定頁面添加的規則就會自動持久化到nacos.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212791.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

k8s之高級調度

1. CronJob 在 k8s 中周期性運行計劃任務&#xff0c;與 linux 中的 crontab 相同 注意點&#xff1a;CronJob 執行的時間是 controller-manager 的時間&#xff0c;所以一定要確保 controller-manager 時間是準確的&#xff0c;另外 cronjobapiVersion: batch/v1 kind: CronJ…

ChatGPT 應用開發(一)ChatGPT OpenAI API 免代理調用方式(通過 Cloudflare 的 AI Gateway)

前言 開發 ChatGPT 應用&#xff0c;我覺得最前置的點就是能使用 ChatGPT API 接口。首先我自己要能成功訪問&#xff0c;這沒問題&#xff0c;會魔法就可以本地調用。 那用戶如何調用到我的應用 API 呢&#xff0c;我的理解是通過用戶能訪問到的中轉服務器向 OpenAI 發起訪問…

成都工業學院Web技術基礎(WEB)實驗四:CSS3布局應用

寫在前面 1、基于2022級計算機大類實驗指導書 2、代碼僅提供參考&#xff0c;前端變化比較大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一樣 3、圖片和文字僅為示例&#xff0c;需要自行替換 4、如果代碼不滿足你的要求&#xff0c;請尋求其他的…

Echarts 環形圖配置 環形半徑(radius) 修改文本位置(label) 南丁格爾圖(roseType)

數據 const data [{ name: 華為, value: 404 },{ name: 小米, value: 800 }, { name: 紅米, value: 540 }, { name: 蘋果, value: 157 }]設置南丁格爾圖 roseType: area設置標簽位置 label: {show: true,position: center // center 中間展示 outside 外側展示 inside 內側…

C語言動態內存經典筆試題分析

C語言動態內存經典筆試題分析 文章目錄 C語言動態內存經典筆試題分析1. 題目一2. 題目二3. 題目三4. 題目四 1. 題目一 void GetMemory(char *p){p (char *)malloc(100);} void Test(void){char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str)…

Qt設置類似于qq登錄頁面

頭文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QWindow> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton>QT_BEGIN_NAMESPACE namespace Ui { class…

中國移動公網IP申請過程

一、動機 由于從事互聯網行業10年&#xff0c;一直從事移動端&#xff08;前端&#xff09;開發工作&#xff0c;未曾深入了解過后端技術&#xff0c;以至于工作10年也不算進入互聯網的門。 所以準備在自己家用設備上搭建各種場景的服務器&#xff08;云服務對個人來說成本偏…

數據分析基礎之《numpy(2)—ndarray屬性》

一、ndarray的屬性 1、屬性方法 屬性名字屬性解釋ndarray.shape數組維度的元組&#xff08;形狀&#xff09;ndarray.ndim數組維數ndarray.size數組中的元素數量ndarray.itemsize一個數組元素的長度&#xff08;字節&#xff09;ndarray.dtype數組元素的類型使用方法 數組名.…

大數據技術8:StarRocks極速全場景MPP數據庫

前言&#xff1a;StarRocks原名DorisDB&#xff0c;是新一代極速全場景MPP數據庫。StarRocks 是 Apache Doris 的 Fork 版本。StarRocks 連接的多種源。一是通過這個 CDC 或者說通過這個 ETL 的方式去灌到這個 StarRocks 里面&#xff1b;二是還可以去直接的和這些老的 kafka 或…

阿里云服務器跨域問題解決方案

首先看一下原始代碼&#xff1a; Bean public CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration new CorsConfiguration();corsConfiguration.addAllowedOrigin("http://…

spark rdd和dataframe的區別,結合底層邏輯

在 Apache Spark 中&#xff0c;RDD&#xff08;Resilient Distributed Dataset&#xff09;和 DataFrame 是處理數據的兩種不同的抽象。 RDD (Resilient Distributed Dataset) 底層實現&#xff1a; RDD 是 Spark 最初的數據抽象&#xff0c;表示一個分布式的、不可變的數據集…

03-詳解Nacos注冊中心的配置步驟和功能

Nacos注冊中心 服務注冊到Nacos Nacos是SpringCloudAlibaba的組件也遵循SpringCloud中定義的服務注冊和服務發現規范,因此使用Nacos與使用Eureka對于微服務來說并沒有太大區別 主要差異就是依賴不同,服務地址不同 第一步: 在父工程cloud-demo模塊的pom.xml文件中引入Spring…

nlkt中BigramAssocMeasures.pmi()方法的傳參和使用

這個問題找遍全網沒看到詳細的介紹&#xff0c;最后用讀代碼數學公式的方法才理解怎么用。 BigramAssocMeasures.pmi 作用&#xff1a;計算x和y的互信息&#xff08;互信息是什么我就不科普啦&#xff09; 這里有個誤區剛開始我以為是計算兩個詞之間的依賴程度&#xff0c;但…

flstudio21.3.2304高級版水果編曲音樂軟件

flstudio高級版是一款適用于廣泛領域的音頻編輯軟件。它支持多通道混音器和VST插件&#xff0c;包括數百種樂器和效果插件。它還為您提供了一個樂譜編輯器&#xff0c;需要對不同樂器的節奏進行必要的編輯。Flstudio具有許多內置電子合成聲音&#xff0c;可提供更廣泛的電子聲音…

自動駕駛的汽車構造

1、傳動系統 連接發動機和驅動車輪之間的動力傳動裝置&#xff0c;分為傳統動力傳動、純電動力傳動、混合動力傳動 傳動系統中幾個重要的部件 1&#xff09;離合器 直接與發動機相連的部件&#xff0c;通過摩擦、液體介質、磁力傳遞扭矩 作用&#xff1a; 保證平穩起步&a…

【Spring教程25】Spring框架實戰:從零開始學習SpringMVC 之 SpringMVC入門案例總結與SpringMVC工作流程分析

目錄 1.入門案例總結2. 入門案例工作流程分析2.1 啟動服務器初始化過程2.2 單次請求過程 歡迎大家回到《Java教程之Spring30天快速入門》&#xff0c;本教程所有示例均基于Maven實現&#xff0c;如果您對Maven還很陌生&#xff0c;請移步本人的博文《如何在windows11下安裝Mave…

Spring 面向切面編程(AOP)

一、aop介紹 &#xff08;一&#xff09;前言 一般的后端開發流程是縱向開發&#xff0c;就是controller&#xff08;控制層&#xff09;->service&#xff08;業務層&#xff09;->mapper&#xff08;數據持久層&#xff09;&#xff0c;Spring采用動態代理技術可以在…

Wireshark添加自定義協議解析

最終效果如下&#xff1a; 參考文檔&#xff1a;https://mika-s.github.io/topics/ 此參考文檔中7個例子教我們如何編寫lua腳本去識別我們自定義的協議 安裝Wireshark https://www.wireshark.org/上下載安裝包安裝即可。我的安裝路徑是D:\Install\Wireshark&#xff0c;在W…

Leetcode—389.找不同【簡單】

2023每日刷題&#xff08;五十五&#xff09; Leetcode—389.找不同 實現代碼 char findTheDifference(char* s, char* t) {int len strlen(s);int len2 len 1;int a[26] {0};int b[26] {0};if(len 0) {return t[0];}for(int i 0; i < len; i) {int idx s[i] - a;…

HTML的img常見應用屬性

1、src&#xff1a;指定圖像的URL&#xff0c;即圖像的路徑。 2、alt&#xff1a;指定圖像的替代文本&#xff0c;當圖像無法顯示時&#xff0c;會顯示替代文本。 3、width&#xff1a;指定圖像的寬度&#xff0c;可以使用像素值或百分比。 4、height&#xff1a;指定圖像的…