Dubbo应用与异常记录

简介: 结合项目里使用暴露出的问题,对并发较多的核心业务或者对请求失败等敏感的业务场景不太建议使用Dubbo, 如电商的购买等行为,使用Dubbo就必须阅读源码,熟悉相关机制,或者直接自己造轮子。

结合项目里使用暴露出的问题,对并发较多的核心业务或者对请求失败等敏感的业务场景不太建议使用Dubbo,

如电商的购买等行为,使用Dubbo就必须阅读源码,熟悉相关机制,或者直接自己造轮子。

1.使用Dubbo踩过的坑

(1)Spring Cache在Service层对消费者不起作用
原因是:Spring容器还未加载完,就在Dubbo中暴露服务导致Cache的AOP不可用。因此需要将服务放在Spring容器加载完后再暴露。

(2)Dubbo对方法重载支持有问题

如果让hessian支持调用重载方法需要isOverloadEnabled()设为false。


2.Dubbo常见异常和错误

(1)调用超时com.alibaba.dubbo.remoting.TimeoutException异常
通常是业务处理太慢,可在服务提供方执行:jstack PID > jstack.log 分析线程都卡在哪个方法调用上,这里就是慢的原因。
如果不能调优性能,请将timeout设大。

(2)出现java.util.concurrent.RejectedExecutionException或者Thread pool exhausted

RejectedExecutionException表示线程池已经达到最大值,并且没有空闲连,拒绝执行了一些任务。
Thread pool exhausted通常是min和max不一样大时,表示当前已创建的连接用完,进行了一次扩充,创建了新线程,但不影响运行。
原因可能是连接池不够用,请调整dubbo.properites中的:

1
2
3
// 设成一样大,减少线程池收缩开销
dubbo.service.min.thread.pool.size= 200
dubbo.service.max.thread.pool.size= 200

  

3.dubbo如何正确关闭Spring容器

Dubbo是通过JDK的ShutdownHook来完成优雅停机的,所以如果用户使用"kill -9 PID"等强制关闭指令,是不会执行优雅停机的,只有通过"kill PID"时,才会执行。
服务提供方停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。
然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。
服务消费方停止时,不再发起新的调用请求,所有新的调用在客户端即报错。
然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。
设置优雅停机超时时间,缺省超时时间是10秒:(超时则强制关闭)

1
2
3
<dubbo:application ...>
     <dubbo:parameter key= "shutdown.timeout"  value= "60000"  /> <!-- 单位毫秒 -->
</dubbo:application>

看一下源码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if  ( "true" .equals(System.getProperty( "dubbo.shutdown.hook" ))) {
         Runtime.getRuntime().addShutdownHook( new  Thread() {
           public  void  run() {
             for  (Container container :  this .val$containers) {
               try  {
                 container.stop();
                 Main.logger.info( "Dubbo "  + container.getClass().getSimpleName() +  " stopped!" );
               catch  (Throwable t) {
                 Main.logger.error(t.getMessage(), t);
               }
               synchronized  (Main. class ) {
                 Main.access$ 102 ( false );
                 Main. class .notify();
               }
             }
           }
         });
       }

 


目录
相关文章
|
Java 应用服务中间件 测试技术
微服务技术系列教程(11) - SpringBoot - 性能优化
微服务技术系列教程(11) - SpringBoot - 性能优化
298 0
|
存储
负载因子(Load Factor)
负载因子(Load Factor)是一个用于衡量散列表(如哈希表)填充程度的参数。它表示在散列表中,当插入一个新的键值对时,可以允许的最大填充程度。负载因子越大,
2191 2
|
6月前
|
人工智能 运维 API
2026年阿里云无影云电脑部署OpenClaw(Clawdbot)新手小白保姆级教程
在AI自动化办公飞速普及的2026年,OpenClaw(原Clawdbot、Moltbot)凭借“零编程门槛、自然语言驱动、主动执行任务”的核心优势,成为新手小白解锁AI效率的首选工具。作为GitHub星标量超19万的开源AI自动化代理工具,它能替代70%的重复性办公工作——从文档生成、日程提醒,到跨工具协同、简单代码生成,只需一句口语化指令,就能自动完成全流程操作。但此前,很多新手因本地设备配置不足、云环境搭建繁琐、依赖调试复杂等问题,对OpenClaw望而却步,即便有基础教程,也常常因专业术语晦涩、步骤不细致而半途而废。
1192 7
|
Java Maven 开发者
maven项目中官方setting.xml文件
`settings.xml` 是 Maven 的配置文件,用于定义用户或全局级别的构建行为。它包含本地仓库路径、网络代理、服务器认证、仓库镜像及构建配置文件等设置,帮助开发者根据环境定制 Maven 行为,提升构建效率与灵活性。
1705 0
|
存储 自然语言处理 搜索推荐
Elasticsearch 8.10 同义词管理新篇章:引入同义词 API
Elasticsearch 8.10 同义词管理新篇章:引入同义词 API
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
1311 1
|
Java Maven
maven配置settings.xml以及maven常用仓库
maven配置settings.xml以及maven常用仓库
2566 0
|
SQL 存储 消息中间件
快手基于 Apache Flink 的实时数仓建设实践
快手实时数据开发工程师冯立,快手实时数据开发工程师羊艺超,在 Flink Forward Asia 2022 实时湖仓专场的分享。
快手基于 Apache Flink 的实时数仓建设实践
|
存储 分布式计算 Kubernetes
Spark+Celeborn:更快,更稳,更弹性
本文整理自阿里云 EMR Spark 团队的周克勇(一锤),在 Spark&DS Meetup 的分享。
70066 0
Spark+Celeborn:更快,更稳,更弹性