sentinel 支持统一的降级策略 gczjtUrlBlockHandler

import cn.hutool.http.ContentType;
import cn.hutool.json.JSONUtil;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.hzjt.gczjt.common.core.util.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**

  • @author gczjt

  • @date 2019-10-11

  • 降级 限流策略
    */
    @Slf4j
    public class GczjtUrlBlockHandler implements BlockExceptionHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {

     log.error("sentinel 降级 资源名称{}", e.getRule().getResource(), e);
    
     response.setContentType(ContentType.JSON.toString());
     response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
     response.getWriter().print(JSONUtil.toJsonStr(R.failed(e.getMessage())));

    }

}

1先来看默认的 feign service 是要求怎么做的。feign service 定义一个 factory 和 fallback 的类

@FeignClient(value = ServiceNameConstants.UMPS_SERVICE, fallbackFactory = RemoteLogServiceFallbackFactory.class)
public interface RemoteLogService {}
在 Spring Cloud 使用 feign 的时候,需要明确指定 fallback 策略,不然会提示错误。 但是我们大多数情况的 feign 降级策略为了保证幂等都会很简单,输出错误日志即可。在企业中开发非常不方便

自定降级效果

@FeignClient(value = ServiceNameConstants.UMPS_SERVICE)
public interface RemoteLogService {}

Feign Service 完成同样的降级错误输出
FeignClient 中无需定义无用的 fallbackFactory
FallbackFactory 也无需注册到 Spring 容器中

文档更新时间: 2021-08-10 17:30   作者:admin