Springboot 整合 dubbo 的一些坑

简介: 最近在做一个分布式的web系统,用的boot+dubbo,中间碰到不少坑,最近碰到的坑可是坑了我三四天,把坑都给大家捎带分享一下,希望能少走弯路。1. 坑一:与jpa的不兼容如果你想写这样的jpasql @Query("select g.userIdentity from GroupMembers g where g.userId=?1 and g.groupId=?2") int selectIndentity(Integer userId,Integer groupId);恭喜你,你可以成功的运行它。

最近在做一个分布式的web系统,用的boot+dubbo,中间碰到不少坑,最近碰到的坑可是坑了我三四天,把坑都给大家捎带分享一下,希望能少走弯路。

1. 坑一:与jpa的不兼容

如果你想写这样的jpasql

    @Query("select g.userIdentity from  GroupMembers g where g.userId=?1 and g.groupId=?2")
    int selectIndentity(Integer userId,Integer groupId);

恭喜你,你可以成功的运行它。但是如果你想要这样

    @Transactional
    @Modifying
    @Query("update GroupMembers g set g.userIdentity=1 where g.userId=?1 and g.groupId=?2")
    int updateIdentity(Integer userId,Integer groupId);

那么,对不起!你不可以。如果这样做,你会发现你注册不了服务,消费者也相应的得到nullpointexception异常,这一点你可以在dubbo-admin中清晰的看到--没有提供服务。但是单独一个模块跑起来是没有问题的,测试也没有问题的,就是注册不进去~~

想知道为啥的请看第二点~

2. 坑二:service层加事务报空指针

截图我不发了,我可不想把事发场景还原,毕竟花了我几天的精力和头皮营养。

之所以说这个bug费时费力,是因为这个项目可以运行,测试全都通过,但是就是注册不进去dubbo,配置和别的模块一模一样也无动于衷!就是注册不进去dubbo,就是注册不进去dubbo,就是注册不进去dubbo.

为什么呢?为什么呢?

如果给service层加事务,同样服务也注册不进dubbo,那web层的调用当然也是返回空指针。那原因是为什么呢?

我们看一下dubbo的@Service这个注解源码:


package com.alibaba.dubbo.config.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Service {
    Class<?> interfaceClass() default void.class;

    String interfaceName() default "";

    String version() default "";

    String group() default "";

    String path() default "";

    boolean export() default false;

    String token() default "";

    boolean deprecated() default false;

    boolean dynamic() default false;

    String accesslog() default "";

    int executes() default 0;

    boolean register() default false;

    int weight() default 0;

    String document() default "";

    int delay() default 0;

    String local() default "";

    String stub() default "";

    String cluster() default "";

    String proxy() default "";

    int connections() default 0;

    int callbacks() default 0;

    String onconnect() default "";

    String ondisconnect() default "";

    String owner() default "";

    String layer() default "";

    int retries() default 0;

    String loadbalance() default "";

    boolean async() default false;

    int actives() default 0;

    boolean sent() default false;

    String mock() default "";

    String validation() default "";

    int timeout() default 0;

    String cache() default "";

    String[] filter() default {};

    String[] listener() default {};

    String[] parameters() default {};

    String application() default "";

    String module() default "";

    String provider() default "";

    String[] protocol() default {};

    String monitor() default "";

    String[] registry() default {};
}

发现它不支持被子类继承,所以dubbo扫描的时候不能够扫到被注解的服务。

解决方案:修改Service源码

怎么修改呢。我们找到Service这个注解类,位于com.alibaba.dubbo.config.annotation;

1. 给它添加一个注解@Inherited
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
2. 重编译生成class文件

这个不用说了吧 javac Service.java.
然后把class覆盖上去。

3. maven项目扔到服务器又变了啊

所以,我们需要把这个单独作为jar包放到项目中。然后maven引用本地jar,而不是从仓库中获取。

        <dependency>
            <groupId>com.xxx</groupId>
            <!--自定义-->
            <artifactId>xxxx</artifactId>
            <!--自定义-->
            <version>1.0</version>
            <!--自定义-->
            <scope>system</scope>
            <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
            <systemPath>${pom.basedir}/src/main/webapp/WEB-INF/lib/xxx-xxx.jar</systemPath>
            <!--项目根目录下的lib文件夹下-->
        </dependency>
4. 修改后遗症

如果你真的像我上面所讲的修改了dubbo的Service类,那你注册的时候会发现一个问题,也是找不到服务,但是这次不一样了,你如果在dubbo-admin上看就很清楚。


img_4f6cef14bd9baf0210bd4b5313de6a77.png

天呐,服务名是springProxy,所以我们修改了源码后必须要手动生命Service名称。@Service(interfaceName="com.xx.xxx.service.xxx")

坑一坑二的总结

个人认为坑一坑二是同一个问题,jpa出了问题后因为时间关系我还是尽快选择了mybatis替代的方案,所以解决了坑二后并没有去试坑一是否能解决。不过想想,jpa的修改必须要@Modifying 和事务,在原生的dubbo的@Service注解下都是不认识的,可能会有用。试过的小伙伴可以在评论分享下你的成果,谢谢!

3. 坑三:service层缓存报异常

我忘了是什么错了,没有及时记录下来,当时在网上查,前辈说的是因为加了redis后service接口不符合dubbo规范,也就是dubbo不能识别这个接口,所以我最终把cache的实现放在了controller里。

最完美的解决方案:最新官方版的SpringBoot 整合 Dubbo

相关文章
|
7月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
1月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
49 1
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
152 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
4月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
113 0
|
6月前
|
Dubbo Java 应用服务中间件
Spring Boot 调用 Dubbo 接口与编写 Dubbo 接口实战
Spring Boot 调用 Dubbo 接口与编写 Dubbo 接口实战
712 1
|
5月前
|
消息中间件 Java 数据库连接
理解java的springboot+mybatisplus+dubbo+nacos+kafka这一套技术栈
理解java的springboot+mybatisplus+dubbo+nacos+kafka这一套技术栈
106 0
|
7月前
|
SQL 监控 Java
nacos常见问题之dubbo+nacos+springboot3的native打包成功后运行出现异常如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
405 2
|
7月前
|
Dubbo Java 应用服务中间件
Spring Boot整合Dubbo+Zookeeper实现RPC调用
Spring Boot整合Dubbo+Zookeeper实现RPC调用 技术栈说明 Dubbo:Dubbo作为RPC框架,能在多个服务之间实现远程服务的调用。比如有两个独立的微服务A和B,A服务想要调用B服务时,因为两者不在同个内存空间中,不能直接调用,所以可以通过Dubbo实现这点。 功能和Spring Cloud的Feign相同,两者都是应用于微服务架构的远程调用框架 Zookeeper:作为注册中心去管理Dubbo服务,这点和Eureka、Nacos相同。 概述 通过一个示例说明Dubbo+Zookeeper在Spring Boot中的应用。 现有两个服务provider和con
192 4
|
2月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
69 2
|
4月前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
89 0
下一篇
DataWorks