SpringBoot使用AOP导致dubbo服务不注册
Posted 胡玉洋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot使用AOP导致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也可以正常工作。
以上是关于SpringBoot使用AOP导致dubbo服务不注册的主要内容,如果未能解决你的问题,请参考以下文章
解决dubbo的服务发布注解@service不能和事务注解不能共用的方案
springboot自定义注解AOP在controller上时导致controller注入失败的问题