项目启动流程说明
Boot 工程介绍
用于管理 core 项目的实例,包含:core 的启动、停止、升级等。
Boot 启动流程
❶ boot 工程,通过启动子进程的方式,启动 core 实例。
❷ 临时目录,boot 和 core 进行数据交换,为操作系统临时目录。
❸ core 工程,通过读临目录来完成相应的动作。
项目架构概述
项目采用了启动器与核心应用分离的架构设计,主要包含以下核心模块:
-
niucloud-boot: 项目启动器模块,负责环境验证、进程管理和核心应用的启动
-
niucloud-core: 核心业务模块,包含基础框架和通用功能
-
niucloud-addon: 插件模块集合,包含各类业务插件(如秒杀、团购、充值等)
-
niucloud-web-app: Web 应用模块,包含 Spring Boot 主应用和 Web 接口
启动架构分析
项目采用了"启动器 + 核心应用"的双层启动架构:
-
启动器层:由
niucloud-boot模块实现,负责环境验证和核心应用的生命周期管理 -
核心应用层:由
niucloud-web-app模块实现,包含 Spring Boot 主应用和所有业务功能
启动器模块 (niucloud-boot)
启动器的主入口类为 Boot.java,位于 niucloud-boot 模块中:
package com.niu.boot;
import com.niu.boot.config.BootConfig;
import com.niu.boot.process.EnvironmentValidator;
import com.niu.boot.process.ProcessMonitor;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class Boot {
public static void main(String[] args) {
BootConfig bootConfig = new BootConfig(args, "boot.yml");
EnvironmentValidator environmentValidator = EnvironmentValidator.getInstance(bootConfig);
if (environmentValidator.checkEnvironment()) {
if (!environmentValidator.checkJreUsable()) {
System.out.println("当前Java环境是:" + bootConfig.getJavaVersion() + ",请安装Java17的运行环境.");
System.exit(0);
}
if (!environmentValidator.readAppEnv()) {
System.out.println("请在 [" + bootConfig.getAppEnvPath() + "] 文件中进行配置.");
System.exit(0);
}
if (!environmentValidator.checkMysqlUsable()) {
System.out.println("请在 [" + bootConfig.getAppEnvPath() + "] 文件中进行配置, MySQL连接.");
System.exit(0);
}
if (!environmentValidator.checkRedisUsable()) {
System.out.println("请在 [" + bootConfig.getAppEnvPath() + "] 文件中进行配置, Redis连接.");
System.exit(0);
}
}
for (String arg: args) {
if (arg.equals("--install-addon")) {
try (RandomAccessFile raf = new RandomAccessFile("install_addon.dat", "rw");
FileChannel channel = raf.getChannel()) {
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 100);
buffer.put("install-addon".getBytes());
} catch (Exception e) {
}
}
}
bootConfig.printArguments();
new ProcessMonitor(bootConfig).start();
Runtime.getRuntime().addShutdownHook(new ProcessMonitor.Shutdown());
}
}
核心应用模块 (niucloud-web-app)
核心应用的主入口类为 WebAppApplication.java,位于 niucloud-web-app 模块中:
package com.niu.app;
import com.niu.app.common.context.SpringBeanNameGenerator;
import com.niu.app.common.loader.PluginBufferingApplicationStartup;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableAsync
@EnableScheduling
@MapperScan(basePackages = {"com.*.**.mapper.*", "com.niu.*.mapper"})
启动器核心组件
BootConfig
-
功能:加载和管理启动器配置
-
主要职责:
解析命令行参数、加载 boot.yml 配置文件、提供配置信息访问接口
EnvironmentValidator
-
功能:环境验证器
-
主要职责:
-
检查 Java 环境版本(要求 Java 17)
-
验证应用配置文件(app.env)的存在性
-
检查 MySQL 数据库连接可用性
-
检查 Redis 连接可用性
-
ProcessMonitor
-
功能:进程监控和管理
-
主要职责:
-
启动和监控核心应用进程
-
管理核心应用的生命周期
-
处理启动、停止、重启等命令
-
实现进程间通信(通过命名管道)
-
ProcessManager
-
功能:进程管理具体实现
-
主要职责:
-
执行核心应用的启动命令
-
监控核心应用的运行状态
-
处理插件安装、升级等特殊事件
-
实现自动重启机制
-
核心应用关键注解说明
| 注解 | 作用 |
|---|---|
@SpringBootApplication |
标识这是一个 Spring Boot 应用的主类 |
@EnableAsync |
启用异步方法支持 |
@EnableScheduling |
启用定时任务支持 |
@MapperScan |
扫描 MyBatis Mapper 接口 |
@ComponentScan |
扫描组件并注册到 Spring 容器 |
@Slf4j |
提供日志记录功能 |
启动架构核心功能
-
环境验证:启动器验证 Java 环境、数据库连接等必要条件
-
进程管理:启动器负责核心应用的启动、监控和重启
-
插件支持:通过
PluginBufferingApplicationStartup支持插件的加载和监控 -
进程通信:启动器与核心应用通过命名管道进行通信
-
生命周期管理:实现完整的应用生命周期管理(启动、运行、停止)