微服务流量卫兵 Sentinel
1 定義概述
啥是流量,啥又是防衛兵呢?
在分布式系統中,流量注定是越來越大的,在每一秒鐘都可能處理上百萬乃至千萬的請求,設想一下服務器宕掉,那對于用戶而言,體驗肯定是非常壞的;所以我們為了保證 可用性,我們需要有一款流量控制工具,能夠幫助我們進行操作。
1.1 sentinel
- 阿里巴巴開源的分布式流量控制工具
- 豐富的應用場景:流量的削峰填谷、集群流量控制、實時熔斷下游不可應用。
- 具備可視化平臺,具備實時監控功能
Github 學習文檔:Sentinel 文檔
在使用 Sentinel 之前,我們需要熟悉 其中的兩個內容,也是它的核心概念
- 資源:是Sentinel 的核心概念之一,可以是你程序中的任何內容,也可以是某一個服務甚至小到一個方法,在 sentinel 中,它都是一個資源。
- 規則:我們要以怎樣的方式來保護資源,他是我們定義的規則,流控規則,熔斷降級規則等
1.3 sentinel 的組成
sentinel 分為兩個部分,核心庫(Java 客戶端)和控制臺(Dashboard)
核心庫:能運行所有的Java 運行時環境,同時對于其他的框架具有很好的兼容度
控制臺: 基于 Springboot 開發的應用,不需要額外的Tomcat容器。
2. 引入 Sentinel 并搭建
2.1 導入依賴
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>控制臺的相關文檔:(https://github.com/alibaba/Sentinel/wiki)
2.2 啟動部署
//-Dserver.port=8080 用于指定 Sentinel 控制臺端口為 8080 //默認用戶名和密碼都是 sentinel ? // 啟動指令 java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar如何判斷在線呢? 采用心跳檢測機制,sentinel 客戶端會發送心跳包,判斷機器是否在線sentinel 控制臺主界面
2.4 配置使用
spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8080 port: 9999 ? #dashboard: 8080 控制臺端口 #port: 9999 本地啟的端口,隨機選個不能被占用的,與dashboard進行數據交互,會在應用對應的機器上啟動一個 Http Server,該 Server 會與 Sentinel 控制臺做交互, 若被占用,則開始+1一次掃描- Sentinel 是懶加載模式,因此不會配置就生效,而是需要訪問服務,才能被控制臺發現
3. 熔斷的狀態與恢復
服務熔斷一般有三種狀態:
-
熔斷關閉(closed)
服務沒有故障,熔斷器所處的狀態,對調用方的狀態沒有任務限制
-
熔斷開啟(open)
后續對該服務接口的調用不再經過網絡,直接執行本地的fallback方法
-
半熔斷(half - open)
所謂半熔斷,就是說在隔一段時間之后,系統會恢復正常調用
?
-
熔斷恢復
經過熔斷時長后,熔斷器會進入探測恢復狀態,嘗試恢復服務調用,允許有限的流量對該服務進行調用,同時會進行監控成功率;
如果成功率達到預期,說明服務已經恢復,進入熔斷關閉的狀態,如果成功率仍舊很低,則重新進入熔斷狀態。
4. Sentinel 自定義異常
微服務的數據交互都是json格式,而初始的熔斷信息是一段英文,這樣對于調用方來說非常不友好,因此我們可以將異常定義成json格式的異常信息
Alibaba Cloud 2.2 之后的新版寫法
@Component public class UrlBlockHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {//降級業務處理} }4.1 異常種類的總結
FlowException #限流異常 DegradeException #降級異常 ParamFlowException #參數限流異常 SystemBlockException #系統負載異常 AuthorityException #授權異常因此我們可以在 Handler 中的 降級業務處理 中書寫如下代碼段:
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","系統規則-異常啦");}else if (e instanceof AuthorityException){backMap.put("code",-5);backMap.put("msg","認證-異常啦");}// 設置返回json數據httpServletResponse.setStatus(200);httpServletResponse.setHeader("content-Type","application/json;charset=UTF-8");httpServletResponse.getWriter().write(JSON.toJSONString(backMap));5. Sentinel 整合 Feign
依舊按照 微服務系列文章所沿用的,視頻訂單 項目例子
添加依賴
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>在配置文件的 Feign 中開啟對 Sentinel 的支持
feign:sentinel:enabled: true在service包中 準備容錯service ,Fallback()(即當出現熔斷式要返回給調用方什么數據)
@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)總結
以上是生活随笔為你收集整理的微服务流量卫兵 Sentinel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL注入(基于 tryhackme 的
- 下一篇: Win10-1809 离线安装 .net