本文为您介绍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进行扩展。
文档内容是否对您有帮助?