本文为您介绍 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) {
                 // 对ori ginUrl进行变换,得到归一化后的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 包装后抛出。同时,还可以配合 Dubbo 的 fallback 机制 来为降级的服务提供替代的实现。

其它扩展接口

Sentinel 提供多样化的 SPI 接口用于提供扩展的能力。用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现,从而可以方便地根据业务需求给 Sentinel 添加自定义的逻辑。目前 Sentinel 提供如下的扩展点:

  • 初始化过程扩展:提供 InitFunc SPI 接口,可以添加自定义的一些初始化逻辑,如动态规则源注册等。
  • Slot Chain 扩展:用于给 Sentinel 功能链添加自定义的功能并自由编排。
  • 指标统计扩展(StatisticSlot Callback):用于扩展 StatisticSlot 指标统计相关的逻辑。
  • Transport 扩展:提供 CommandHandlerCommandCenter 等接口,用于对心跳发送、监控 API Server 进行扩展。