3-7 Servicio centinela de tolerancia a fallos: retorno anormal

1 devolución de excepción

Incluyendo excepciones globales personalizadas y manejo de excepciones de recursos individuales

## 2 La demostración de la página de excepción personalizada
necesita implementar la interfaz UrlBlockHandler, agregue la clase MyUrlBlockHandler en el método de configuración

@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 Anote la devolución de excepción específica en sentinelResource

3.1 Descripción del concepto

  • El valor del atributo representa el nombre del recurso.
  • El atributo blockHandler representa el método que debe manejarse cuando se genera la excepción centinela
  • El atributo fallback representa el método para manejar cualquier excepción.
  • El atributo blockHandlerClass representa la clase del método apuntado por blockHandler. El método usado con este atributo debe ser un método estático.
    Nota: No use la página de excepción personalizada MyUrlBlockHandler en este momento para causar conflictos.

3.2 Demostración simple

3.2.1 Agregar un método de prueba al controlador del servicio de pedidos

    /**
     * 服务容错组件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 Nueva clase de manejo de excepciones 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 Agregar un método de manejo de excepciones al controlador del servicio de pedidos

Tenga en cuenta que el parámetro es Throwable, este método se puede extraer como BlockException

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

3.2.4 Verificación de la prueba

  • Establezca los qps de la regla de control de flujo 1 en 1 para el nombre del recurso
  • accesohttp://localhost:8091/sentinel/sentinelResource?name=test
第一次可以正常访问
多次刷新会返回blockHandler
每个第三次都会返回fallback

Supongo que te gusta

Origin blog.csdn.net/weixin_45544465/article/details/105939078
Recomendado
Clasificación