# 资金服务平台 Assembly 使用示例
## 基础配置示例
### 1. 服务模块标准配置
**目录结构(包含部署目录管理):**
```
fundplatform/
├── deploy/ # 部署产物目录(核心实践)
│ ├── fund-gateway.tar.gz # 网关服务部署包
│ ├── fund-sys.tar.gz # 系统服务部署包
│ └── ... 其他服务部署包
├── scripts/ # 统一脚本和配置
│ ├── env.properties # 统一配置文件
│ ├── services-build.sh # 批量构建脚本
│ └── start.sh # 通用启动脚本
├── fund-sys/ # 服务源代码
│ ├── src/
│ │ ├── main/
│ │ │ ├── assembly/
│ │ │ │ └── assembly.xml
│ │ │ └── resources/
│ │ │ ├── service.properties
│ │ │ ├── application.yml
│ │ │ └── logback-spring.xml
│ │ └── test/
│ ├── pom.xml
│ └── target/
│ └── fund-sys.tar.gz # 临时构建产物
└── ... 其他服务模块
```
**核心实践要点**:
- 所有部署包统一存储在项目根目录的 `deploy/` 目录下
- 开发代码与部署产物物理分离,便于版本管理和CI/CD集成
- 通过 `scripts/services-build.sh` 脚本自动收集各服务构建产物
**pom.xml配置:**
```xml
4.0.0
com.fundplatform
fund-platform
1.0.0
fund-sys
jar
com.fundplatform.sys.SysApplication
org.springframework.boot
spring-boot-maven-plugin
${main.class}
org.apache.maven.plugins
maven-assembly-plugin
src/main/assembly/assembly.xml
${project.artifactId}
```
**service.properties配置:**
```properties
# ============================================
# fund-sys 服务配置
# ============================================
APP_NAME=fund-sys
MAIN_CLASS=com.fundplatform.sys.SysApplication
INSTANCE_NAME=fund-sys
TENANT_ID=
# 可选配置
SERVER_PORT=8100
```
### 2. Assembly Descriptor配置
**src/main/assembly/assembly.xml:**
```xml
dist
tar.gz
true
${project.basedir}/../../scripts
bin
start.sh
stop.sh
restart.sh
status.sh
0755
${project.basedir}/../../scripts
conf
env.properties
src/main/resources
conf
service.properties
application.yml
logback-spring.xml
lib
true
runtime
```
## 实际应用场景
### 场景1: 单服务构建与部署
**构建命令:**
```bash
# 进入服务目录
cd fund-sys
# 清理并构建
mvn clean package -DskipTests
# 验证构建结果
ls -lh target/fund-sys.tar.gz
# 查看包内容
tar -tzf target/fund-sys.tar.gz | head -10
```
**部署验证:**
```bash
# 解压部署包
mkdir -p /opt/deploy/fund-sys
tar -xzf target/fund-sys.tar.gz -C /opt/deploy/
# 验证配置文件
cat /opt/deploy/fund-sys/conf/service.properties
cat /opt/deploy/fund-sys/conf/env.properties
# 启动服务
cd /opt/deploy/fund-sys
./bin/start.sh
```
### 场景2: 批量构建所有服务(部署目录管理实践)
**创建批量构建脚本 (scripts/services-build.sh):**
```bash
#!/bin/bash
# 资金服务平台批量构建脚本 - 统一输出到deploy目录
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="${SCRIPT_DIR}"
DEPLOY_DIR="${PROJECT_ROOT}/deploy"
# 服务列表
SERVICES=(
"fund-gateway"
"fund-sys"
"fund-cust"
"fund-proj"
"fund-exp"
"fund-receipt"
"fund-report"
"fund-req"
"fund-file"
)
# 部署目录初始化
initialize_deploy_directory() {
echo "=== 部署目录初始化 ==="
# 创建部署目录
mkdir -p "${DEPLOY_DIR}"
echo "✓ 部署目录: ${DEPLOY_DIR}"
# 显示当前部署包
echo "当前部署包:"
if ls "${DEPLOY_DIR}"/*.tar.gz >/dev/null 2>&1; then
ls -lh "${DEPLOY_DIR}"/*.tar.gz
else
echo " (无)"
fi
# 询问是否清理旧包
echo ""
read -p "是否清理旧的部署包? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
rm -f "${DEPLOY_DIR}"/*.tar.gz
echo "✓ 已清理旧部署包"
fi
echo ""
}
build_service() {
local service=$1
local service_dir="${PROJECT_ROOT}/${service}"
echo "=== 构建服务: ${service} ==="
if [ ! -d "${service_dir}" ]; then
echo "服务目录不存在: ${service_dir}"
return 1
fi
cd "${service_dir}"
# Maven构建
mvn clean package -DskipTests -q
# 复制到统一部署目录
local tar_file=$(find target -name "${service}*.tar.gz" | head -1)
if [ -n "${tar_file}" ]; then
cp "${tar_file}" "${DEPLOY_DIR}/"
local file_size=$(du -h "${tar_file}" | cut -f1)
echo "✓ ${service} 构建完成 (${file_size})"
echo " 输出到: ${DEPLOY_DIR}/$(basename ${tar_file})"
else
echo "✗ ${service} 构建失败"
return 1
fi
}
# 主构建流程
main() {
echo "========================================="
echo " 资金服务平台批量构建"
echo " 部署目录: ${DEPLOY_DIR}"
echo "========================================="
# 初始化部署目录
initialize_deploy_directory
local success_count=0
local fail_count=0
# 批量构建
for service in "${SERVICES[@]}"; do
if build_service "${service}"; then
((success_count++))
else
((fail_count++))
fi
echo ""
done
echo "========================================="
echo "构建完成统计:"
echo " 成功: ${success_count}"
echo " 失败: ${fail_count}"
echo ""
if [ ${fail_count} -eq 0 ]; then
echo "✓ 所有服务构建成功!"
echo ""
echo "生成的部署包:"
ls -lh "${DEPLOY_DIR}"/*.tar.gz
echo ""
echo "部署目录总大小: $(du -sh "${DEPLOY_DIR}" | cut -f1)"
else
echo "✗ ${fail_count}个服务构建失败"
exit 1
fi
}
main "$@"
```
**使用方法:**
```bash
# 给脚本执行权限
chmod +x scripts/services-build.sh
# 执行批量构建
./scripts/services-build.sh
# 构建完成后查看部署目录
ls -lh deploy/
# 验证部署包完整性
scripts/validate-deployment.sh
```
**部署目录管理优势**:
1. **统一管理**:所有服务部署包集中存储在 `deploy/` 目录
2. **版本控制**:便于CI/CD流水线统一处理部署包
3. **权限分离**:开发代码与部署产物物理分离
4. **清理维护**:易于批量清理旧版本部署包
**使用方法:**
```bash
# 给脚本执行权限
chmod +x scripts/services-build.sh
# 执行批量构建
./scripts/services-build.sh
```
### 场景3: 多租户实例部署
**共享实例配置:**
```properties
# fund-sys/src/main/resources/service.properties
APP_NAME=fund-sys
MAIN_CLASS=com.fundplatform.sys.SysApplication
INSTANCE_NAME=fund-sys-shared
TENANT_ID=
```
**VIP专属实例配置:**
```properties
# fund-sys-vip001/src/main/resources/service.properties
APP_NAME=fund-sys
MAIN_CLASS=com.fundplatform.sys.SysApplication
INSTANCE_NAME=fund-sys-vip001
TENANT_ID=vip001
```
**部署脚本支持多实例:**
```bash
#!/bin/bash
# multi-instance-deploy.sh
INSTANCE_TYPE=${1:-"shared"} # shared 或 vip001
SERVICE_NAME="fund-sys"
case "${INSTANCE_TYPE}" in
shared)
CONFIG_SUFFIX=""
DEPLOY_PATH="/opt/apps/${SERVICE_NAME}-shared"
;;
vip*)
CONFIG_SUFFIX="-${INSTANCE_TYPE}"
DEPLOY_PATH="/opt/apps/${SERVICE_NAME}-${INSTANCE_TYPE}"
;;
*)
echo "未知实例类型: ${INSTANCE_TYPE}"
exit 1
;;
esac
# 构建特定实例
cd "${SERVICE_NAME}${CONFIG_SUFFIX}"
mvn clean package -DskipTests
# 部署
mkdir -p "${DEPLOY_PATH}"
tar -xzf target/${SERVICE_NAME}*.tar.gz -C "${DEPLOY_PATH}"
# 启动
${DEPLOY_PATH}/bin/start.sh
```
## 高级配置示例
### 场景4: 环境差异化配置
**开发环境配置 (dev-env.properties):**
```properties
# scripts/dev-env.properties
NACOS_SERVER_ADDR=dev-nacos:8848
REDIS_HOST=dev-redis
REDIS_PASSWORD=dev-password
LOG_LEVEL_ROOT=DEBUG
```
**生产环境配置 (prod-env.properties):**
```properties
# scripts/prod-env.properties
NACOS_SERVER_ADDR=prod-nacos:8848
REDIS_HOST=prod-redis
REDIS_PASSWORD=prod-password
LOG_LEVEL_ROOT=INFO
```
**Profile配置:**
```xml
dev
true
org.apache.maven.plugins
maven-assembly-plugin
src/main/assembly/dev-assembly.xml
prod
org.apache.maven.plugins
maven-assembly-plugin
src/main/assembly/prod-assembly.xml
```
### 场景5: 条件配置打包
**assembly.xml支持条件包含:**
```xml
conditional-dist
tar.gz
${project.basedir}/../../scripts
bin
start.sh
stop.sh
0755
${project.basedir}/../../scripts/${env.name}
conf
env.properties
src/main/security
security
*
```
## 构建验证示例
### 自动化验证脚本
**创建验证脚本 (scripts/validate-build.sh):**
```bash
#!/bin/bash
# 构建结果验证脚本
validate_service() {
local service=$1
local tar_file="target/${service}.tar.gz"
echo "验证 ${service}..."
# 检查文件存在
if [ ! -f "${tar_file}" ]; then
echo "✗ 未找到部署包: ${tar_file}"
return 1
fi
# 检查包结构
local required_files=(
"bin/start.sh"
"bin/stop.sh"
"conf/env.properties"
"conf/service.properties"
"lib/${service}*.jar"
)
for file in "${required_files[@]}"; do
if ! tar -tzf "${tar_file}" | grep -q "${file}"; then
echo "✗ 缺失文件: ${file}"
return 1
fi
done
echo "✓ ${service} 验证通过"
return 0
}
# 验证所有服务
SERVICES=("fund-gateway" "fund-sys" "fund-cust" "fund-proj"
"fund-exp" "fund-receipt" "fund-report" "fund-req" "fund-file")
for service in "${SERVICES[@]}"; do
if [ -d "${service}" ]; then
cd "${service}"
validate_service "${service}" || exit 1
cd ..
fi
done
echo "所有服务验证完成!"
```
### 部署前检查清单
```bash
#!/bin/bash
# pre-deployment-check.sh
echo "=== 部署前检查清单 ==="
# 1. 检查配置文件完整性
echo "1. 配置文件检查:"
for service in fund-*; do
if [ -d "${service}" ]; then
conf_file="${service}/src/main/resources/service.properties"
if [ -f "${conf_file}" ]; then
echo "✓ ${service}: service.properties 存在"
# 检查必需参数
if grep -q "APP_NAME=" "${conf_file}" && grep -q "MAIN_CLASS=" "${conf_file}"; then
echo "✓ ${service}: 必需参数完整"
else
echo "✗ ${service}: 缺少必需参数"
fi
else
echo "✗ ${service}: 缺少 service.properties"
fi
fi
done
# 2. 检查统一配置
echo "2. 统一配置检查:"
if [ -f "scripts/env.properties" ]; then
echo "✓ scripts/env.properties 存在"
else
echo "✗ 缺少统一配置文件"
fi
# 3. 检查构建脚本
echo "3. 构建脚本检查:"
if [ -f "scripts/services-build.sh" ]; then
echo "✓ 批量构建脚本存在"
else
echo "✗ 缺少批量构建脚本"
fi
echo "检查完成!"
```
这些示例展示了资金服务平台Assembly配置的各种实际应用场景,涵盖了从基础配置到高级特性的完整使用方式。