Skip to content

项目启动流程说明

Boot 工程介绍

用于管理 core 项目的实例,包含:core 的启动、停止、升级等。

Boot 启动流程

❶ boot 工程,通过启动子进程的方式,启动 core 实例。
❷ 临时目录,boot 和 core 进行数据交换,为操作系统临时目录。
❸ core 工程,通过读临目录来完成相应的动作。

项目架构概述

项目采用了启动器与核心应用分离的架构设计,主要包含以下核心模块:

  • niucloud-boot: 项目启动器模块,负责环境验证、进程管理和核心应用的启动

  • niucloud-core: 核心业务模块,包含基础框架和通用功能

  • niucloud-addon: 插件模块集合,包含各类业务插件(如秒杀、团购、充值等)

  • niucloud-web-app: Web 应用模块,包含 Spring Boot 主应用和 Web 接口

启动架构分析

项目采用了"启动器 + 核心应用"的双层启动架构:

  1. 启动器层:由 niucloud-boot 模块实现,负责环境验证和核心应用的生命周期管理

  2. 核心应用层:由 niucloud-web-app 模块实现,包含 Spring Boot 主应用和所有业务功能

启动器模块 (niucloud-boot)

启动器的主入口类为 Boot.java,位于 niucloud-boot 模块中:

java
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 模块中:

java
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)

    • 验证应用配置文件(application-prod.yml)的存在性

    • 检查 MySQL 数据库连接可用性

    • 检查 Redis 连接可用性

ProcessMonitor

  • 功能:进程监控和管理

  • 主要职责

    • 启动和监控核心应用进程

    • 管理核心应用的生命周期

    • 处理启动、停止、重启等命令

    • 实现进程间通信(通过命名管道)

ProcessManager

  • 功能:进程管理具体实现

  • 主要职责

    • 执行核心应用的启动命令

    • 监控核心应用的运行状态

    • 处理插件安装、升级等特殊事件

    • 实现自动重启机制

核心应用关键注解说明

注解作用
@SpringBootApplication标识这是一个 Spring Boot 应用的主类
@EnableAsync启用异步方法支持
@EnableScheduling启用定时任务支持
@MapperScan扫描 MyBatis Mapper 接口
@ComponentScan扫描组件并注册到 Spring 容器
@Slf4j提供日志记录功能

启动架构核心功能

  1. 环境验证:启动器验证 Java 环境、数据库连接等必要条件

  2. 进程管理:启动器负责核心应用的启动、监控和重启

  3. 插件支持:通过 PluginBufferingApplicationStartup 支持插件的加载和监控

  4. 进程通信:启动器与核心应用通过命名管道进行通信

  5. 生命周期管理:实现完整的应用生命周期管理(启动、运行、停止)

基于 MIT 协议发布