3-7服务容错sentinel-异常返回

1 异常返回

包括自定义全局异常和单个资源异常处理

## 2 自定义异常页面演示
需要实现接口UrlBlockHandler,在config方法里增加类MyUrlBlockHandler

@Component
public class MyUrlBlockHandler implements UrlBlockHandler {
    @Override
    public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {
        httpServletResponse.setContentType("application/json;charset=UTF-8");
        ResponseDate responseDate = null;
        if (e instanceof FlowException) {
            responseDate = new ResponseDate(-1, "接口被限流了");
        } else if (e instanceof DegradeException) {
            responseDate = new ResponseDate(-2, "接口被降级了");
        } else if (e instanceof ParamFlowException) {
            responseDate = new ResponseDate(-2, "接口被热点限流了");
        } else if (e instanceof AuthorityException) {
            responseDate = new ResponseDate(-2, "接口被授权规则限制访问了");
        } else if (e instanceof SystemBlockException) {
            responseDate = new ResponseDate(-2, "接口被系统规则限制了了");
        }
        httpServletResponse.getWriter().write(JSON.toJSONString(responseDate));
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class ResponseDate {
    private Integer code;
    private String message;
}

3 注解sentinelResource里的具体异常返回

3.1 概念说明

  • 属性value值表示资源名
  • 属性blockHandler表示产生sentinel异常需要处理的方法
  • 属性fallback表示产生任何异常需要处理的方法
  • 属性blockHandlerClass表示blockHandler指向的方法所在的类,用该属性方法必须为静态方法
    注意:这个时候不要用自定义异常页面MyUrlBlockHandler会发生冲突.

3.2 简单演示

3.2.1 在order服务的controller中增加测试方法

    /**
     * 服务容错组件sentinel-演示sentinelResource属性
     */
    int m = 0;

    @RequestMapping("/sentinel/sentinelResource")
    @SentinelResource(value = "resourceName",
            blockHandlerClass = MyBlockHandler.class,
            // 这里blockHandler方法必须为静态方法
            blockHandler = "blockHandler",
            fallback = "fallback")
    public String sentinelResource(String name) {
        log.info("进入sentinelResource注解测试,参数name={}", name);
        m++;
        if (m % 3 == 0) {
            throw new RuntimeException("fallback异常");
        }
        return "服务容错组件sentinel中注解sentinel属性的使用演示";
    }

#### 3.2.2 新增异常处理类MyBlockHandler

package cn.hzp.Exception;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MyBlockHandler {
    // 此方法必须为静态方法
    public static String blockHandler(String name, BlockException b) {
        log.info("进入sentinelResource注解测试,进入blockHandler,参数name={},b={}", name, b.toString());
        return "blockHandler";
    }
}

3.2.3 在order服务的controller中增加异常处理方法

注意参数为Throwable,这个方法可以像BlockException那样抽出来

    public String fallback(String name, Throwable e){
        log.info("进入sentinelResource注解测试,进入fallback,参数name={},b={}", name, e.toString());
        return "fallback";
    }

3.2.4 测试验证

  • 对资源resourceName设置流控规则1s的qps为1
  • 访问http://localhost:8091/sentinel/sentinelResource?name=test
第一次可以正常访问
多次刷新会返回blockHandler
每个第三次都会返回fallback

猜你喜欢

转载自blog.csdn.net/weixin_45544465/article/details/105939078