You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

474 lines
12 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Weather Service 技术实现文档
## 1. Weather Service 项目结构
```
src/main/java/com/htfp/weather/
├── WeatherServiceApplication.java # 应用程序入口
├── config/ # 配置类
├── download/ # 数据下载模块
├── griddata/ # 网格数据处理
├── info/ # 信息处理模块
├── schedule/ # 定时任务模块
├── utils/ # 工具类
└── web/ # Web接口模块
```
## 2. 核心模块分析
### 2.1 应用程序入口
文件:`WeatherServiceApplication.java`
```java
@EnableRetry // 开启重试机制
@EnableScheduling // 开启定时任务
@SpringBootApplication
public class WeatherServiceApplication {
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
SpringApplication.run(WeatherServiceApplication.class, args);
}
}
```
主要特性:
1. 启用Spring Boot自动配置
2. 启用重试机制,支持失败操作重试
3. 启用定时任务调度功能
4. 设置默认时区为亚洲/上海
### 2.2 数据下载模块
目录:`download/`
#### 2.2.1 基础下载器BaseDataDownloader
文件:`BaseDataDownloader.java`
```java
@Data
@ToString
public abstract class BaseDataDownloader {
private String startTimeStr; // 起始时间北京时UTC+8
private LocalDateTime startTime; // 起始时间对象
private String refTimeStr; // 参考时间字符串
private OffsetDateTime refTime; // 数据实际起报UTC时间
// 获取所有下载文件信息
public abstract List<DownLoadFileInfo> getFilesInfo();
// 单个文件下载
public abstract DownLoadFileInfo download(DownLoadFileInfo downLoadFileInfo) throws IOException;
// 批量下载所有文件
public abstract List<DownLoadFileInfo> downloadAll(List<DownLoadFileInfo> downLoadFileInfoList);
}
```
#### 2.2.2 下载文件信息DownLoadFileInfo
文件:`DownLoadFileInfo.java`
```java
@Data
@ToString
public class DownLoadFileInfo {
private String fileName; // 保存文件名
private String refTimeStr; // 数据起报时间
private Integer forecastHour; // 预报时效
private String forecastBJTimeStr; // 预报时效对应的北京时间
private String forecastUTCTimeStr; // 预报时效对应的UTC时间
private String url; // 下载链接
private String savePath; // 保存路径
private boolean isDownloadSuccess; // 下载是否成功
private String errorMsg; // 错误信息
}
```
#### 2.2.3 GFS数据下载
目录:`download/gfs/`
该模块实现了GFS全球预报系统气象数据的下载功能
1. 支持配置下载起始时间
2. 提供单文件和批量下载能力
3. 包含下载状态跟踪和错误处理
4. 支持UTC和北京时间的转换
### 2.3 网格数据处理模块
目录:`griddata/`
#### 2.3.1 数据表配置TableConfig
文件:`griddata/common/TableConfig.java`
```java
@Data @Component @Slf4j
public class TableConfig {
private String dataTableName; // 数据表名
private String metaTableName; // 元数据表名
private String dataIndexName; // 数据索引名
private String metaIndexName; // 元数据索引名
private String dataDir; // 数据目录
private List<String> variableList; // 变量列表
private int lonSize; // 经度网格数
private int latSize; // 纬度网格数
private int levSize; // 层次数
private int timeToLive; // 数据生存时间
// 网格参数
private double[] lonList; // 经度列表
private double[] latList; // 纬度列表
private int[] pressureList; // 气压层次
private int[] heightList; // 高度层次
}
```
#### 2.3.2 数据导入GfsDataImport
文件:`griddata/operation/GfsDataImport.java`
主要功能:
1. 网格数据导入到阿里云表格存储
2. 支持多维度数据处理:
- 时间维度
- 空间维度(经纬度)
- 垂直维度(气压层/高度层)
3. 数据处理流程:
- 初始化元数据
- 读取NC文件
- 数据单位转换
- 网格数据写入
- 更新元数据状态
关键特性:
1. 支持并发导入
2. 错误处理和状态跟踪
3. 支持断点续传
4. 数据完整性验证
#### 2.3.3 数据操作类
目录:`griddata/operation/`
1. BaseTableOperation表操作基类
2. CreateTable创建数据表
3. GfsDataFetcher数据获取
4. QueryMeta元数据查询
5. UpdateTable表更新
6. DataDeleter数据删除
### 2.4 定时任务模块
目录:`schedule/`
#### 2.4.1 网格数据处理器GridDataProcessor
文件:`schedule/GridDataProcessor.java`
```java
@Component
@Slf4j
@DependsOn({"gfsDataImport", "gfsDownloader"})
public class GridDataProcessor {
// 定时任务每日北京时0,8,12,18点30分执行
@Scheduled(cron = "0 30 0,8,12,18 * * ?")
public void dailyDataProcess() {
if (download()) { // 下载数据
importToTableStore(); // 导入数据库
}
clearExpiredData(); // 清理过期数据
}
}
```
主要功能:
1. 数据下载管理
- 获取文件信息
- 执行下载
- 处理下载失败
2. 数据导入管理
- 导入表格存储
- 处理导入失败
3. 数据清理
- 清理3天前的过期数据
- 日志记录
#### 2.4.2 错误报告服务ErrorReportService
文件:`schedule/ErrorReportService.java`
```java
@Service
@Slf4j
public class ErrorReportService {
// 邮件发送,支持重试
@Retryable(maxAttempts = 4, backoff = @Backoff(delay = 2000, multiplier = 2))
public void sendSimpleEmail(final Mail mail) {
// 发送邮件逻辑
}
// 远程报告,支持重试
@Retryable(maxAttempts = 4, backoff = @Backoff(delay = 2000, multiplier = 2))
public void reportToRemote(final ErrorReport report) {
// 发送远程报告逻辑
}
}
```
特性:
1. 支持邮件通知
2. 支持远程报告
3. 失败重试机制
4. 多种通知方式
### 2.5 Web接口模块
目录:`web/`
#### 2.5.1 地面天气控制器SurfaceWeatherController
文件:`web/controller/SurfaceWeatherController.java`
```java
@RestController
@RequestMapping("/htfp/weather/v1/surface/")
public class SurfaceWeatherController {
// 地面实时气象信息查询
@PostMapping("/querySurfaceNowWeather")
public Result queryNowWeather(@Validated @RequestBody Position2D position2D)
// 地面24小时预报结果查询
@PostMapping("/querySurfaceForecast")
public Result querySurfaceForecast(@Validated @RequestBody Position2D position2D)
// 地面气象预警信息查询
@PostMapping("/queryWeatherWarning")
public Result queryWeatherWarning(@Validated @RequestBody Position2D position2D)
// 全国地面气象预警信息查询
@PostMapping("/queryAllWeatherWarning")
public Result queryWeatherWarning()
}
```
主要功能:
1. 地面实时天气查询
2. 24小时天气预报
3. 气象预警信息
4. 支持多数据源切换(和风天气、彩云天气等)
#### 2.5.2 高空天气控制器UpperWeatherController
文件:`web/controller/UpperWeatherController.java`
```java
@RestController
@RequestMapping("/htfp/weather/v1/upper/")
public class UpperWeatherController {
// 高空实时气象信息查询
@PostMapping("/queryUpperNowWeather")
public Result queryUpperNowWeather(@Validated @RequestBody Position3D position3D)
// 高空航点实时气象信息查询
@PostMapping("/queryUpperNowWeatherInMultiPoints")
public Result queryUpperNowWeatherInMultiPoints(@Validated @RequestBody MultiPointsRequest request)
// 高空24小时预报结果查询
@PostMapping("/queryUpperForecast")
public Result queryUpperForecast(@Validated @RequestBody Position3D position3D)
// 高度廓线查询
@RequestMapping("/queryProfileByPressure")
public Result queryProfileByAndPressure(@Validated @RequestBody ProfileRequest request)
// 平面网格数据查询
@PostMapping("/queryPlaneGrid")
public Result queryPlaneGrid(@Validated @RequestBody PlaneRequest request)
}
```
主要功能:
1. 高空实时天气查询
- 单点查询
- 多点查询(航线)
2. 高空天气预报
- 24小时预报
- 多点预报
3. 高度廓线分析
- 气压坐标
- 近地面高度坐标
4. 平面网格数据查询
#### 2.5.3 接口特性
1. RESTful API设计
2. 跨域支持(@CrossOrigin
3. 参数验证(@Validated
4. 统一响应格式Result
5. 接口日志记录(@ControllerLog
6. 异常处理ControllerExceptionAdvice
#### 2.5.4 数据模型
1. 请求参数:
- Position2D二维位置经纬度
- Position3D三维位置经纬度+高度)
- MultiPointsRequest多点请求
- ProfileRequest廓线请求
- PlaneRequest平面网格请求
2. 响应数据:
- NowWeatherStatus实时天气状态
- TimeSeriesDataset时间序列数据
- SurfaceWeatherWarning天气预警信息
- ProfileResponse廓线响应
- PlaneResponse平面网格响应
### 2.6 工具类模块
目录:`utils/`
#### 2.6.1 HTTP客户端工具HttpClientUtils
文件:`utils/HttpClientUtils.java`
提供HTTP请求相关功能
1. GET请求
2. POST请求
3. SSL证书处理
4. 请求头管理
5. 响应处理
#### 2.6.2 JSON工具JSONUtils
文件:`utils/JSONUtils.java`
JSON数据处理工具
1. 对象序列化
2. JSON解析
3. 文件读写
4. 类型转换
#### 2.6.3 气象工具MeteoUtils
文件:`utils/MeteoUtils.java`
气象数据处理工具:
1. 气压高度转换
2. 温度单位转换
3. 风向风速计算
4. 气象要素计算
#### 2.6.4 时间工具DateTimeUtils
文件:`utils/DateTimeUtils.java`
时间处理工具:
1. 时区转换
2. 格式化处理
3. 时间计算
4. UTC时间处理
#### 2.6.5 数组工具NdArrayUtils
文件:`utils/NdArrayUtils.java`
多维数组处理工具:
1. 数组维度转换
2. 数据提取
3. 数组操作
#### 2.6.6 Spring工具SpringUtil
文件:`utils/SpringUtil.java`
Spring相关工具
1. Bean管理
2. 上下文处理
3. 配置加载
## 3. 系统功能概述
### 3.1 核心功能
1. GFS气象数据处理
- 数据下载
- 数据解析
- 数据存储
- 数据查询
2. 天气信息服务
- 地面天气查询
- 高空天气查询
- 天气预警
- 天气预报
3. 数据分析能力
- 高度廓线分析
- 多点数据分析
- 网格数据分析
- 时序数据分析
### 3.2 技术特点
1. 数据处理
- 支持多维度数据
- 高效数据存储
- 实时数据更新
- 数据质量控制
2. 系统架构
- 模块化设计
- 可扩展性好
- 高可用性
- 易维护性
3. 接口设计
- RESTful规范
- 参数验证
- 异常处理
- 日志记录
4. 运维特性
- 监控告警
- 错误追踪
- 性能优化
- 安全保障
## 4. 后续开发建议
### 4.1 功能增强
1. 数据源扩展
- 增加更多气象数据源
- 支持数据源动态切换
- 实现数据源备份
2. 分析能力提升
- 增加更多气象要素分析
- 提供数据可视化能力
- 支持自定义分析模型
3. 接口优化
- 增加批量处理接口
- 优化接口响应时间
- 提供WebSocket接口
### 4.2 性能优化
1. 数据处理
- 优化数据存储结构
- 实现数据缓存
- 提高并发处理能力
2. 系统架构
- 引入微服务架构
- 实现服务集群
- 优化负载均衡
3. 运维能力
- 完善监控系统
- 优化告警机制
- 提升系统可用性
### 4.3 安全加强
1. 访问控制
- 实现用户认证
- 细化权限管理
- 加强接口安全
2. 数据安全
- 加密敏感数据
- 实现数据备份
- 审计日志完善
### 4.4 文档完善
1. 接口文档
- 详细API说明
- 示例代码
- 错误码说明
2. 运维文档
- 部署说明
- 配置说明
- 故障处理
3. 开发文档
- 架构说明
- 开发规范
- 测试用例