SpringBoot使用AOP导致dubbo服务不注册

简介: 在搭建SpringBoot项目的时候,原本已经集成了Dubbo并且测试也没问题,在加AOP的时候,发现Dubbo的provider不注册了。说明一下,本着极简原则,Dubbo的provider在这里用@Service注解来发布服务,并没有使用xml配置的方式。这时用的springboot和dubbo的版本为:

问题


在搭建SpringBoot项目的时候,原本已经集成了Dubbo并且测试也没问题,在加AOP的时候,发现Dubbo的provider不注册了。说明一下,本着极简原则,Dubbo的provider在这里用@Service注解来发布服务,并没有使用xml配置的方式。

这时用的springboot和dubbo的版本为:


SpringBoot版本:1.5.1.RELEASE
io.dubbo.springbootb版本1.0.0(Dubbo版本:2.5.3)


原因排查


1.5.1.RELEASE版本的springboot依赖的spring版本为4.3.6.RELEASE,之前用4.3.6.RELEASE版本的spring和2.5.3版本的dubbo结合也没问题啊,那么和之前搭建的项目唯一的区别就是之前都用xml来配置dubbo,这次用了注解,于是用xml配置的方式配置了一下dubbo,加上AOP,可以正常发布服务,所以可能问题就出在“dubbo的@Service注解和AOP的结合”上。


在这里顺便复习一下Spring的AOP(静态代理与动态代理 ; Spring AOP原理及其实现)


Spring AOP的原理就是为扫描到的类动态生成一个代理类(jdk生成的代理类与被代理类共同实现一个接口;cglib生成的代理类就是被代理类的子类),先记录一下解决这个问题的方法,下面抽时间再来补上原理。

// TODO : Spring AOP 为带@Service的dubbo服务生成代理类的原理分析

解决方法


1、前面也尝试到,如果用xml配置dubbo,就可以正常发布服务,因此可以直接用xml配置dubbo服务来解决这个问题。


2、但如果还是想用dubbo的@Service注解来发布服务,需要升级一下dubbo的版本。在AOP的作用下发布服务不成功是dubbo老版本的一个bug,在2.6.*已经被修复。但springboot和dubbo结合时需要用到io.dubbo.springboot的依赖,io.dubbo.springboot目前只有1.0.0版本,且这个版本依赖的dubbo是2.5.3,所以需要在引用io.dubbo.springboot之后排除dubbo的引用,再重新引用一下2.6.*版本的dubbo:


<!--添加io.dubbo.springboot依赖-->
<dependency>
     <groupId>io.dubbo.springboot</groupId>
     <artifactId>spring-boot-starter-dubbo</artifactId>
     <version>1.0.0</version>
     <exclusions>
         <!--去除dubbo依赖-->
         <exclusion>
          <groupId>com.alibaba</groupId>
               <artifactId>dubbo</artifactId>
         </exclusion>
    </exclusions>
</dependency>
<!--重新添加2.6.2的dubbo依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.2</version>
</dependency>

然后在@Service注解中,添加该服务提供者所实现接口的类型


@org.springframework.stereotype.Service("userService")
@com.alibaba.dubbo.config.annotation.Service(version = "1.0.0", interfaceClass = UserService.class)
public class UserServiceImpl implements UserService {
   //……
}

这时就可以成功发布dubbo服务了,AOP也可以正常工作。

相关文章
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
826 6
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
1342 8
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
1884 0
|
Java 开发者 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
662 0
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
1425 5
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
833 1
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
508 1
|
Dubbo Java 应用服务中间件
SpringBoot——SpringBoot集成Dubbo
SpringBoot——SpringBoot集成Dubbo
1875 0
SpringBoot——SpringBoot集成Dubbo
|
Dubbo Java 应用服务中间件
springboot 集成dubbo
springboot 集成dubbo
springboot 集成dubbo
|
11月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。