问题
在搭建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也可以正常工作。