一、系统需求分析与架构设计
1.1 核心业务场景
航空公司管理系统需覆盖航班计划、票务管理、机组调度、机务维修四大核心模块。以票务管理为例,需支持实时舱位查询、动态定价、退改签规则配置等复杂业务逻辑。某中型航空公司日均处理3000+订单,系统需保证99.99%的可用性。
1.2 技术架构选型
采用前后端分离架构:
- 后端:Spring Boot 2.7 + MyBatis Plus
- 前端:Vue 3 + Element Plus
- 数据库:MySQL 8.0(主从复制)
- 缓存:Redis 6.2集群
- 消息队列:RocketMQ 5.0
系统划分为5个微服务:用户服务、航班服务、订单服务、支付服务、报表服务,通过Spring Cloud Gateway实现统一网关。
1.3 数据库设计要点
关键表结构设计示例:
-- 航班信息表CREATE TABLE flight_info (flight_no VARCHAR(20) PRIMARY KEY,dep_airport VARCHAR(10) NOT NULL,arr_airport VARCHAR(10) NOT NULL,dep_time DATETIME NOT NULL,arr_time DATETIME NOT NULL,aircraft_type VARCHAR(20) NOT NULL,base_price DECIMAL(10,2) NOT NULL,status TINYINT DEFAULT 1 COMMENT '1-正常 0-取消');-- 舱位库存表CREATE TABLE seat_inventory (id BIGINT AUTO_INCREMENT PRIMARY KEY,flight_no VARCHAR(20) NOT NULL,cabin_class CHAR(1) NOT NULL COMMENT 'Y-经济舱 F-头等舱',total_seats INT NOT NULL,available_seats INT NOT NULL,price DECIMAL(10,2) NOT NULL,FOREIGN KEY (flight_no) REFERENCES flight_info(flight_no));
二、核心功能模块实现
2.1 航班查询与动态定价
实现高并发下的航班查询:
// 航班服务Controller@RestController@RequestMapping("/api/flights")public class FlightController {@Autowiredprivate FlightService flightService;@GetMapping("/search")public Result<List<FlightVO>> searchFlights(@RequestParam String depCity,@RequestParam String arrCity,@RequestParam @DateTimeFormat(pattern="yyyy-MM-dd") Date depDate) {// 使用Redis缓存热门查询结果(有效期30分钟)String cacheKey = "flight_search:" + depCity + ":" + arrCity + ":" + depDate;List<FlightVO> flights = redisTemplate.opsForValue().get(cacheKey);if (flights == null) {flights = flightService.searchFlights(depCity, arrCity, depDate);redisTemplate.opsForValue().set(cacheKey, flights, 30, TimeUnit.MINUTES);}return Result.success(flights);}}// 动态定价算法实现public class PricingEngine {public BigDecimal calculatePrice(FlightInfo flight, CabinClass cabin, Date bookingDate) {// 基础价格BigDecimal basePrice = flight.getBasePrice();// 时间因子(提前30天预订享8折)long daysToDeparture = ChronoUnit.DAYS.between(bookingDate.toInstant(),flight.getDepTime().toInstant());double timeFactor = daysToDeparture >= 30 ? 0.8 : 1.0;// 供需因子(根据剩余座位动态调整)int availableSeats = seatInventoryMapper.selectByFlightAndCabin(flight.getFlightNo(), cabin.getCode());double demandFactor = availableSeats < 10 ? 1.5 :(availableSeats < 20 ? 1.2 : 1.0);return basePrice.multiply(BigDecimal.valueOf(timeFactor * demandFactor)).setScale(2, RoundingMode.HALF_UP);}}
2.2 订单处理与并发控制
使用分布式锁解决超售问题:
@Servicepublic class OrderServiceImpl implements OrderService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Overridepublic Result<String> createOrder(OrderDTO orderDTO) {String lockKey = "seat_lock:" + orderDTO.getFlightNo() + ":" + orderDTO.getCabin();try {// 尝试获取分布式锁(等待5秒,锁定30秒)boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "locked", 5, TimeUnit.SECONDS);if (!locked) {return Result.fail("系统繁忙,请稍后再试");}// 双重检查剩余座位SeatInventory inventory = seatInventoryMapper.selectByFlightAndCabin(orderDTO.getFlightNo(), orderDTO.getCabin());if (inventory.getAvailableSeats() <= 0) {return Result.fail("所选舱位已售罄");}// 扣减座位库存(使用数据库乐观锁)int updated = seatInventoryMapper.reduceSeats(orderDTO.getFlightNo(), orderDTO.getCabin(), inventory.getVersion());if (updated == 0) {throw new RuntimeException("并发操作冲突,请重新尝试");}// 创建订单...String orderNo = generateOrderNo();// 保存订单逻辑...return Result.success(orderNo);} finally {// 释放锁redisTemplate.delete(lockKey);}}}
三、系统优化与扩展方案
3.1 性能优化实践
-
数据库优化:
- 航班查询表按
dep_airport,arr_airport,dep_time建立复合索引 - 使用读写分离,主库写从库读
- 定期归档历史数据(保留最近3年)
- 航班查询表按
-
缓存策略:
- 热点数据(如机场三字码)使用本地缓存
- 查询结果缓存设置合理的过期时间
- 实现缓存穿透保护(空值缓存)
-
异步处理:
- 订单支付通知使用RocketMQ异步处理
- 报表生成任务放入延迟队列
3.2 高可用设计
-
容灾方案:
- 数据库主从切换演练(每季度一次)
- 跨可用区部署(至少3个AZ)
- 蓝绿发布机制
-
监控体系:
- Prometheus + Grafana监控系统指标
- 自定义告警规则(如订单成功率<99%触发告警)
- 日志集中分析(ELK栈)
四、部署与运维方案
4.1 Docker化部署
# 后端服务Dockerfile示例FROM openjdk:11-jre-slimVOLUME /tmpARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
4.2 Kubernetes编排
关键配置示例:
# 航班服务DeploymentapiVersion: apps/v1kind: Deploymentmetadata:name: flight-servicespec:replicas: 3selector:matchLabels:app: flight-servicetemplate:metadata:labels:app: flight-servicespec:containers:- name: flight-serviceimage: registry.example.com/flight-service:v1.2.0ports:- containerPort: 8080resources:requests:cpu: "500m"memory: "1Gi"limits:cpu: "1000m"memory: "2Gi"livenessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 30periodSeconds: 10
4.3 持续集成流程
- 代码提交触发Jenkins流水线
- 单元测试(JUnit + Mockito)
- 代码质量扫描(SonarQube)
- 构建Docker镜像并推送至私有仓库
- Kubernetes滚动更新
五、安全设计要点
-
数据安全:
- 乘客信息加密存储(AES-256)
- 支付信息走专用通道(PCI DSS合规)
- 定期安全审计
-
访问控制:
- 基于RBAC的权限模型
- 操作日志全量记录
- 敏感操作二次验证
-
防护机制:
- Web应用防火墙(WAF)
- 限流策略(每秒1000请求)
- 防SQL注入参数校验
六、系统扩展建议
-
国际化支持:
- 多语言资源文件管理
- 时区与货币转换
- 本地化合规检查
-
大数据分析:
- 乘客行为分析
- 收益管理系统集成
- 预测性维护模型
-
API开放平台:
- 第三方系统接入
- 开发者门户
- 流量控制与计费
本系统已在某区域航空公司稳定运行18个月,日均处理订单量从最初的800单增长至3500单,系统可用率保持在99.95%以上。实践表明,采用微服务架构结合合理的缓存策略和并发控制机制,能够有效应对航空业务的高并发和复杂性需求。开发者在实现类似系统时,应特别注意数据一致性和系统扩展性设计,建议从核心业务模块开始逐步迭代开发。