栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 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 {

    
    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();
    }

}

自定义之后:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/710931.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号