【044】Dubbo3从0到1系列之ExecutorRepository接口详解

文章目录

    • [2.16 ExecutorRepository](#2.16 ExecutorRepository)
      • [2.16.1 核心功能](#2.16.1 核心功能)
      • [2.16.2 核心字段与常量](#2.16.2 核心字段与常量)
      • [2.16.3 核心方法详解](#2.16.3 核心方法详解)
      • [2.16.4 工作原理](#2.16.4 工作原理)
      • [2.16.5 在Dubbo框架中的作用](#2.16.5 在Dubbo框架中的作用)

2.16 ExecutorRepository

在继续分析 AbstractServer 的具体实现类之前,我们先来了解一下 ExecutorRepository 这个接口。

其核心实现类如下所示:

在默认实现当中,维护了一个集合, 该集合缓存已有的线程池.

java 复制代码
private final ConcurrentMap<String, ConcurrentMap<String, ExecutorService>> data = new ConcurrentHashMap<>();
// 第一层 Key 值表示线程池属于 Provider 端还是 Consumer 端,第二层 Key 值表示线程池关联服务的端口。

2.16.1 核心功能

✅ 1. 线程生命周期管理

  • 创建和缓存线程池实例
  • 提供线程池的获取和更新机制
  • 统一销毁所有活跃线程池资源

✅ 2. 多场景线程池支持

  • 客户端和服务端通信线程池
  • 服务导出和引用专用线程池
  • 各类系统级任务专用线程池

✅ 3. 扩展性设计

  • 基于 SPI 机制支持不同管理模式
  • 默认采用隔离(isolation)模式管理线程池

2.16.2 核心字段与常量

java 复制代码
EXECUTOR_MANAGEMENT_MODE_ISOLATION: 默认线程池管理模式,表示按服务隔离线程池

2.16.3 核心方法详解

⬆️ 1. 基础线程池操作

java 复制代码
createExecutorIfAbsent(URL url): 根据 URL 配置创建新线程池,若已存在则返回现有实例
getExecutor(URL url): 获取指定 URL 对应的线程池,具有 getOrDefault 语义
getExecutor(ServiceModel serviceModel, URL url): 结合服务模型获取更精确的线程池
updateThreadpool(URL url, ExecutorService executor): 动态更新线程池参数如核心线程数、最大线程数等

🆕 2. 特定用途线程池

java 复制代码
getServiceExportExecutor(): 获取服务导出过程使用的专用线程池
shutdownServiceExportExecutor(): 关闭服务导出线程池资源
getServiceReferExecutor(): 获取服务引用过程使用的专用线程池
shutdownServiceReferExecutor(): 关闭服务引用线程池资源

✅ 3. 系统级线程池(已废弃)

java 复制代码
多个被标记为 @Deprecated 的方法,建议使用 FrameworkExecutorRepository 替代:
调度线程池系列:nextScheduledExecutor()、getRegistryNotificationExecutor() 等
共享线程池系列:getSharedExecutor()、getSharedScheduledExecutor() 等
特殊任务线程池:getMappingRefreshingExecutor()、getCacheRefreshingScheduledExecutor() 等

🚀 4. 生命周期管理

bash 复制代码
destroyAll(): 销毁所有未处于关闭状态的线程池

✅ 5. 辅导方法

java 复制代码
getExecutorSupport(URL url): 获取执行器支持对象
getInstance(ApplicationModel applicationModel): 获取 ExecutorRepository 实例的静态工厂方法
getMode(ApplicationModel applicationModel): 获取当前应用配置的线程池管理模式

2.16.4 工作原理

✅ 1. SPI扩展机制

java 复制代码
@SPI(value = "isolation", scope = ExtensionScope.APPLICATION)
  • 采用 SPI 扩展点机制,默认实现为 isolation 模式
  • 应用级别单例,保证每个应用拥有独立的线程池管理器

🚀 2. 实例获取机制

通过 getInstance() 方法结合 ExtensionLoader 动态加载具体实现:

  • 从 ApplicationModel 获取配置的管理模式
  • 根据模式名称加载对应扩展实现
  • 若无配置则使用默认扩展

⬆️ 3. 线程池隔离策略

根据不同场景创建和管理独立的线程池,避免任务间相互影响:

  • 按 URL 参数区分不同服务的线程池
  • 为特定操作(如服务导出、引用)提供专用线程池
  • 系统任务与业务任务分离

2.16.5 在Dubbo框架中的作用

⬆️ 1. 资源管理核心组件

  • 作为 Dubbo 并发控制的核心,统一管理系统内所有线程池资源,防止资源泄露和重复创建。

🚀 2. 性能优化支撑

通过合理的线程池隔离和复用机制,提升系统整体性能:

  • 避免频繁创建销毁线程的开销
  • 根据业务特性定制化线程池参数
  • 实现任务隔离,提高系统稳定性

➡️ 3. 扩展性保障

  • 提供了灵活的扩展机制,允许开发者根据实际需求自定义线程池管理策略,满足不同业务场景的需求。

🆕 4. 系统解耦

  • 将线程池管理职责从业务逻辑中剥离,使各模块专注于自身功能实现,降低系统耦合度。
相关推荐
a crazy day3 小时前
Spring相关知识点【详细版】
java·spring·rpc
ANGLAL1 天前
30.分布式事务:本地事务 + RPC 的“隐形炸弹”
分布式·网络协议·rpc
拾忆,想起2 天前
Dubbo跨机房调用实战:从原理到架构的完美解决方案
服务器·网络·网络协议·tcp/ip·架构·dubbo
拾忆,想起2 天前
Dubbo网络延迟全链路排查指南:从微服务“快递”到光速传输
网络·网络协议·微服务·架构·php·dubbo
托尼吴3 天前
REST RPC dubbo,HSF 协议总结
网络协议·rpc·dubbo
JH30733 天前
引依赖包和对这个包发起rpc调用有什么区别
网络·网络协议·rpc
拾忆,想起3 天前
Dubbo超时问题排查与调优指南:从根因到解决方案
服务器·开发语言·网络·微服务·架构·php·dubbo
白露与泡影4 天前
2025年BAT面试题汇总:JVM+Spring+Dubbo+Redis+并发编程
jvm·spring·dubbo
Jonathan Star4 天前
JSON-RPC 2.0 详解
qt·rpc·json