这篇文章想复盘一个我们曾经做过的系统:一个基于 CORBA 的分布式构件组装平台。
很多人会把它简单归类为“老技术”,但如果只看技术名词,很容易错过真正有价值的部分:我们当年解决的问题,今天依然存在,只是实现手段发生了变化。
项目背景:一个异构构件组装系统
系统核心形态很直接:
- 一个总线组件(Bus)
- 一个 UI 组件
- 一个数据库组件(DB)
- 一个服务器组件(Server)
这些组件由不同语言实现(C++、Java),通过 CORBA 中间件完成跨语言通信。
我们还开发了 4 个 Eclipse 插件,用于分布式应用的构件组装、配置和部署。
此外有一个类似“名字注册空间”的服务(Naming/Registry),负责服务发现与路由。
换句话说,这是一个典型的“异构分布式系统”:语言异构、组件异构、运行环境异构,但要在工程上协同成一个整体。
当年的技术栈为什么看起来“重”
很多人会把 CORBA 体系概括为一串复杂名词:
- IDL
- Stub/Skeleton
- ORB
- Naming Service
- Object Lifecycle
- Distributed Transaction
这套东西看起来重,不是因为设计者喜欢复杂,而是因为要显式回答分布式系统里的基本问题:
- 契约如何定义和演进(IDL)
- 跨语言调用如何落地(Stub/Skeleton)
- 远程对象如何寻址(ORB/Naming)
- 对象生命周期如何管理(Lifecycle)
- 跨边界一致性如何处理(Transaction)
这些问题在今天并没有消失,只是被拆散到了不同基础设施里。
关键转折:行业从“远程像本地”走向“远程就是远程”
CORBA 时代有一个理想:尽可能让远程对象调用体验接近本地调用。
但工程现实不断提醒我们:
- 网络会断
- 延迟不可预测
- 超时和重试策略复杂
- 版本兼容和灰度升级困难
后来行业共识逐步形成:RPC 不是本地函数调用。
从这个共识出发,REST/gRPC/消息驱动架构开始强调边界、失败语义、幂等、可观测性,而不是“透明化远程调用”。
古今映射:名字变了,抽象没变
把 CORBA 时代与现代云原生做一个简化映射,会发现很多是一一对应关系:
- IDL -> OpenAPI / Protobuf / AsyncAPI
- Naming Service -> Consul / Eureka / Kubernetes DNS
- ORB 路由语义 -> API Gateway / Service Mesh
- 总线通信 -> Kafka / NATS / Pulsar
- 生命周期管理 -> K8s Controller / Operator
- 分布式事务 -> Saga / Outbox / 最终一致性
如果只看技术名词,像是“新旧替代”;如果看系统抽象,其实是“能力重组”。
Eclipse 插件体系的现实意义
我们当时做的 4 个 Eclipse 插件,本质上是在做平台化工程能力:
- 扩展点机制(插件化)
- 构件编排与组装
- 部署流程标准化
- 生命周期与依赖管理
这和今天的 IDE 插件生态、内部研发平台(IDP)、Dev Portal、低代码编排工具,在思想上是连续的。
形式发生了变化,但“通过平台降低复杂系统的交付门槛”这件事没有变化。
Eclipse 插件底层:OSGi 到底解决了什么
Eclipse 插件体系的底层是 OSGi。
如果把它抽象成一句话:OSGi 是一个“可动态装卸、可隔离依赖、可注册服务”的模块化运行时。
在机制上,它主要做了几件事:
- Bundle 模块化:每个插件是一个 Bundle,有独立元数据与依赖声明
- 生命周期管理:支持 install/start/stop/update/uninstall
- 服务注册中心:Bundle 可发布/发现服务,形成运行时解耦
- 类加载隔离:每个 Bundle 有自己的 ClassLoader,避免 classpath 污染
- 版本约束:通过 Import/Export package 和版本区间控制兼容性
这也是 Eclipse 插件生态能长期运行的关键原因:不是“把 jar 丢进一个目录”,而是有运行时治理能力。
当然,OSGi 也有明显代价:
- 学习曲线较高(尤其是类加载与版本冲突)
- 调试复杂度高于普通单体应用
- 对团队工程纪律要求更高
OSGi 与当前主流方案对比
今天团队更常用的“插件/扩展”形态,往往是以下几类:
- IDE 插件:VS Code Extension、JetBrains Plugin
- Web 平台扩展:前端微插件、微前端、模块联邦(Module Federation)
- 平台后端扩展:Sidecar、Operator、Hook、Workflow 插件节点
- 低代码/流程平台:节点化扩展与脚本化能力注入
和 OSGi 对比,可以这样看:
- OSGi 优势:模块边界清晰、依赖治理强、运行时动态管理能力强
- OSGi 劣势:心智负担重、开发调试门槛高、生态热度下降
- 现代插件方案优势:开发体验更轻、社区生态活跃、云原生集成好
- 现代插件方案劣势:很多只解决“扩展点”,缺少 OSGi 级别的强运行时治理
一个实用判断是:
如果你做的是“企业内长期演进、需要强模块隔离与版本治理”的平台,OSGi 思路仍然非常有价值;
如果你追求“快速交付、低门槛生态扩展”,当前主流插件模型通常更划算。
EJB、CORBA 以及今天的微服务
EJB 在新系统里确实不再常见,CORBA 也不是主流首选。
但这不代表它们没有价值,反而说明行业把这些能力拆分得更细:
- 通信协议层:REST / gRPC
- 服务发现层:注册中心 / K8s 原生发现
- 治理层:网关 / Mesh / 可观测性体系
- 事务层:从强一致到最终一致
从架构史角度看,这不是“推倒重来”,更像是“从一体化重型中间件,演进到可组合的基础设施拼装”。
回答一个常见问题:这类系统今天还有借鉴意义吗
我的结论是:不仅有,而且很强。
因为很多今天做微服务的人,工具会用,但底层抽象未必扎实:
- 不熟悉服务发现
- 不理解 IDL/契约优先
- 缺少跨语言协议意识
- 忽略消息总线的解耦价值
- 忽略组件生命周期和平台化治理
而这些恰恰是异构分布式系统训练出来的“架构基本功”。
总结
我们当年做的 CORBA 构件组装系统,不只是“历史遗留技术实践”,而是一套完整的分布式工程方法。
今天的技术栈已经从 CORBA/EJB 走到 REST/gRPC/Kubernetes,但核心问题依然是同一组:
- 如何定义稳定契约
- 如何治理服务发现
- 如何控制跨语言复杂度
- 如何管理生命周期与演进成本
- 如何在不可靠网络上构建可靠系统
技术在演化,思想在延续。
真正会穿越技术周期的,不是某个框架,而是你对这些底层问题的理解与取舍能力。