阿里部分集团内部中间件简介
目录
- Pandora Boot
- HSF
- MetaQ
- TDDL
- Xdb·OTS·OceanBase
- Switch
- EagleEye
- SLS
- Sunfire
Pandora Boot
背景与需求
在阿里巴巴内部,几乎所有的应用程序都依赖于多种中间件(例如HSF、TDDL、Diamond等),而这些中间件之间常常存在版本冲突和依赖问题。传统的Maven依赖管理工具只能通过排除冲突来解决这种问题,但这往往会导致更复杂的错误和更高的维护成本。为了解决这些问题,阿里巴巴开发了Pandora,一个基于类隔离技术的轻量级容器,用于管理和隔离中间件依赖,确保系统的稳定性。
依赖冲突问题的产生
依赖冲突问题通常出现在以下情况:
-
- 版本冲突:同一个类库的不同版本被不同的中间件或应用程序依赖。例如,中间件A依赖类库X的1.0版本,而中间件B依赖类库X的2.0版本。由于传统的Maven依赖管理是平坦化的,它只能选择其中一个版本,这可能导致应用程序在运行时遇到NoSuchMethodError或ClassNotFoundException等错误。
-
- 多中间件依赖:当一个应用程序同时依赖多个中间件,而这些中间件又依赖不同版本的相同类库时,如果没有适当的隔离机制,这些依赖会混淆在一起,导致运行时错误。
Pandora Boot的类加载器隔离技术
Pandora Boot通过引入多个类加载器,并对这些类加载器的职责进行明确划分,来解决上述的依赖冲突问题。具体的隔离机制如下:
-
- PandoraClassLoader:
-
- 这是Pandora容器的类加载器,负责加载Pandora自身的核心类库和中间件依赖的类库。由于PandoraClassLoader独立于应用程序的类加载器(AppClassLoader),因此它可以确保Pandora容器中的类不会与应用程序的类发生冲突。
-
- 这个类加载器基本上是一个标准的URLClassLoader,但由于它不依赖于应用程序的类加载器,所以可以独立加载其所需的类库。
-
- ModuleClassLoader:
-
- 为每个中间件插件(如HSF、TDDL等)创建一个独立的ModuleClassLoader。这样,每个插件中的类库只会在其对应的ModuleClassLoader中加载,插件之间的类不会互相干扰。这种插件级别的隔离确保了即使不同插件依赖相同类库的不同版本,也不会发生冲突。
-
- 每当部署一个新的中间件插件时,Pandora会为该插件创建一个新的ModuleClassLoader,以保证插件之间的完全隔离。
-
- BizClassLoader:这是用于加载应用程序自身类库的类加载器,可以由外部传入。它与Pandora的类加载器体系是独立的,从而实现应用程序与Pandora之间的隔离。
Pandora Boot的运行机制
Pandora Boot在运行时,首先会启动Pandora环境,准备好类隔离环境,然后再启动应用程序的主函数。这样,应用程序可以选择传统的Spring XML配置方式,也可以使用更现代的Spring Boot方式进行开发。
Pandora Boot的启动过程与Spring Boot类似,但在生成的可执行jar文件中,Pandora Boot会替换Spring Boot的Main-Class为Pandora Boot的启动器,并加载额外的Pandora Boot特定的jar包。这个过程确保了在启动时,Pandora Boot能够优先加载必要的类,从而实现中间件的平滑升级和统一管理。
Pandora Boot的引入与优势
Pandora Boot是Pandora与Spring