阿里巴巴Sentinel使用秘籍-上

523 阅读1分钟

大名顶顶的alibaba-cloud,一直听有传闻没有使用过,在使用过程中自己搭建了小型的实验环境,但是在使用alibaba-cloud-sentinel模块的时候总结的问题及解决办法。

  1. Sentinel 链路流控模式失效

    解决办法:

        1.1 在spring-cloud-alibaba v2.1.1.RELEASE及前,sentinel1.7.0及后,关闭URL PATH聚合需要通过下面方式。
    
            1.1.1.            配置文件中关闭sentinel的CommonFilter实例化spring.cloud.sentinel.filter.enabled=false
    
            1.1.2.            添加一个配置类,自己构建CommonFilter实例
    
             ```java
             import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
             import org.springframework.boot.web.servlet.FilterRegistrationBean;
             import org.springframework.context.annotation.Bean;
             import org.springframework.context.annotation.Configuration;
    
             @Configuration
             public class FilterContextConfig {
    
                 /**
                  * @NOTE 在spring-cloud-alibaba v2.1.1.RELEASE及前,sentinel1.7.0及后,关闭URL PATH聚合需要通过该方式,spring-cloud-alibaba v2.1.1.RELEASE后,可以通过配置关闭:spring.cloud.sentinel.web-context-unify=false
                  * 手动注入Sentinel的过滤器,关闭Sentinel注入CommonFilter实例,修改配置文件中的 spring.cloud.sentinel.filter.enabled=false
                  * 入口资源聚合问题:https://github.com/alibaba/Sentinel/issues/1024 或 https://github.com/alibaba/Sentinel/issues/1213
                  * 入口资源聚合问题解决:https://github.com/alibaba/Sentinel/pull/1111
                  */
                 @Bean
                 public FilterRegistrationBean sentinelFilterRegistration() {
                     FilterRegistrationBean registration = new FilterRegistrationBean();
                     registration.setFilter(new CommonFilter());
                     registration.addUrlPatterns("/*");
                     // 入口资源关闭聚合
                     registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false");
                     registration.setName("sentinelFilter");
                     registration.setOrder(1);
                     return registration;
                 }
    
             }
             ```
    

    1.2. 在spring-cloud-alibaba v2.1.1.RELEASE后,可以通过配置关闭

    spring.cloud.sentinel.web-context-unify=false
    

2.sentinel 1.8控制台整合gateway无法显示nacos上配置的流控规则

解决办法: 需要在增加启动参数Dcsp.sentinel.app.type=1,一般实在网关模块启动时需要加上Dcsp.sentinel.app.type=1。

3.默认降级返回数据问题

限流和熔断返回的数据有问题- 微服务交互基本都是json格式,如果让自定义异常信息 AlibabCloud版本升级,不兼容问题

v2.1.0到v2.2.0后,Sentinel里面依赖进行了改动,且不向下兼容 自定义降级返回数据

【旧版】实现UrlBlockHandler并且重写blocked方法

@Component
public class XdclassUrlBlockHandler implements UrlBlockHandler {
    @Override
    public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {
       //降级业务处理
    }
}

【新版】实现BlockExceptionHandler并且重写handle方法

public class XdclassUrlBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
    //降级业务处理
    }
}