【第13章】Spring Cloud之Gateway全局异常处理

ops/2024/10/19 9:33:47/

文章目录

  • 前言
  • 一、异常处理
    • 1. 响应实体类
    • 2. 异常处理类
  • 二、单元测试
    • 1. 无可用路由
    • 2. 服务不可用
  • 总结


前言

网关作为我们对外服务的入口起着至关重要的作用,我们必须保证网关服务的稳定性,下面来为网关服务增加异常处理机制。


一、异常处理

1. 响应实体类

java">package org.example.common.model;import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;//统一响应结果
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {private Integer code;//业务状态码  0-成功  1-失败private String title;//标题private String message;//提示信息private T data;//响应数据public Result(Integer code, String title, String message) {this.code = code;this.title = title;this.message = message;}public Result(Integer code, String message, T data) {this.code = code;this.message = message;this.data = data;}//快速返回操作成功响应结果(带响应数据)public static <E> Result<E> success(E data) {return new Result<>(0, "操作成功", data);}public static <E> Result<E> success(String message,E data) {return new Result<>(0, message, data);}public static Result success(String message) {return new Result<>(0, message, null);}//快速返回操作成功响应结果public static Result success() {return new Result(0, "操作成功", null);}public static Result error(String message) {return new Result(1, message, null);}public static Result error(int code,String message) {return new Result(code, message, null);}public static Result error(int code,String title,String message) {return new Result(code,title , message);}
}

2. 异常处理类

这里针对性地处理了无可用路由和无可用服务两种场景异常,和一种铺地异常的处理,大家有自定义异常或其他异常可自行添加处理逻辑

java">package org.example.gateway.config;import org.example.common.model.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.support.NotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.reactive.resource.NoResourceFoundException;
import java.io.PrintWriter;
import java.io.StringWriter;/*** Create by zjg on 2024/7/27*/
@RestControllerAdvice
public class GlobalExceptionHandler {Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(NoResourceFoundException.class)//无可用路由public Result exception(ServerHttpResponse response,NoResourceFoundException ex){String detail = ex.getBody().getDetail();String mark="resource ";String message = detail.substring(detail.indexOf(mark) + mark.length());setStatusCode(response,ex.getStatusCode());return  Result.error(ex.getStatusCode().value(),"无可用路由",String.format("没有可用的路由[%s]",message));}@ExceptionHandler(NotFoundException.class)//无可用服务public Result exception(ServerHttpResponse response,NotFoundException ex){logger.error(ex.getMessage());String detail = ex.getBody().getDetail();String mark="for ";String message = detail.substring(detail.indexOf(mark) + mark.length());setStatusCode(response,ex.getStatusCode());return  Result.error(ex.getStatusCode().value(),"服务不可用",String.format("没有可用的服务实例[%s]",message));}@ExceptionHandler(Exception.class)//异常保底public Result exception(ServerHttpResponse response,Exception exception){StringWriter stringWriter = new StringWriter();PrintWriter writer=new PrintWriter(stringWriter);exception.printStackTrace(writer);logger.error(stringWriter.toString());setStatusCode(response,HttpStatus.INTERNAL_SERVER_ERROR);return  Result.error(HttpStatus.INTERNAL_SERVER_ERROR.value(),exception.getMessage());}private void setStatusCode(ServerHttpResponse response,HttpStatusCode httpStatusCode){response.setStatusCode(httpStatusCode);}
}

二、单元测试

1. 无可用路由

curl 192.168.0.104:8888/provider/hello -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGFpbXMiOnsidXNlcm5hbWUiOiJhZG1pbiJ9LCJpc3MiOiJhdXRoMCIsImV4cCI6MTcyMjE0NjE0MX0.IRlUZ5H_-PbPSbklqFGB1lOYquj0iifV2mhT-z68fhM"

在这里插入图片描述

2. 服务不可用

在这里插入图片描述


总结

回到顶部


http://www.ppmy.cn/ops/90095.html

相关文章

HTML-04.新浪新闻-标题-超链接

1.超链接 标签&#xff1a;<a> 属性&#xff1a; href&#xff1a;指定资源访问的url target&#xff1a;指定在何处打开资源链接 _self:默认值 _blank:在空白页面打开 2.CSS属性 text-decoration&#xff1a;规定添加到文本的修饰&#xff0c;none表示定义标准的文本(无…

浅谈【C#】log4net

一、Log4Net详解 Log4net库是.Net下一个非常优秀的开源日志记录组件&#xff0c;是一个帮助程序员将日志信息输出到各种目标&#xff08;控制台、文件、数据库等&#xff09;的工具。如果应用程序出现问题&#xff0c;启用日志记录有助于定位问题。 日志输出可能非常庞大&#…

“卫星-无人机-地面”遥感数据快速使用及地物含量计算的实现方法实践

在与上千学员交流过程中&#xff0c;发现科研、生产和应用多源遥感数据时&#xff0c;能快速上手&#xff0c;发挥数据的时效性&#xff0c;尽快出创新性成果&#xff0c;是目前的学员最迫切的需求。特别是按照“遥感数据获取-处理-分析-计算-制图”全流程的答疑解惑&#xff0…

【算法模板】图论:Tarjan算法求强连通分量

Tarjan 算法是一种高效的求有向图中所有强连通分量的方法。一个强连通分量&#xff08;SCC&#xff09;是一个极大子图&#xff0c;其中任意两个顶点之间都是可达的。 概念 强连通 在图论中&#xff0c;强连通通常用于描述有向图的性质。一个有向图被称为强连通的&#xff0c…

【算法 02】一题学习BFS和DFS算法

一题学习BFS和DFS算法 洛谷题目解析&#xff1a;【深基18.例3】查找文献 题目背景 小K热衷于在洛谷博客上阅读文章并探索其中的知识。每篇文章都可能包含指向其他博客文章的参考文献链接。小K的求知欲非常强&#xff0c;如果他阅读了某篇文章&#xff0c;他一定会去查看这篇文…

【LLM】-13-部署Xinference平台

目录 1、部署 2、启动 3、添加自定义模型 4、启动自定义模型 5、使用命令行启动 5.1、安装 xinference 插件 5.2、启动自定义模型 5.3、注销模型 6、使用代码方式启动 6.1、代码 6.2、自定义配置文件说明 Xorbits Inference (Xinference) 是一个开源平台&#xff0c…

LeetCode 第136场双周赛个人题解

Q1. 求出胜利玩家的数目 原题链接 Q1. 求出胜利玩家的数目 思路分析 直接模拟 时间复杂度&#xff1a;O(N) AC代码 class Solution { public:int winningPlayerCount(int n, vector<vector<int>>& pick) {unordered_map<int, unordered_map<int, …

论文笔记:InternImage—基于可变形卷积的视觉大模型,超越ViT视觉大模型,COCO 新纪录 64.5 mAP!

文章信息 Title&#xff1a;InternImage: Exploring Large-Scale Vision Foundation Models with Deformable ConvolutionsPaper Link&#xff1a;https://arxiv.org/abs/2211.05778 Code Link&#xff1a;https://github.com/OpenGVLab/InternImage 写在前面 拿到文章之后先看…