【踩坑记录】SpringBoot 3 统一处理 dubbo 3 接口异常和错误

问题描述

项目环境:

  • JDK 17
  • Spring Boot 3.0.4
  • Dubbo 3.2.0-beta.3
  • Spring Cloud 2022.0.0
  • Spring Cloud Alibaba 2022.0.0.0-RC1

最近在学习Dubbo的时候,按照之前的习惯定义了自定义异常和统一异常处理,但是在进行接口测试的时候,发现并不是自定义的异常处理,而是被当做系统异常进行了处理。
在这里插入图片描述

出现原因

经过搜索之后发现,dubbo提供了异常处理的类ExceptionFilter(org.apache.dubbo.rpc.filter.ExceptionFilter),大概功能就是对指定的一些异常放行,然后其他异常统一包装成RuntimeException返回。所以在异常处理的时候会按照 RuntimeException 进行处理。

解决方案

所以按照网上的方案,重写一个过滤器,让异常通过我们自己实现的过滤器,这样就可以对自定义异常进行放行处理。
网上常见的方法是新建一个 Filter 类,继承 ExceptionFilter 类,重写 invoke()方法。然后新增配置,大概参考这篇博客,:
https://www.cnblogs.com/fnlingnzb-learner/p/16810063.html

但是按照这样实现之后,自定义异常仍然不能被正常处理,所以就开始继续debug。

问题分析

在经过debug和源码的阅读之后发现,虽然异常进入了自己写的过滤器,但是最后还是会回到 ExceptionFilter 类中的 onResponse() 方法中去,并且也是在这里被包装成 RuntimeException
在这里插入图片描述
所以大概是 Dubbo 3 修改了很多源码(回过头发现和之前网上的解决方案中的源码确实不同),导致之前的写法不能生效了,所以最后在自定义过滤器中重写了 onResponse() 方法,测试发现可以正常进行自定义异常的处理了。

完整解决方案

  1. 新建 DubboExceptionFilter 类,注意修改内容
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.filter.ExceptionFilter;

@Activate(group = CommonConstants.PROVIDER)
public class DubboExceptionFilter extends ExceptionFilter {

    @Override
    public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
        // 如果有异常
        if (appResponse.hasException() && GenericService.class != invoker.getInterface()) {
            // 获取抛出的异常
            Throwable exception = appResponse.getException();
            String classname = exception.getClass().getName();
            // 如果是自定义异常,直接抛出
            if (classname.startsWith("top.flobby.live.common.exception")) {
                return;
            }
            // 如果是其他异常,使用Dubbo的业务进行处理
            super.onResponse(appResponse, invoker, invocation);
        }
    }
}
  1. resources目录下新建META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
    = 前面的只是一个表示,叫什么都可以
    = 后面的是刚刚新建的过滤器全路径
DubboExceptionFilter=xxx.xxx.filter.DubboExceptionFilter
  1. 对应的Dubbo服务提供者的配置文件新增以下内容,这里是yml格式
dubbo:
  ... 其他配置
  provider:
    filter: DubboExceptionFilter,-exception

效果展示

在这里插入图片描述

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot 集成 Nacos 和 Dubbo3 可以按照以下步骤进行: 1. 首先,在 Spring Boot 项目中添加 Nacos 和 Dubbo3 的依赖项。可以使用 Maven 或 Gradle 等构建工具,将以下依赖项添加到项目中: ``` <!-- Nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- Dubbo3 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.0.1</version> </dependency> ``` 2. 在应用程序主类上添加 @EnableDiscoveryClient 注解,以启用 Nacos 服务发现功能。例如: ``` @SpringBootApplication @EnableDiscoveryClient public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 3. 在 application.properties 或 application.yml 文件中配置 Nacos 服务注册中心的地址和端口,例如: ``` spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 ``` 4. 在 Dubbo 服务接口上添加 @DubboService 注解,以将服务注册到 Nacos 注册中心。例如: ``` @DubboService public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { return "Hello " + name; } } ``` 5. 在 Dubbo 服务消费者中添加 @DubboReference 注解,以从 Nacos 注册中心中查找 Dubbo 服务。例如: ``` @RestController public class DemoController { @DubboReference private DemoService demoService; @GetMapping("/hello") public String hello(@RequestParam String name) { return demoService.sayHello(name); } } ``` 这些步骤将使您的 Spring Boot 应用程序能够集成 Nacos 和 Dubbo3,并使服务发现和消费变得更加容易。 ### 回答2: Spring Boot是一种基于Spring框架的开发工具,它简化了Spring应用程序的开发和部署过程。Nacos是一个开源的服务注册和发现中心,而Dubbo是一个高性能的分布式服务框架。下面是关于如何将Spring Boot集成Nacos和Dubbo 3的步骤: 1. 集成Nacos:首先,在pom.xml文件中添加Nacos和Spring Boot相关的依赖项。然后,在Spring Boot的配置文件中配置Nacos的地址、端口和其他相关配置信息。接下来,在Spring Boot的启动类上添加@EnableDiscoveryClient注解,以启用Nacos的服务注册和发现功能。 2. 集成Dubbo 3:首先,在pom.xml文件中添加DubboSpring Boot相关的依赖项。然后,在Spring Boot的配置文件中配置Dubbo的注册中心地址、端口和其他相关配置信息。接下来,在需要暴露为Dubbo服务的类或接口上添加@DubboService注解,以将其作为Dubbo服务进行注册。同时,在需要调用Dubbo服务的类中添加@DubboReference注解,以引用Dubbo服务。 通过上述步骤,我们成功将Nacos和Dubbo 3集成到Spring Boot应用程序中。这样,我们可以使用Nacos作为服务注册和发现中心,将Dubbo服务注册到Nacos,并通过Dubbo进行远程调用。这种集成能够极大地简化微服务架构中的服务注册、发现和远程调用过程,提高系统的可扩展性和灵活性。 ### 回答3: Spring Boot 是一个快速开发框架,它可以简化 Java 应用程序的构建过程。Nacos 是阿里巴巴开源的一款服务发现和配置管理工具,Dubbo 是阿里巴巴开源的一款高性能的分布式服务框架。 在 Spring Boot 中集成 Nacos 和 Dubbo3 非常简单。首先,我们需要在项目的 pom.xml 文件中引入相应的依赖。我们可以使用 spring-cloud-alibaba-dependencies 父级依赖管理来简化依赖的管理。 接下来,我们需要在 application.properties 文件中进行相应的配置。我们需要配置 Nacos 的服务注册中心地址和 Dubbo 的注册中心地址以及其他相关参数。 然后,我们需要创建 Dubbo 的服务提供者和消费者。服务提供者可以使用 @DubboService 注解将服务发布到 Dubbo 的注册中心,消费者可以使用 @DubboReference 注解引用服务。 最后,我们可以在 Spring Boot 的启动类中使用 @EnableDubbo 注解启用 Dubbo 功能,并运行 Spring Boot 应用程序。 通过以上步骤,我们就成功地集成了 Nacos 和 Dubbo3 到 Spring Boot 中。使用 Nacos 来进行服务的注册和发现,并使用 Dubbo3 来实现服务之间的远程调用。 总的来说,集成 Nacos 和 Dubbo3 可以帮助我们更好地构建和管理分布式系统,提高系统的可伸缩性和可维护性。同时,Spring Boot 作为一个快速开发框架,能够进一步简化我们的开发流程,提高开发效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值