大名顶顶的alibaba-cloud,一直听有传闻没有使用过,在使用过程中自己搭建了小型的实验环境,但是在使用alibaba-cloud-sentinel模块的时候总结的问题及解决办法。
-
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 {
//降级业务处理
}
}