微服务模块与架构师角色探讨
1. 模块分解技术
一些编程语言提供了超越简单库的模块化分解技术,允许对模块进行生命周期管理,可将模块部署到正在运行的进程中,无需停止整个进程就能进行更改。
1.1 OSGI
Open Source Gateway Initiative (OSGI) 是一种特定技术的模块化分解方法。Java 本身没有真正的模块概念,至少要等到 Java 9 才会引入。OSGI 最初是为了让插件能安装在 Eclipse Java IDE 而出现的框架,现在通过库的方式为 Java 引入模块概念。
然而,OSGI 存在问题。它试图在语言本身缺乏足够支持的情况下强制进行模块生命周期管理,这使得模块开发者需要做更多工作来实现适当的模块隔离。在进程边界内,也很容易让模块之间过度耦合,引发各种问题。实际经验表明,即使是优秀的团队,OSGI 带来的复杂性也往往超过其益处。
1.2 Erlang
Erlang 采用了不同的方法,其模块内置于语言运行时,是一种非常成熟的模块化分解方式。Erlang 模块可以无问题地停止、重启和升级,甚至支持同时运行同一模块的多个版本,便于更优雅地进行模块升级。
不过,即使使用具有这些强大功能的平台,依然存在与普通共享库相同的缺点,例如使用新技术的能力受限、独立扩展能力有限、容易采用过度耦合的集成技术,以及缺乏架构安全措施的衔接点。
理论上,在单个整体进程中可以创建结构良好、独立的模块,但实际上很少能做到。模块很快就会与其他代码紧密耦合,失去独立性的关键优势。进程边界分离在这方面有助于保持代码的整洁性,但这不应是进行进程分离的主要驱动因素。