sofastack / sofa-serverless

a framework to enabe app architecture evolve from monolithic to microservices smoothly by involving modular and macroservices architecture.
https://sofaserverless.gitee.io/home/
Apache License 2.0
115 stars 41 forks source link

【BUG】Dubbo 3.2 ExtensionLoader 初始化失败,报错 #467

Closed CodeNoobKing closed 7 months ago

CodeNoobKing commented 8 months ago

Describe the question or bug

虽然 ExtensionLoader 被委托给了基座,但是如果第一次对 ExtensionLoader 的访问在 BizClassLoader 的线程中,那么 org.apache.dubbo.common.extension.ExtensionLoader#loadLoadingStrategies 方法会初始化错误,因为 TCCL 是 BizClassLoader。

Expected behavior

ExtensionLoader 能够正确的初始化,不报错。 ExtensionLoader 的第一次访问必须被基座的 TCCL 访问。

Actual behavior

当 ExtensionLoader 的第一次访问被 BizClassLoader 访问,则 strategies 为空,导致 Extension Loader 初始化失败。

Steps to reproduce

Steps to reproduce the problem:

  1. 引入 dubbo3.2x 包。
  2. 在基座中不访问 ExtensionLoader,首先在 BizClassLoader 中访问 ExtensionLoader 类。

Screenshots

截屏2024-01-12 14 37 45
CodeNoobKing commented 8 months ago

解决方案有 2 种:

  1. patch org.apache.dubbo.common.extension.ExtensionLoader#loadLoadingStrategies 的方法,把 TCCL 切成基座的。
  2. 在补丁包里写一个基座的适配 starter,直接调用 ExtensionLoader, 强制让 loadLoadingStrategies 在基座的 TCCL 中执行。