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也可以正常工作。

相关文章
|
2月前
|
JSON Java 网络架构
elasticsearch学习四:使用springboot整合 rest 进行搭建elasticsearch服务
这篇文章介绍了如何使用Spring Boot整合REST方式来搭建和操作Elasticsearch服务。
130 4
elasticsearch学习四:使用springboot整合 rest 进行搭建elasticsearch服务
|
28天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
38 1
|
3月前
|
缓存 前端开发 Java
springboot 的单体服务 字典参数转译
本文介绍了如何在Spring Boot项目中使用缓存来管理字典参数,并确保前后端数据一致性。首先,通过`@EnableCaching`启用缓存功能,接着创建一个自定义的字典缓存类`DicCache`。然后,通过配置类将`DicCache`添加到`cacheManager`中。此外,对字典服务进行改造,使用`@CachePut`和`@CacheEvict`注解保证数据一致性。最后,实现自定义注解`@DicSerializer`和序列化处理类`DictSerializerHandel`,用于在序列化过程中自动转换字典值。通过这种方式,可最小化代码改动并提高系统性能。
springboot 的单体服务 字典参数转译
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
100 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
2月前
|
自然语言处理 Java Maven
elasticsearch学习二:使用springboot整合TransportClient 进行搭建elasticsearch服务
这篇博客介绍了如何使用Spring Boot整合TransportClient搭建Elasticsearch服务,包括项目创建、Maven依赖、业务代码和测试示例。
107 0
elasticsearch学习二:使用springboot整合TransportClient 进行搭建elasticsearch服务
|
2月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
68 2
|
4月前
|
小程序 JavaScript Java
微信小程序+SpringBoot接入后台服务,接口数据来自后端
这篇文章介绍了如何将微信小程序与SpringBoot后端服务进行数据交互,包括后端接口的编写、小程序获取接口数据的方法,以及数据在小程序中的展示。同时,还涉及到了使用Vue搭建后台管理系统,方便数据的查看和管理。
微信小程序+SpringBoot接入后台服务,接口数据来自后端
|
Web App开发 消息中间件 Prometheus
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!(一)
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!
|
JSON 监控 安全
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!(二)
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!
|
Prometheus 监控 Cloud Native
SpringBoot服务监控机制,总算整明白了!
SpringBoot服务监控机制,总算整明白了!
SpringBoot服务监控机制,总算整明白了!