SOFABoot 模块化开发主要目标是如何让各个模块的上下文之间既实现隔离,又能彼此互相通信。主要实现原理如下:
每个 SOFABoot 模块中包含了一个独立的上下文。模块与模块之间不能直接通过 bean 来交互,这是模块化隔离性的一个体现。
通过启动类产生一个根上下文,作为各个模块的父上下文。
各个模块通过 starter 发现根上下文,保证各个模块能发现根上下文中的 Bean,实现各个模块的通信。
SOFABoot 模块化开发的整体设计,示例如下:
下文对模块化开发做进一步说明。
模块结构及功能
模块结构
一个 SOFABoot 工程可以包含多个模块,每个模块都含有独立的上下文。SOFABoot 模块主要包括下述 2 个部分:
一个普通的 JAR 包。主要包含:
Java 代码
Spring 配置文件
SOFABoot 子模块标识
SOFABoot 特有的配置。主要包含:
properties 配置文件
Spring 配置文件
更多 SOFABoot 模块配置信息,请参考 模块配置文件。
模块化功能
SOFABoot 模块化开发是基于 Spring 上下文隔离的模块化。以 SOFABoot 模块为单元的模块化方式为开发者提供了以下功能:
应用运行时,每个 SOFABoot 模块的 Spring 上下文互相隔离,模块间定义的 Bean 不会互相影响。
每个 SOFABoot 模块功能完备且自包含,可以在不同的 SOFABoot 应用间轻松进行模块迁移和复用,只需将 SOFABoot 模块全部拷贝至目标应用,调整 Maven 依赖,即可运行。
模块化开发
背景综述
按照官网文档 创建工程 创建的 SOFABoot 工程有 2 种类型:
SOFABoot Web 工程
SOFABoot Core 工程
启动类一般都放在可部署模块中。可部署模块指使用 spring-boot-maven-plugin 打包的模块。上述 2 个工程类型的可部署模块及对应启动类为:
SOFABoot Web 工程的 Web 模块:
SOFABootWebApplication
SOFABoot Core 工程的 service 模块:
SOFABootApplication
开启模块化
开启 SOFABoot 模块化,需要在工程 可部署模块 的 pom.xml 中,增加 isle-alipay-sofa-boot-starter
依赖,且无需指定依赖版本号,示例如下:
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>isle-sofa-boot-starter</artifactId>
</dependency>
模块化实现
模块化实现主要涉及的上下文包括:
Root ApplicationContext
:本文简称为 rt_appc,指启动工程的启动类时,运行SpringApplication.run
所启动的 Spring 上下文。applicationContext
:本文简称为 appc,指各个模块都有的一个 Spring 上下文。
在 SOFABoot 工程中,主要实现原理描述如下:
SOFABoot 工程启动,产生一个上下文 rt_appc。
工程中各个模块也都有一个上下文 appc,且彼此独立,互相隔离。
rt_appc 是各个模块中 appc 的 parent。
开启模块化之后,可以实现下述功能:
在启动类的 rt_appc 刷新完成之后,
isle-alipay-sofa-boot-starter
会负责找到工程中的各个模块,然后将各个模块里独立的 appc 启动起来。可以保证各模块的 appc 都能发现 rt_appc 中创建的 Bean。
当应用新增 Starter 时,不仅 rt_appc 能够使用 Starter 中新增的 Bean,而且每个模块的 appc 也能使用这些 Bean。
模块间通信
上下文隔离后,模块与模块间的 Bean 无法直接注入,模块间需要通过 SOFA 服务进行通信。目前 SOFABoot 提供以下两种形式的服务发布和引用,实现不同级别模块间的调用:
JVM 服务发布和引用:解决一个 SOFABoot 工程内部各个模块之间的调用问题,参考 发布和引用 JVM 服务。
RPC 服务发布和引用:解决多个 SOFABoot 工程之间的远程调用问题,RPC 服务发布与引用。
模块并行化启动
每个 SOFABoot 模块都是独立的 Spring 上下文,多个 SOFABoot 模块支持并行化启动。与 Spring Boot 的单 Spring 上下文模式相比,模块并行化启动能够加快应用的启动速度。