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 容器中