這篇文章給大家介紹SpringCloud中如何使用Sentinel哨兵組件,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。包括核心的獨立類庫,監控臺,豐富的使用場景驗證。(這似乎是阿里開源組件的一貫作風,極其有特點,且特點很規律)
基本特性圖:
補刀一句
:這種圖很多人可能不在意,但是一般官方給這個圖就是該中間件的基本使用思路,與核心功能點。
資源管理
資源是Sentinel組件中的核心概念之一。應用服務器上腳本,靜態頁面,API接口,文件圖片等都可以理解為資源,對于Java開發者而言,API接口就是這里資源的概念。
規則配置
Sentinel組件通過流控規則的配置,來指定允許該資源(API接口)通過的請求次數,IP黑白名單,應用服務等。
測試效果
QPS
:每秒查詢率,是一臺服務器每秒能夠處理的查詢次數。
TPS
:每秒處理事務數,事務處理整體傾向于整個過程。
這里的環境主要整合Nacos注冊中心,Feign服務,Sentinel哨兵,和Sentinel控制臺。
這里的依賴需要參考官方文檔,不同的環境使用不同的依賴,這里主要適配SpringCloud環境,所以使用如下包即可。
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.1.1.RELEASE</version> </dependency>
這里直接從GitHub下載一個控制臺服務包即可,也可以自己下載源碼,按照需求修改后自行打包。
java -jar sentinel-dashboard-1.7.1.jar
下載并啟動控制臺服務。
這里主要是把用到的兩個服務9001和9002連接到監控臺。
spring: application: name: node09-nacos-9001 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 file-extension: yaml sentinel: transport: port: 9001 dashboard: localhost:8080
最下面四行文件是哨兵控制臺的主要配置,注意剛啟動之后控制臺是看不到連接的,有資源被觸發之后才能看到。(附一張首頁效果圖)
流量控制(flow control),其原理是監控應用流量的 QPS 或并發線程數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性。
限流規則主要由下面幾個因素組成。
resource:資源名,即限流規則的作用對象,對于Java服務端開發而言就是執行的方法;
count: 限流閾值,單位時間內能按照規則通過的請求量;
grade: 限流閾值類型,QPS 或并發線程數 ;
limitApp: 流控限制的指定應用來源,若為default則不區分調用來源;
strategy: 調用關系限流策略,直連,鏈路等;
controlBehavior: 流量控制效果,直接拒絕、Warm Up、勻速排隊;
硬編碼
配置規則
public class FlowRuleConfig { public static void initFlowQpsRule(String resourceName) { List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(resourceName); // 修改這里參數,查看效果 rule.setCount(100); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setLimitApp("default"); rules.add(rule); FlowRuleManager.loadRules(rules); } }
該規則參考上面的限流因素,不難理解。
使用方式
@RequestMapping(value = "/web/getOrder",method = RequestMethod.GET) public String getOrder (@RequestParam("id") Integer id){ FlowRuleConfig.initFlowQpsRule("getOrder"); Entry entry = null; try { // 定義資源,埋點 entry = SphU.entry("getOrder"); // 保護的業務邏輯 return "Order=" + id ; } catch (Exception e){ e.printStackTrace(); } finally { if (entry != null){entry.exit();} } return "Order Error" ; }
測試的時候修改規則中count值,測試效果明顯。
編碼簡化
SphU.entry中可以設置處理類型,限流閾值。
@RequestMapping(value = "/web/getState",method = RequestMethod.GET) public String getState (@RequestParam("id") Integer id){ Entry entry = null; try { entry = SphU.entry("getOrder",EntryType.IN,2); return "state=" + id; } catch (BlockException e){ e.printStackTrace(); } finally { if (entry != null){entry.exit();} } return "State Error" ; }
不過這種模式依舊是代碼入侵嚴重,不太符合現在編程的大趨勢。Sentinel支持通過 @SentinelResource注解定義資源并配置。
請求上述的兩個測試接口,之后看控制臺中9001服務的簇點鏈路。
可以基于控制臺實時配置資源的:流控、降級、熱點、授權等核心功能,服務重啟之后配置也會重置。
核心注解SentinelResource
用于定義資源,并提供可選的異常處理和 fallback 配置項。 @SentinelResource 注解包含以下屬性:
value
資源名稱,核心概念不能為空;
entryType
entry 類型,可選項默認為 EntryType.OUT;
blockHandler
對應處理BlockException的函數名稱,可選項。blockHandler函數訪問范圍需要是public,返回類型需要與原方法相匹配,參數類型需要和原方法相匹配并且最后加一個額外的參數,類型為BlockException。blockHandler函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 blockHandlerClass為對應的類的Class對象,注意對應的函數必須為 static 函數,否則無法解析。
fallback
fallback函數名稱,可選項,用于在拋出異常的時候提供fallback處理邏輯。fallback函數可以針對所有類型的異常(除了 exceptionsToIgnore里面排除掉的異常類型)進行處理。fallback 函數簽名和位置要求:返回值類型必須與原函數返回值類型一致;方法參數列表需要和原函數一致,或者可以額外多一個;
注意
:這里可以這樣理解blockHandler和fallback,fallback處理業務邏輯的異常,服務降級,blockHandler處理sentinel組件控制的阻斷異常。
9001接口服務
@Service public class FlowServiceImpl implements FlowService { @Resource private JdbcTemplate jdbcTemplate ; @SentinelResource(value = "getPhone",blockHandler = "exceptionHandler", fallback = "fallback") @Override public String getPhone(Integer id) { String sql = "select phone from d_phone WHERE id="+id ; Integer.parseInt("hand") ; return jdbcTemplate.queryForList(sql,String.class).get(0) ; } // 降級處理 public String fallback(Integer id) { return "服務降級,id="+id ; } // 異常處理 public String exceptionHandler(Integer id,BlockException be) { be.printStackTrace(); return "服務拋異常,id="+id ; } }
9002請求服務
@RequestMapping(value = "/web/getJdbc",method = RequestMethod.GET) public String getJdbc () { return msgFeign.getJdbc() ; }
通過控制臺配置9001的限流規則,然后刷接口看效果。
注意阻斷異常和業務異常的返參區別。
Hystrix的核心點在于以隔離和熔斷為主的容錯機制,超時或被熔斷的調用將會快速失敗,并可以提供 fallback 機制;
Sentinel核心點在于流量控制多樣化,熔斷降級服務,系統負載保護,實時監控和控制臺;
補刀一句
:對于流量控制類的組件,大部分場景是使用限流,服務降級這兩塊核心功能。
關于SpringCloud中如何使用Sentinel哨兵組件就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。