开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第二阶段:自定义规则异常返回】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/684/detail/11880
自定义规则异常返回
内容介绍:
一、 课题引入
二、 数据填写步骤
三、 //异常处理页面
一.课题引入
根据规则不同,返回个性化的异常页面,通过 Sentinel 提供的 url block Handler一个接口,只要实现这个接口并实现里面的 Block 就可以拿到所有规则产生的异常,对这个异常进行判断,就知道那个规则导致的异常,通过自己的逻辑来返回对应的一个个性化界面。
二.数据填写步骤
示例:写 ExceptionHandlerpage 这类
① 复制名字到异常处理页面
②在config下面加一个 class,让它实现 url blockhandler 接下来将里面的 block 方法做出实现,就可以拿 request response 和 BlockException,这就是所有异常的分接口。
它有五个子类分别对应五个规则(子类如图)
(1)AuthorityException(授权的)
(2)DegradeException(降级的)
(3)FlowException(限流的)
(4)ParamFlowException(参数限流的)
(5)SystemBlockException(系统负载的)
③接下来通过对 BlockException 判断知道哪一种规则导致的异常接下来在图的基础上写下
if (e instanceof FlowException) {
这时候可以返回由于限流导致的异常,为了返回这个结果在封装一个
Class ResponseData{} 响应数据在这里面提供两个值一个 private int code;一个private String message;在响应数据上填上@Data
@AllArgsConstructor//这是全参构造在填一个无参构造 @NoArgsConstructor接下来就可以做异常了,
在填写 newponseData(code:-1,messagea:”接口被限流了…”)
同样接下来写 eles if(e instanceof FlowException){
再写一个降级的 }eles if(e instanceof DegradeException){
他的Data等于new ResponseData(code:-2,message:”借口被降级了…”);同样可以接着往下写。
④ 考虑如何将 newponseData(code:-1,messagea:”接口被限流了…”)返回去
首先做一个声明 ResponseData 放在外面,ResponseData=null;之后ResponseData=newponseData(code:-1,messagea:”
接口被限流了…”)
ResponseData=new ResponseData(code:-2,message:”
借口被降级了…’’)接下来将response写回去,可以用相应写 response.getwriter().writer(); 现在这是一个对象最好将他转成结对状再往回写,写response.getwriter().writer(JOSN.toJOSNString(responseData))
注意这么写会有中文乱码的问题,为了处理乱码问题加一个reponse.setContentType(“application/Json;charset=utf-8’’);
这个定义就定义好了。
⑤接下来@Component我们的容器里面,到这一步自定义异常返回页面就写完了。
⑥启动程序接下来访问message1,对他设置规则找到簇点链路找到message1设置一个流控规则发现接口被限流了,把他删掉重新降级规则规则。
运行出现接口被降级了,可以根据这个返回结果去判断哪里异常了。
三.//异常处理页面
@component
Public class ExceptionHandlerpage implents url Block Handler {
//Block Exception
异常接口,包含sentinel 的五个异常
// Flow Exception
限流异常
//Degrade Exception
降级异常
//Param Flow Exception
参数限流异常
//Authority Exception
授权异常
//System Block Exception
系统负载异常
@override
Publicvoidblock(HttpServletRequestrequest, HttpServletResponse response,BlockException e) throws IoException {
Response.setContentType(“application/json;charset=utf-8”);
ResponseData data=null;
if (e instanceof FlowException) {
data=new ResponseData(-1,”
接口被限流了… ”);
} else if (e instanceof Degr adeException) {
data=new ResponseData(-2,
“接口被降级了…”);
}
response.getwriter().write(JSON.toJSONString(data));
}
}
@Data
@AllArgsConstructor
//全参构造
@NoArgsConstructor
//无参构造
Class ResponseData {
Private int code;
Private String message;
}