本文为您介绍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扩展:提供CommandHandlerCommandCenter等接口,用于对心跳发送、监控API Server进行扩展。