微服务流量卫兵 Sentinel
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL注入(基于 tryhackme 的
- 下一篇: Win10-1809 离线安装 .net