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:后台管理模块,提供规则配置、监控看板。
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 | 数据访问层依赖工具类 |
4.7 初始化步骤总结
- 创建父工程:使用
mvn archetype:generate或 IDE 新建 Maven 项目,packaging设为pom。 - 配置父 POM:在
<dependencyManagement>中声明所有第三方依赖版本,在<modules>中列出子模块。 - 创建子模块:在父工程目录下执行
mvn archetype:create或手动创建模块目录及pom.xml。 - 设置子模块 parent:每个子模块的
<parent>指向父工程。 - 添加模块间依赖:按职责划分,在子模块
pom.xml中引入兄弟模块依赖。 - 验证构建:在父工程根目录执行
mvn clean install,确保所有模块编译通过。
效率提升: 使用
mvn -pl risk-gateway-core -am install 可只构建指定模块及其依赖模块,节省大型项目构建时间。