开发者社区 > 云原生 > 正文

dubbo2.7.5+,如何做dubbo线程池监控

环境

Dubbo version: 2.7.5+ Operating System version: centos Java version: 1.8

问题

dubbo2.7.5以前,可以通过DataStore来获取

   DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension();
   Map<String, Object> providerExecutors = dataStore.get(EXECUTOR_SERVICE_COMPONENT_KEY);

具体DataStore.put(xxx,xxxExecutorService)的逻辑,是在WrappedChannelHandler内部。

WrappedChannelHandler(dubbo2.7.5以下版本)如图:

提问81.png

但是dubbo2.7.5以上版本,去掉了DataStore.put(xxx,xxxExecutorService)的逻辑,无法再通过datastore获取。内部线程池通过

ExecutorRepository来统一管理,其中包含了port:线程池的map,如下:

private ConcurrentMap<String, ConcurrentMap<Integer, ExecutorService>> data = new ConcurrentHashMap<>();

DefaultExecutorRepository 内部线程池 如图:

提问82.png

我理解是使用threadless线程模式,才调整这部分逻辑。但provider端默认是fixed类型线程池,实际是可以做线程池监控的。

请问,有什么官方推荐方式获取provider端(主要)/consumer端的线程池信息么?

原提问者GitHub用户FennZheng

展开
收起
大圣东游 2023-05-11 20:12:33 408 0
1 条回答
写回答
取消 提交回答
  • 可以通过如下方式获取

    ExtensionLoader.getExtensionLoader(ExecutorRepository.class).getDefaultExtension().getExecutor(url)

    现在用的是url的端口号做key,你可以看下源码。所以要注意url的端口号是否改变了,否则获取不到线程池。

    消费者用的是业务线程,dubbo无法监控

    原回答者GitHub用户XiaoWeiKIN

    2023-05-12 12:11:29
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Dubbo开源现状与2.7规划 立即下载
Dubbo分布式服务治理实战 立即下载
《Dubbo 3.0 前瞻》 立即下载