springcloud gateway中进行统一处理api接口异常返回

Spring Cloud Gateway过滤器精确控制异常返回(实战,完全定制返回body) 虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料。 阅读详情

我的项目中,使用spring cloud gateway作为路由,根据路由规则访问不同的api,api中使用的是fegin,当api未启动或者出现异常时候,会返回以下的异常信息
在这里插入图片描述
而正常的情况我们接口返回的数据是经过封装的,所以我们需要将这里的异常也进行处理,使其数据格式与我们接口中保持一致,方便前端进行统一处理。
获取及重新捕获异常的代码:

import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.ResourceProperties;
import org.springframework.boot.autoconfigure.web.reactive.error.DefaultErrorWebExceptionHandler;
import org.springframework.boot.web.reactive.error.ErrorAttributes;
import org.springframework.context.ApplicationContext;
import org.springframework.http.HttpStatus;
import org.springframework.web.reactive.function.server.*;
import java.util.HashMap;
import java.util.Map;

/**
 * @description: 捕获及处理异常
 * @Author: 
 * @Date: 2020/2/15 9:46
 */
public class JsonExceptionHandler extends DefaultErrorWebExceptionHandler {
    public JsonExceptionHandler(ErrorAttributes errorAttributes, ResourceProperties resourceProperties,
                                ErrorProperties errorProperties, ApplicationContext applicationContext) {
        super(errorAttributes, resourceProperties, errorProperties, applicationContext);
    }

    /**
     * 获取异常属性
     */
    @Override
    protected Map<String, Object> getErrorAttributes(ServerRequest request, boolean includeStackTrace) {
        int code = 500;
        Throwable error = super.getError(request);
        if (error instanceof org.springframework.cloud.gateway.support.NotFoundException) {
            code = 404;
        }
        return response(code, this.buildMessage(request, error));
    }

    /**
     * 指定响应处理方法为JSON处理的方法
     * @param errorAttributes
     */
    @Override
    protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {
        return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse);
    }

    /**
     * 根据code获取对应的HttpStatus
     * @param errorAttributes
     */
    @Override
    protected HttpStatus getHttpStatus(Map<String, Object> errorAttributes) {
        int statusCode = (int) errorAttributes.get("code");
        return HttpStatus.valueOf(statusCode);
    }

    /**
     * 构建异常信息
     * @param request
     * @param ex
     * @return
     */
    private String buildMessage(ServerRequest request, Throwable ex) {
        StringBuilder message = new StringBuilder("Failed to handle request [");
        message.append(request.methodName());
        message.append(" ");
        message.append(request.uri());
        message.append("]");
        if (ex != null) {
            message.append(": ");
            message.append(ex.getMessage());
        }
        return message.toString();
    }

    /**
     * 构建返回的JSON数据格式
     * @param status        状态码
     * @param errorMessage  异常信息
     * @return
     */
    public static Map<String, Object> response(int status, String errorMessage) {
        Map<String, Object> map = new HashMap<>(3);
        map.put("code", status);
        map.put("message", errorMessage);
        map.put("data", null);
        return map;
    }
}

config类代码:

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.web.ResourceProperties;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.reactive.error.ErrorAttributes;
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.result.view.ViewResolver;
import java.util.Collections;
import java.util.List;

/**
 * @description: 异常的配置
 * @Author: 
 * @Date: 2020/2/15 9:44
 */
@Configuration
@EnableConfigurationProperties({ServerProperties.class, ResourceProperties.class})
public class ExceptionConfig {
    private final ServerProperties serverProperties;

    private final ApplicationContext applicationContext;

    private final ResourceProperties resourceProperties;

    private final List<ViewResolver> viewResolvers;

    private final ServerCodecConfigurer serverCodecConfigurer;

    public ExceptionConfig(ServerProperties serverProperties,
                                     ResourceProperties resourceProperties,
                                     ObjectProvider<List<ViewResolver>> viewResolversProvider,
                                     ServerCodecConfigurer serverCodecConfigurer,
                                     ApplicationContext applicationContext) {
        this.serverProperties = serverProperties;
        this.applicationContext = applicationContext;
        this.resourceProperties = resourceProperties;
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public ErrorWebExceptionHandler errorWebExceptionHandler(ErrorAttributes errorAttributes) {
        JsonExceptionHandler exceptionHandler = new JsonExceptionHandler(
                errorAttributes,
                this.resourceProperties,
                this.serverProperties.getError(),
                this.applicationContext);
        exceptionHandler.setViewResolvers(this.viewResolvers);
        exceptionHandler.setMessageWriters(this.serverCodecConfigurer.getWriters());
        exceptionHandler.setMessageReaders(this.serverCodecConfigurer.getReaders());
        return exceptionHandler;
    }
}

pom文件中的内容:

 <dependency>
   <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter</artifactId>
 </dependency>

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
 </dependency>

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-gateway</artifactId>
 </dependency>

我这里的springboot版本是2.1.12RELEASE,springcloud版本是Greenwich.SR5。
配置好之后,返回请求未启动的api服务时,返回截图:
在这里插入图片描述

Spring cloud gateway的自定义异常响应 由于gateway默认的返回码和返回信息不能满足下游微服务的自定义的异常响应码和描述,则需要通过网关透传下游微服务的异常的码值或者至少异常描述信息。 spring cloud gateway给我们留了口子,只需要继承类DefaultErrorWebExceptionHandler,并覆盖相应的接口,并且声明ErrorWebExceptionHandler配置即可,下面贴出代码: 1、 ErrorWebExceptionHandler配置 @Configuration @EnableConfiguration 阅读详情

相关推荐

微服务网关异常处理springcloud-gateway

在使用springcloud-gateway网关路由到微服时出现异常如何对异常进行统一封装处理? 问题:项目中使用springcloud-gateway,请求到网关,再路由到微服务时出现微服务未找到异常 网关pom文件 <dependency> <groupId>org.springframework.cloud</gro...

hong_myth的专栏 3654

SpringCloud Gateway 全局异常处理

在全局过滤器中可以处理网络异常请求,但是当设置Gateway请求超时时间,超时后的异常全局过滤器中处理不了。 定义CustomWebExceptionHandler类 import com.alibaba.csp.sentinel.slots.block.BlockException; import com.tigerkin.util.ApiResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springfr

weixin_42270645的博客 6100

Spring Cloud Gateway实战案例(限流、熔断回退、跨域、统一异常处理和重试机制)

Spring CloudGateway 作为新一代网关,在性能上有很大提升,并且附加了诸如限流等实用的功能。 限流 开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。API 网关作为所有请求的入口,请求量大,我们可以通过对并发访问的请求进行限速来保护系统的可用性。 常用的限流算法 常用的限流算法由:漏桶算法和令牌桶算法。 1、漏桶算法 漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直...

Hello World 2115

吃透Spring Cloud gateway自定义错误处理Handler

AbstractErrorWebExceptionHandler实现了ErrorWebExceptionHandler接口,其中handle方法是其核心方法。// 判断response是否已经提交,并且调用isDisconnectedClientError方法判断是否是客户端断开连接。// 如果已经断开连接,已经无法将消息发送给客户端,直接Mono.error(throwable)抛出异常。if (!

BASK2312的博客 3922

springcloud-限流(gateway、sentinel)

springcloud-限流 限流算法 计数器 每个单位时间能通过的请求数固定,超过阈值直接拒绝。 通过维护一个单位时间内的计数器,每次请求计数器加1,当单位时间内计数器累加到大于设定的阈值,则之后的请求都被绝,直到单位时间已经过去,再将计数器重置为零。 漏桶算法 维持一个队列,所有请求先进队列,然后从队列取出请求的速率是固定。【保护请求】 漏桶算法可以很好地限制容量池的大小,从而防止流量暴增。漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 在网络中,

hi_你好 4608

JavaWeb试题库管理系统:从数据库设计到Tomcat部署的完整实战

JavaWeb技术栈基于Servlet、JSP与JDBC构建动态Web应用,通过MVC分层架构实现请求处理、业务逻辑与数据访问的解耦。其核心价值在于完整暴露HTTP请求生命周期与数据库交互细节,适合需要深入理解底层原理的课程设计场景。在试题库管理系统中,MySQL表结构设计、连接池配置与分页查询是关键技术点,同时需解决IDEA运行JavaWeb项目时的Tomcat部署与中文乱码等常见问题。掌握这些基础能力后,可进一步实现组卷算法与权限拦截,形成一套可演示、可答辩的完整项目源码与笔记。

weixin_34015336的博客 517

网关 Spring Cloud Gateway 统一全局异常处理

前言 自定义异常处理逻辑 覆盖默认的配置 1. 异常时如何返回 JSON 而不是 HTML? 2. getHttpStatus 需要重写 验证 本文Spring Cloud Gateway 版本:2020.0.0 前言 Spring Cloud Gateway异常默认返回如下: 浏览器访问:

laker的博客 1万+

详解SpringCloud Finchley Gateway 统一异常处理

主要介绍了详解SpringCloud Finchley Gateway 统一异常处理,非常具有实用价值,需要的朋友可以参考下

Spring Cloud Gateway 全局异常处理

文章目录Spring Cloud Gateway 全局异常处理范例示例:修改前抛出一个运行时异常示例:全局异常处理抛出一个运行时异常如何添加自定义异常处理配置全局异常处理监听器总结 Spring Cloud Gateway 全局异常处理 统一异常捕获,并格式化为“code” + “message”的JSON字符串返回给Gateway上游服务。 范例 示例:修改前抛出一个运行时异常 { &quot;tim...

Genius only means hard-working all one's life. 9592

1.STM32H743VGT6最小系统板

此款MCU具备较大算力进行频谱运算,为复杂数据运算提供更高效的保障。该MCU具备REV-V和REV-Y两个型号,后者为新版本。

Audiation88的博客 3793

分辨率太小 / Retina 模糊 / 全屏异常:一篇解决 VMware Fusion + Kali 显示问题(Xfce & GNOME 通用)

本文提供了在Mac(尤其是Retina屏)上运行Kali Linux时常见显示问题的完整解决方案。主要解决三类问题:分辨率太小、Retina屏模糊和全屏异常。核心思路是先安装open-vm-tools-desktop并重启,这是90%问题的根源。然后根据不同问题分别处理:调整DPI/Scale解决字体大小,避免双重缩放导致的模糊,以及通过窗口拉伸和重启解决全屏异常。文章还给出了针对Xfce和GNOME的最佳配置建议,并强调调试完成后应创建快照以便快速恢复。最后提供了速查表,方便用户快速参考关键步骤。

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 874

SpringCloud极简入门|Spring Cloud Gateway 的全局异常处理 (8)

篇章要点 本文将介绍Spring Cloud Gateway如何处理全局异常,统一处理经过路由的异常(返回前端json格式) 场景描述  新建 路由Gateway模块:8100和 生产者模块8012(有个test方法) 正常流程访问http://localhost:8100/api8/test ,此时路由转发返回正常数据 但是,但是,如果此时生产者宕机了(假如哈) ,路由 不配置异常...

十年呵护的专栏 2850

如何在 Windows 11 上安装 ChatGPT:CMD + 图形界面两种方式

我没说在 Windows 11 上装 ChatGPT 应用有多难,但你要是知道有哪几种官方途径可用,事情就会顺一点,尤其是对新手。对大多数用户来说,商店应用就是正确的选择。如果你在受管理的设备上,或者想避开商店,那么通过 Edge 或 Chrome 装 PWA 是完全站得住脚的替代方案。不管你选哪条路,真正的收获都是把 ChatGPT 从浏览器标签页里挪出来,放进一个它真正像个工具的地方。把它固定到任务栏、配好 Alt + 空格,你就会纳闷以前没它是怎么干活的。

山岚的运维笔记 289

Spring Cloud Gateway的全局异常处理

Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求。 网关都是给接口做代理转发的,后端对应的都是REST API,返回数据格式都是JSON。如果不做处理,当发生异常时,Gateway默认给出的错误信息是页面,不方便前端进行异常处理。 需要对异常信息进行处理,返回JSO...

u010889990的专栏 2万+

KG²RAG框架:知识图谱增强大模型检索生成技术解析

知识图谱(Knowledge Graph)作为结构化知识表示的重要方式,与向量检索技术结合形成了新一代检索增强生成(RAG)框架。其核心原理是通过图神经网络编码器提取子图特征,并与文本向量空间对齐,实现结构化与非结构化知识的协同检索。这种技术显著提升了专业领域问答的事实准确性,在医疗诊断、金融分析等需要高可靠性响应的场景中具有重要价值。KG²RAG框架创新性地采用双通道处理架构,结合Neo4j等图数据库与Milvus向量数据库,通过动态检索调度器智能选择最优检索路径。实测表明该方案能降低40%以上的事实错误

weixin_29306875的博客 104

小论文/大论文必备 | YOLO多模态目标检测、绘制曲线对比图 | 引入多种绘制曲线对比图,包括mAP0.5,mAP0.5:0.95,Loss损失变化的曲线对比

本文通过可视化方法分析YOLO多模态模型的训练过程,对比不同实验的检测精度和损失函数变化。主要内容包括:1)绘制mAP@0.5和mAP@0.5:0.95曲线评估检测精度;2)分析边界框回归损失(box_loss)、分类损失(cls_loss)和分布式损失(dfl_loss)的收敛趋势;3)提供完整的Python代码实现,支持多实验对比,可生成高清曲线图。该方法能直观展示模型训练效果,便于优化策略评估和参数调优。

Ai缝合怪、助力小伙伴高效发论文 260

SpringCloud Gateway 详解

文章目录一、网关简介1、服务网关介绍1.1 API网关介绍1.2 网关主要功能2、常用网关介绍2.1 Nginx+Lua2.2 Kong2.3 Traefik2.4 Zuul二、SpringCloud Gateway介绍1、GateWay模型2、SPringCloud Gateway特征3、三大核心概念4、工作流程三、环境搭建初体验、1、简介2、模块搭建2.1 搭建父模块2.2 创建消费者子模块2.3 创建网关子模块2.4 启动体验四、Gateway配置详解1、路由规则1.1 介绍1.2 Datetime1

Shawn的个人博客 5618

【Unity Shader】Special Effects(十二)Glow 外发光(UI)

Properties_GlowColor ("外发光颜色", Color) = (0, 0, 0, 1)_GlowIntensity("外发光强度", Range(0, 1)) = 1参数详解:_GlowColor:外发光颜色,指定外发光的显示颜色。_GlowIntensity:外发光强度,指定外发光的显示强度,0为不可见,1为最强强度。

神码编程 931

springcloud中服务提供者进行统一异常处理

我的项目中,使用nacos作为服务发现与注册中心,请求通过gateway网关匹配url请求不同的api服务,api服务根据服务名请求具体的服务。gateway中利用webflux进行了异常处理,主要针对api不可达的异常。api中利用sentline及fegin的fallback进行了异常的处理。在具体的服务时,想要自定义一些异常,并且进行统一的捕获并返回,且返回的数据格式需要与正常的一致,避免给...

蓝色格子ren的博客 2105

VTK GPU 加速渲染技术

/ 创建颜色工具// 创建立方体数据// 创建OpenGL映射器(注意使用vtkOpenGLPolyDataMapper而不是常规的vtkPolyDataMapper)// 启用VBO(顶点缓冲对象)// 声明几何体是静态的以获得最佳性能// 创建actor// 创建渲染器、渲染窗口和交互器renderWindow->SetWindowName("VTK自定义着色器示例");// 添加actor到渲染器。

深之JohnChen的专栏 1240

第14.1章 高翔博士2025年11月最新开源框架Lightning-LM源码学习解读(一):激光-IMU定位+建图算法各模块简介

Lightning-LM:高效激光SLAM定位系统 该框架基于模块化设计,通过激光-IMU融合实现快速建图与定位,核心特点包括: 极速性能:纯CPU运行(建图1.2核/定位0.8核) 模块化架构:包含激光里程计(LIO)、地图管理、回环检测等独立模块 动态场景支持:地图分块加载、动静态图层分离 多模式适配:支持ROS2环境下的在线/离线运行 关键模块包括前端里程计(core/lio)、2D/3D地图转换(core/g2p5)、轻量优化库(core/miao)等,通过系统控制器(core/system)协调流

行知SLAM 2435

Spring Cloud Gateway中异常处理

最近我们的项目在考虑使用Gateway,考虑使用Spring Cloud Gateway,发现网关的异常处理和spring boot 单体应用异常处理还是有很大区别的。让我们来回顾一下异常。 关于异常是拿来干什么的,很多人老程序员认为就是拿来我们Debug的时候排错的,当然这一点确实是异常机制非常大的一个好处,但异常机制包含着更多的意义。 关注业务实现。异常机制使得业务代码与异常处理代码...

weixin_30697239的博客 738

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SpringCloud Gateway

SpringCloud Gateway中文官方文档:https://cloud.tencent.com/developer/article/1403887 SpringCloud Gateway官方文档:https://spring.io/projects/spring-cloud-gateway#overview 为什么要有网关 什么是网关? API网关是一个服务器,是系统对外的唯一入口。API网关封装了系统内部架构,为每个客户端提供一个定制的API。API网关方式的核心要点是:所有的客户端和消费

好记性不如烂笔头 1397

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringCloud之Gateway统一网关

Gateway网关可以帮助处理一些校验的问题。并不是所有的请求都可以请求到资源路径,以及做一些身份验证等等。断言我们可以认为它是一种判断规则,根据断言来分配到相应规则的路由目标地址。这里面的路由规则绝不是只有路径的匹配,还有相关的过滤规则等等。 分配搭配相应的目标地址后我们会调用相关的微服务,这里微服务会有一个负载均衡的过程,因为一个服务可能会纯在多个实例,这里会进行负载均衡。我们请求到对应的微服务实例后就可以访问或者说请求到数据。...

jgdabc的博客 948

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SpringCloud Gateway 修改响应体(统一前端响应格式)

在全网找了好几天,又去springcloud的issue中翻阅,也没有真正说该怎么写的,都是各种方式操作流,要么就是说参考ModifyRequestBodyGatewayFilterFactory。。 版本: springboot 2.0.6 springcloudFinchley.SR2 hutool4.4.2 lombok 主要参考:ModifyRequestBod...

Cash Blog 1万+

SpringCloud Finchley Gateway 统一异常处理

SpringCloud Finchley Gateway 统一异常处理 全文搜索[@@]搜索重点内容标记 1 . 问题:使用SpringCloud Gateway时,会出现各种系统级异常,默认返回HTML. 2 . Finchley版本的Gateway,使用WebFlux形式作为底层框架,而不是Servlet容器,所以常规的异常处理无法...

weixin_34023863的博客 1202
上一篇: springcloud gateway整合swagger做分布式聚合文档
下一篇: springcloud中服务提供者进行统一异常处理
蓝色格子
博客等级 码龄9年 129粉丝 174原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值