日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微服务流量卫兵 Sentinel

發(fā)布時間:2024/3/13 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微服务流量卫兵 Sentinel 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 定義概述

啥是流量,啥又是防衛(wèi)兵呢?

在分布式系統(tǒng)中,流量注定是越來越大的,在每一秒鐘都可能處理上百萬乃至千萬的請求,設(shè)想一下服務(wù)器宕掉,那對于用戶而言,體驗肯定是非常壞的;所以我們?yōu)榱吮WC 可用性,我們需要有一款流量控制工具,能夠幫助我們進(jìn)行操作。

1.1 sentinel

  • 阿里巴巴開源的分布式流量控制工具
  • 豐富的應(yīng)用場景:流量的削峰填谷、集群流量控制、實時熔斷下游不可應(yīng)用。
  • 具備可視化平臺,具備實時監(jiān)控功能

Github 學(xué)習(xí)文檔:Sentinel 文檔

在使用 Sentinel 之前,我們需要熟悉 其中的兩個內(nèi)容,也是它的核心概念

  • 資源:是Sentinel 的核心概念之一,可以是你程序中的任何內(nèi)容,也可以是某一個服務(wù)甚至小到一個方法,在 sentinel 中,它都是一個資源。
  • 規(guī)則:我們要以怎樣的方式來保護(hù)資源,他是我們定義的規(guī)則,流控規(guī)則,熔斷降級規(guī)則等

1.3 sentinel 的組成

sentinel 分為兩個部分,核心庫(Java 客戶端)和控制臺(Dashboard)

核心庫:能運行所有的Java 運行時環(huán)境,同時對于其他的框架具有很好的兼容度

控制臺: 基于 Springboot 開發(fā)的應(yīng)用,不需要額外的Tomcat容器。

2. 引入 Sentinel 并搭建

2.1 導(dǎo)入依賴

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>

控制臺的相關(guān)文檔:(https://github.com/alibaba/Sentinel/wiki)

2.2 啟動部署

//-Dserver.port=8080 用于指定 Sentinel 控制臺端口為 8080 //默認(rèn)用戶名和密碼都是 sentinel ? // 啟動指令 java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar如何判斷在線呢? 采用心跳檢測機制,sentinel 客戶端會發(fā)送心跳包,判斷機器是否在線

sentinel 控制臺主界面

2.4 配置使用

spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8080 port: 9999 ? #dashboard: 8080 控制臺端口 #port: 9999 本地啟的端口,隨機選個不能被占用的,與dashboard進(jìn)行數(shù)據(jù)交互,會在應(yīng)用對應(yīng)的機器上啟動一個 Http Server,該 Server 會與 Sentinel 控制臺做交互, 若被占用,則開始+1一次掃描
  • Sentinel 是懶加載模式,因此不會配置就生效,而是需要訪問服務(wù),才能被控制臺發(fā)現(xiàn)

3. 熔斷的狀態(tài)與恢復(fù)

服務(wù)熔斷一般有三種狀態(tài):

  • 熔斷關(guān)閉(closed)

    服務(wù)沒有故障,熔斷器所處的狀態(tài),對調(diào)用方的狀態(tài)沒有任務(wù)限制

  • 熔斷開啟(open)

    后續(xù)對該服務(wù)接口的調(diào)用不再經(jīng)過網(wǎng)絡(luò),直接執(zhí)行本地的fallback方法

  • 半熔斷(half - open)

    所謂半熔斷,就是說在隔一段時間之后,系統(tǒng)會恢復(fù)正常調(diào)用

    ?

  • 熔斷恢復(fù)

    經(jīng)過熔斷時長后,熔斷器會進(jìn)入探測恢復(fù)狀態(tài),嘗試恢復(fù)服務(wù)調(diào)用,允許有限的流量對該服務(wù)進(jìn)行調(diào)用,同時會進(jìn)行監(jiān)控成功率;

    如果成功率達(dá)到預(yù)期,說明服務(wù)已經(jīng)恢復(fù),進(jìn)入熔斷關(guān)閉的狀態(tài),如果成功率仍舊很低,則重新進(jìn)入熔斷狀態(tài)。

4. Sentinel 自定義異常

微服務(wù)的數(shù)據(jù)交互都是json格式,而初始的熔斷信息是一段英文,這樣對于調(diào)用方來說非常不友好,因此我們可以將異常定義成json格式的異常信息

Alibaba Cloud 2.2 之后的新版寫法

@Component public class UrlBlockHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {//降級業(yè)務(wù)處理} }

4.1 異常種類的總結(jié)

FlowException #限流異常 DegradeException #降級異常 ParamFlowException #參數(shù)限流異常 SystemBlockException #系統(tǒng)負(fù)載異常 AuthorityException #授權(quán)異常

因此我們可以在 Handler 中的 降級業(yè)務(wù)處理 中書寫如下代碼段:

Map<String,Object> backMap=new HashMap<>();if (e instanceof FlowException){backMap.put("code",-1);backMap.put("msg","限流-異常啦");}else if (e instanceof DegradeException){backMap.put("code",-2);backMap.put("msg","降級-異常啦");}else if (e instanceof ParamFlowException){backMap.put("code",-3);backMap.put("msg","熱點-異常啦");}else if (e instanceof SystemBlockException){backMap.put("code",-4);backMap.put("msg","系統(tǒng)規(guī)則-異常啦");}else if (e instanceof AuthorityException){backMap.put("code",-5);backMap.put("msg","認(rèn)證-異常啦");}// 設(shè)置返回json數(shù)據(jù)httpServletResponse.setStatus(200);httpServletResponse.setHeader("content-Type","application/json;charset=UTF-8");httpServletResponse.getWriter().write(JSON.toJSONString(backMap));

5. Sentinel 整合 Feign

依舊按照 微服務(wù)系列文章所沿用的,視頻訂單 項目例子

添加依賴

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>

在配置文件的 Feign 中開啟對 Sentinel 的支持

feign:sentinel:enabled: true

在service包中 準(zhǔn)備容錯service ,Fallback()(即當(dāng)出現(xiàn)熔斷式要返回給調(diào)用方什么數(shù)據(jù))

@Service public class VideoServiceFallback implements VideoService {@Overridepublic Video findById(int videoId) {Video video = new Video();video.setTitle("這個是Fallback里面的視頻");return video;}@Overridepublic int save(Video video) {return 0;} }

然后在 FeigClient 的注解中聲明好 上面的 Fallback類

@FeignClient(value = "xdclass-video-service", fallback = VideoServiceFallback.class)

總結(jié)

以上是生活随笔為你收集整理的微服务流量卫兵 Sentinel的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。