系列文章目錄
draft
Sentinel 是阿里巴巴開源的 輕量級服務防護組件,主要用于實現以下功能:流量控制FlowRule(Rate Limiting):限制單位時間內的請求量,防止系統過載。
熔斷降級DegradeRule(Circuit Breaker):當某個服務異常時,自動熔斷,避免雪崩效應。
系統自適應保護SystemRule:根據系統的負載情況動態調整資源分配。
熱點參數限流ParamFlowRule:對某些高頻訪問的參數進行限流。
集群流控:支持分布式系統的統一限流策略。
Sentinel 的設計目標是 低侵入性、高擴展性、易于集成,常用于微服務架構中。
文章目錄
- 系列文章目錄
- 一、Sentinel DashBoard搭建
- 二、web接口資源
- 1、web資源正常和異常請求--preHandle()
- 2、流控規則設置-QPS=1
- 3、自定義異常處理
- 二、@SentinelResource資源
- 1、自定義異常處理
- 三、流量控制-流控模式-鏈路策略
- 四、熔斷降級
一、Sentinel DashBoard搭建
網上很多教程,省略
二、web接口資源
1、web資源正常和異常請求–preHandle()
返回true, 表述放行,返回false,表示違背設置規則,報錯
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String resourceName = "";try {resourceName = this.getResourceName(request);if (StringUtil.isEmpty(resourceName)) {return true;} else if (this.increaseReference(request, this.baseWebMvcConfig.getRequestRefName(), 1) != 1) {return true;} else {String origin = this.parseOrigin(request);String contextName = this.getContextName(request);ContextUtil.enter(contextName, origin);Entry entry = SphU.entry(resourceName, 1, EntryType.IN);request.setAttribute(this.baseWebMvcConfig.getRequestAttributeName(), entry);return true;}} catch (BlockException var12) {BlockException e = var12;try {this.handleBlockException(request, response, resourceName, e);} finally {ContextUtil.exit();}return false;}}
2、流控規則設置-QPS=1
如果多次請求
public class DefaultBlockExceptionHandler implements BlockExceptionHandler {public DefaultBlockExceptionHandler() {}public void handle(HttpServletRequest request, HttpServletResponse response, String resourceName, BlockException ex) throws Exception {response.setStatus(429);PrintWriter out = response.getWriter();out.print("Blocked by Sentinel (flow limiting)");out.flush();out.close();}
}
3、自定義異常處理
顯示結果:
在這里插入代碼片
@Component
public class MyBlockException implements BlockExceptionHandler {private ObjectMapper objectMapper = new ObjectMapper();@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String s, BlockException e) throws Exception {httpServletResponse.setContentType("application/json;charset=UTF-8");PrintWriter writer = httpServletResponse.getWriter();R error = R.error(500, "服務不可用,請稍后再試!" + e.getClass());String s1 = objectMapper.writeValueAsString(error);writer.write(s1);writer.flush();writer.close();}
}
二、@SentinelResource資源
給 @SentinelResource(value = “createOrder”)添加流控規則,違反規則以后
異常, 這是springboot 異常情況默認返回
1、自定義異常處理
@SentinelResource(value = "createOrder",blockHandler = "createOrderFallback")
public public Order createOrder(Long id, Long userId) {}
自定義createOrderFallback
//設置兜底回調public Order createOrderFallback(Long id, Long userId, BlockException blockException) {Order order = new Order();order.setId(id);order.setUserId(userId);order.setTotalPrice(BigDecimal.ZERO);order.setUserName("Fallback User");order.setProducts(Arrays.asList()); // 返回空產品列表return order;}
三、流量控制-流控模式-鏈路策略
異常情況
/create 不管執行多少次,都是正常的
四、熔斷降級
切斷不穩定調用
快速返回不積壓
避免雪崩效應
熔斷降級作為保護自身的手段,通常在客戶端進行配置
在 5 秒的時間窗口內,如果有 5 個請求,并且其中 80% 的請求超時(例如超過 1 秒),則觸發熔斷。此時如果系統有兜底數據,會返回兜底數據,避免直接報錯。
熔斷窗口結束后,斷路器進入半開狀態。此時會嘗試發送一個探測請求。如果探測調用成功,斷路器將切換為關閉狀態,后續請求可以正常調用;如果探測調用失敗或依然很慢,斷路器保持打開狀態,繼續拒絕請求,直到下一次熔斷條件再次被觸發。