sentinel下针对异常的默认异常与自定义异常

Sentinel 异常处理(降级模式下----默认异常为DegradeException)

系统提供了默认的异常处理机制,假如默认处理机制不满足我们需求,我们可以自己进行定义。定义方式上可以直接或间接实现BlockExceptionHandler接口,并将对象交给spring管理

第一步:创建类ServiceBlockExceptionHandler并实现接口BlockExceptionHandler

package com.mrli.config;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

@Component
public class ServiceBlockExceptionHandler implements BlockExceptionHandler {
//重写默认异常返回内容
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        //设置响应数据编码
        response.setCharacterEncoding("utf-8");
        //告诉客户端响应数据类型以及客户端显示的编码
        response.setContentType("text/html;charset=utf-8");
        //创建Map来存储要返回的数据
        Map<String,Object> map = new HashMap<>();
        map.put("status", 429);
        map.put("message", "服务器忙,请稍后访问...");
        //输出
        String jsonStr = new ObjectMapper().writeValueAsString(map);
        PrintWriter out = response.getWriter();
        out.print(jsonStr);
        out.flush();
        out.close();
    }
}

测试结果:

Sentinel 异常自定义处理

基于@SentinelResource注解描述的方法进行限流后的异常的返回结果(页面显示效果)进行自定义处理

默认异常显示不是很友好,如下500:

第一步:创建一个类,如ResourceBlockHandler

package com.mrli.config;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Component;

@Component  //交给spring管理
public class ResourceBlockHandler {

    /**
     * 定义需求:
     * 1,必须为public权限
     * 2,必须为static
     * 3,返回值类型要与@SentinelResource标识的方法返回值保持一致性
     * 4,参数类型为BlockException
     * 5,方法名自己定义即可
     * */
    public static String doBlockHandler(BlockException e){

        return "访问太频繁,请稍等..";
    }
}

第二步:进行调用

package com.mrli.controller.service;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.mrli.config.ResourceBlockHandler;
import org.springframework.stereotype.Service;

@Service
public class SentinelService implements SentinelServiceImpl{

    @Override
    @SentinelResource(value = "doGetSentinel02",
    blockHandlerClass = ResourceBlockHandler.class,
    blockHandler = "doBlockHandler")//获取类中自定义异常结果返回的方法
    public String doGetSentinel02() {
        return "sentinel is two nice";
    }

}

第三步:测试

package com.mrli.controller;

import com.mrli.controller.service.SentinelServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SentinelController {

    @Autowired
    private SentinelServiceImpl sentinelServiceImpl;

   
    @GetMapping("/provider/new")
    private String doGetSentinel(){
        return sentinelServiceImpl.doGetSentinel02();
    }

}

自定义之后:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值