本文為您介紹Web Servlet Filter、Dubbo Adapter等擴展接口。
Web Servlet Filter
- 自定義限流頁面/處理邏輯
默認情況下,當請求被限流時會返回默認的提示頁面。可通過三種方式設置自定義的跳轉URL:
- 方式一:
WebServletConfig.setBlockPage(blockPage)
方法示例://設置全局生效,被流控的所有頁面都會跳轉到這里。 WebServletConfig.setBlockPage("https://www.example.test/");
- 方式二:JVM
-Dcsp.sentinel.web.servlet.block.page=xxx
示例://設置全局生效,被流控的所有頁面都會跳轉到這里。 -Dcsp.sentinel.web.servlet.block.page=https://www.fallback.page.com/
- 方式三:更靈活的方式是定義
UrlBlockHandler
接口限流處理邏輯,并將其注冊至WebCallbackManager
。自定義處理邏輯的示例:// 全局設置一次即可,比如在某個全局的init()方法里加入。 WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() { @Override public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException { // request里包含了此次請求所有的信息,可以從其中解析出URL、請求參數等。 logger.info("blocked: " + request.getPathInfo()); // response表示響應對象,直接向其中寫fallback結果即可。 response.sendRedirect("https://www.fallback.page.com/"); // 將請求重定向到fallback地址 } });
返回Status 500的示例:// 全局設置一次即可,比如在某個全局的init()方法里加入。 WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() { @Override public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException { // request里包含了此次請求所有的信息,可以從其中解析出URL、請求參數等。 logger.info("blocked: " + request.getPathInfo()); // response表示響應對象,直接向其中寫fallback結果即可。 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getWriter().println("flow control"); } });
- 方式一:
- URL 資源清洗
Sentinel Web Servlet Filter會將每個到來的不同的URL都作為不同的資源處理,因此對于REST風格的API,需要自行實現
UrlCleaner
接口清洗資源,例如,將滿足/foo/:id
的URL都歸到/foo/*
資源下,然后將其注冊至WebCallbackManager
中。否則會導致資源數量過多,超出資源數量閾值(6000)時多出的資源的規則將不會生效。示例如下:
@PostConstruct public void init() { // 全局注冊一次即可 WebCallbackManager.setUrlCleaner(new UrlCleaner() { @Override public String clean(String originUrl) { // 對originUrl進行變換,得到歸一化后的URL if (originUrl == null || originUrl.isEmpty()) { return originUrl; } // 比如將滿足/foo/:id的URL都歸到/foo/* if (originUrl.startsWith("/foo/")) { return "/foo/*"; } return originUrl; } }); }
- 解析請求來源
若希望對HTTP請求按照來源限流,則可以自己實現
RequestOriginParser
接口從HTTP請求中解析origin并注冊至WebCallbackManager
中,示例如下:WebCallbackManager.setRequestOriginParser(new RequestOriginParser() { @Override public String parseOrigin(HttpServletRequest request) { return request.getRemoteAddr(); } });
Dubbo Adapter
Sentinel Dubbo Adapter支持配置全局的Fallback函數,可以在Dubbo服務被限流、降級或負載保護的時候進行相應的Fallback處理。用戶只需要實現自定義的DubboFallback
接口,并通過DubboFallbackRegistry
注冊即可。默認情況會直接將BlockException
包裝后拋出。
其它擴展接口
Sentinel提供多樣化的SPI接口用于提供擴展的能力。用戶可以在用同一個sentinel-core
的基礎上自行擴展接口實現,從而可以方便地根據業務需求給Sentinel添加自定義的邏輯。目前Sentinel提供如下的擴展點:
- 初始化過程擴展:提供
InitFunc
SPI接口,可以添加自定義的一些初始化邏輯,如動態規則源注冊等。 - Slot Chain擴展:用于給Sentinel功能鏈添加自定義的功能并自由編排。
- 指標統計擴展(StatisticSlot Callback):用于擴展StatisticSlot指標統計相關的邏輯。
- Transport擴展:提供
CommandHandler
、CommandCenter
等接口,用于對心跳發送、監控API Server進行擴展。
文檔內容是否對您有幫助?