4. 项目初始化与工程结构:Maven多模块项目搭建、父POM依赖管理、模块职责划分

实时风控网关对模块化、可扩展性要求极高。本章将基于 Maven 多模块架构,从零搭建项目骨架,明确各模块职责,并通过父 POM 统一管理依赖版本,为后续 API 发布与风控策略集成奠定工程基础。

4.1 多模块架构设计原则

在风控网关场景中,将 API 定义、路由转发、规则引擎、数据持久化拆分为独立模块,可带来以下收益:

  • 职责单一:每个模块只关注一个核心领域,降低耦合。
  • 独立编译:修改规则引擎模块无需重新编译整个网关。
  • 版本管理:父 POM 统一管控所有子模块的依赖版本,避免冲突。
  • 复用性:公共工具类、DTO 可被多个模块共享。
架构提示: 本课程采用“API 网关层 → 风控引擎层 → 数据服务层”三层模块划分,每层对应一个或多个 Maven 子模块。

4.2 父 POM 依赖管理

父 POM(pom.xml)是整个项目的版本控制中心。通过 <dependencyManagement> 和 <pluginManagement> 统一声明依赖版本,子模块只需声明 groupId 和 artifactId,无需重复指定版本号。

管理元素 作用 示例
<dependencyManagement> 统一管理所有子模块的依赖版本 Spring Boot 2.7.18、Netty 4.1.100
<pluginManagement> 统一管理 Maven 插件版本与配置 maven-compiler-plugin 3.11.0
<properties> 定义全局版本变量,便于集中修改 <java.version>17</java.version>
<modules> 声明所有子模块,构建时自动递归 <module>risk-gateway-core</module>
最佳实践: 父 POM 中只放 <dependencyManagement>,不要直接引入 <dependencies>,避免强制子模块继承非必要依赖。

4.3 模块职责划分

根据实时风控网关的业务特性,我们将项目拆分为以下 6 个核心模块:

  • risk-gateway-core:网关核心,负责请求路由、协议适配、限流熔断。
  • risk-engine:风控引擎,加载规则、执行策略、输出决策结果。
  • risk-api:对外暴露的 API 定义层,包含请求/响应 DTO 和 Feign 接口。
  • risk-common:公共工具模块,包含常量、异常、加密工具类。
  • risk-dao:数据访问层,封装 Redis、MySQL、Elasticsearch 操作。
  • risk-admin:后台管理模块,提供规则配置、监控看板。
实时风控网关 Maven 多模块工程结构 risk-parent (父POM) risk-gateway-core risk-engine risk-api risk-common risk-dao risk-admin 各模块通过父POM统一版本, 依赖关系由 dependencyManagement 集中管控。

4.4 父 POM 核心配置示例

以下为父 POM 的关键配置片段,展示如何通过 <dependencyManagement> 统一管理 Spring Boot 和 Netty 版本:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.risk.gateway</groupId>
    <artifactId>risk-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <java.version>17</java.version>
        <spring-boot.version>2.7.18</spring-boot.version>
        <netty.version>4.1.100.Final</netty.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>io.netty</groupId>
                <artifactId>netty-all</artifactId>
                <version>${netty.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <modules>
        <module>risk-gateway-core</module>
        <module>risk-engine</module>
        <module>risk-api</module>
        <module>risk-common</module>
        <module>risk-dao</module>
        <module>risk-admin</module>
    </modules>
</project>

4.5 子模块 POM 引用示例

子模块只需声明 parent 和自身依赖,无需指定版本:

<!-- risk-gateway-core/pom.xml -->
<project>
    <parent>
        <groupId>com.risk.gateway</groupId>
        <artifactId>risk-parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <artifactId>risk-gateway-core</artifactId>

    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <!-- 版本由父POM统一管理,此处省略 -->
        </dependency>
        <dependency>
            <groupId>com.risk.gateway</groupId>
            <artifactId>risk-common</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>
常见陷阱: 子模块中如果手动写了 <version> 且与父 POM 不一致,会导致依赖冲突。务必使用 ${project.version} 或完全省略版本号。

4.6 模块间依赖关系

各模块之间的依赖遵循“单向依赖”原则,避免循环引用:

模块 依赖模块 依赖说明
risk-gateway-core risk-common, risk-api 使用公共工具类,调用 API 层 DTO
risk-engine risk-common, risk-dao 加载规则配置,查询历史数据
risk-admin risk-engine, risk-dao 管理后台调用引擎与数据层
risk-api risk-common 仅依赖公共模块,保持接口纯净
risk-dao risk-common 数据访问层依赖工具类
模块间单向依赖关系 risk-gateway-core risk-engine risk-admin risk-common risk-dao risk-api

4.7 初始化步骤总结

  1. 创建父工程:使用 mvn archetype:generate 或 IDE 新建 Maven 项目,packaging 设为 pom。
  2. 配置父 POM:在 <dependencyManagement> 中声明所有第三方依赖版本,在 <modules> 中列出子模块。
  3. 创建子模块:在父工程目录下执行 mvn archetype:create 或手动创建模块目录及 pom.xml。
  4. 设置子模块 parent:每个子模块的 <parent> 指向父工程。
  5. 添加模块间依赖:按职责划分,在子模块 pom.xml 中引入兄弟模块依赖。
  6. 验证构建:在父工程根目录执行 mvn clean install,确保所有模块编译通过。
效率提升: 使用 mvn -pl risk-gateway-core -am install 可只构建指定模块及其依赖模块,节省大型项目构建时间。