Sentinel 是面向分布式服務架構的流量控制組件,主要以流量為切入點,從流量控制、熔斷降級、系統自適應保護等多個維度來幫助保障微服務的穩定性。
規則:圍繞資源的實時狀態設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動態實時調整。
服務端
下載sentinel服務端 地址:https://github.com/alibaba/Sentinel/releases
sentinel服務端也是基於springboot開發 它的版本與客戶端發開的springboot版本毫無聯系,所以sentinel下載任何版本都可用
下載完以后直接java -jar運行 默認是8080端口 登錄網址http://127.0.0.1:8080/login 賬號/密碼:sentinel
未整合客戶端之前登錄
客戶端
直接在pom中引入下面的依賴 版本可自行配置
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.1.RELEASE</version> </dependency>
配置文件 我使用的是yml文件
spring: cloud: sentinel: transport: #連接sentinel的dashboard dashboard: 127.0.0.1:8080 #client-ip: 192.168.0.9:9000 port: 8719 #注意這里的端口默認是8719 如果8719被占用會自動+1 無需當心 #eager: true #暴露的健康檢查服務端點 management: endpoint: web: exposure: include: '*'
注:若整合完以后發現服務端還是未監聽到任何客戶端服務,那是因為sentinel是懶加載 需要先訪問一次接口
最終整合完成的結果
sentinel 自定義返回錯誤
例如:
限流 重寫之前
重寫之后
方法很簡單只需要重寫BlockExceptionHandler
/** * 自定義Sentinel異常實現 * * @author Administrator * */ @Component public class MyBlockHandler implements BlockExceptionHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws Exception { String msg = null; if (ex instanceof FlowException) { msg = "已被限流"; } else if (ex instanceof DegradeException) { msg = "已被降級"; } else if (ex instanceof ParamFlowException) { msg = "已被熱點參數限流"; } else if (ex instanceof SystemBlockException) { msg = "系統規則"; } else if (ex instanceof AuthorityException) { msg = "授權規則"; } response.setStatus(500); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Type", "application/json;charset=utf-8"); response.setContentType("application/json;charset=utf-8"); new ObjectMapper().writeValue(response.getWriter(), msg); } }