# 工程结构规约
## 目录
- [一、应用分层](#一应用分层)
- [二、领域模型](#二领域模型)
- [三、二方库依赖](#三二方库依赖)
- [四、服务器配置](#四服务器配置)
---
## 一、应用分层
### 推荐分层架构
```
┌─────────────────────────────────────────────────────┐
│ 开放API层 │
│ (RPC接口/HTTP接口/网关控制) │
├─────────────────────────────────────────────────────┤
│ 终端显示层 │
│ (velocity/JS/JSP/移动端) │
├─────────────────────────────────────────────────────┤
│ Web层 │
│ (Controller/参数校验/简单业务) │
├─────────────────────────────────────────────────────┤
│ Service层 │
│ (具体业务逻辑) │
├─────────────────────────────────────────────────────┤
│ Manager层 │
│ (通用业务/第三方封装/DAO组合) │
├─────────────────────────────────────────────────────┤
│ DAO层 │
│ (数据访问/MySQL/Oracle/HBase) │
└─────────────────────────────────────────────────────┘
```
### 各层职责
| 层级 | 职责 | 说明 |
|------|------|------|
| **开放API层** | 对外暴露 | RPC接口、HTTP接口、网关 |
| **终端显示层** | 渲染展示 | velocity、JS、JSP、移动端 |
| **Web层** | 访问控制转发 | Controller、参数校验 |
| **Service层** | 业务逻辑 | 具体业务处理 |
| **Manager层** | 通用处理 | 第三方封装、缓存、DAO组合 |
| **DAO层** | 数据访问 | MySQL、Oracle、HBase |
### 分层异常处理
| 层级 | 异常处理方式 |
|------|-------------|
| **DAO层** | catch(Exception) + throw DAOException,不打印日志 |
| **Service层** | 必须记录日志到磁盘 |
| **Web层** | 跳转友好错误页面 |
| **开放接口层** | 转化为错误码和错误信息 |
---
## 二、领域模型
| 模型 | 全称 | 说明 |
|------|------|------|
| **DO** | Data Object | 与数据库表一一对应 |
| **DTO** | Data Transfer Object | 数据传输对象 |
| **BO** | Business Object | 业务对象 |
| **Query** | - | 数据查询对象(超过2个参数封装) |
| **VO** | View Object | 显示层对象 |
**注意**:Query禁止使用Map类传输
---
## 三、二方库依赖
### 【强制】规约
1. **GAV命名规范**:
- **GroupID**:`com.{公司/BU}.业务线[.子业务线]`,最多4级
- **ArtifactID**:`产品线名-模块名`
2. **版本号格式**:`主版本号.次版本号.修订号`
- 主版本号:产品方向改变、大规模API不兼容
- 次版本号:相对兼容、增加主要功能
- 修订号:完全兼容、修复BUG
- **起始版本号必须为1.0.0**
3. **线上不依赖SNAPSHOT版本**
4. **依赖群定义统一版本变量**:
```xml
5.3.20
```
5. **禁止相同GAV不同Version**
### 【推荐】规约
1. **依赖声明与版本仲裁分离**:
```xml
...
...
```
2. **二方库不要有配置项**
---
## 四、服务器配置
### 【推荐】规约
1. **调小TCP time_wait超时时间**:
```bash
# /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
```
2. **调大最大文件句柄数**
3. **JVM配置OOM时输出dump**:
```bash
-XX:+HeapDumpOnOutOfMemoryError
```
4. **Xms和Xmx设置相同大小**:
```bash
-Xms4g -Xmx4g
```
---
## 项目目录结构示例
```
project-name/
├── pom.xml
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/company/project/
│ │ │ ├── controller/ # Web层
│ │ │ ├── service/ # Service层
│ │ │ │ └── impl/
│ │ │ ├── manager/ # Manager层
│ │ │ ├── dao/ # DAO层
│ │ │ ├── model/ # 领域模型
│ │ │ │ ├── dto/
│ │ │ │ ├── vo/
│ │ │ │ └── query/
│ │ │ └── config/
│ │ └── resources/
│ │ ├── mapper/
│ │ └── application.yml
│ └── test/
│ └── java/
```