全部产品

模块化开发概述

更新时间:2020-05-22 17:49:23

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 依赖,且无需指定依赖版本号,示例如下:

  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>isle-sofa-boot-starter</artifactId>
  4. </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 提供以下两种形式的服务发布和引用,实现不同级别模块间的调用:

模块并行化启动

每个 SOFABoot 模块都是独立的 Spring 上下文,多个 SOFABoot 模块支持并行化启动。与 Spring Boot 的单 Spring 上下文模式相比,模块并行化启动能够加快应用的启动速度。