1. 项目背景与核心价值
家政服务行业近年来呈现爆发式增长态势,随着城市化进程加快和双职工家庭增多,市场对规范化、数字化家政服务平台的需求日益迫切。传统家政服务存在信息不对称、服务标准不统一、支付安全无保障等痛点,这正是我们开发这套系统的核心出发点。
SpringBoot作为当前Java领域最主流的轻量级框架,其开箱即用的特性和丰富的starter组件,能够快速构建高可用的家政服务系统。这套系统实现了从用户预约、服务人员匹配、在线支付到评价反馈的全流程数字化管理,解决了传统电话预约模式下的三大核心问题:服务响应慢、过程不透明、质量难追溯。
2. 系统架构设计解析
2.1 技术栈选型依据
后端采用SpringBoot 2.7 + MyBatis Plus组合,主要基于以下考量:
- SpringBoot的自动配置特性可快速集成Redis(缓存)、RabbitMQ(异步通知)等中间件
- MyBatis Plus提供的Lambda表达式查询,比传统XML方式开发效率提升40%以上
- 采用多模块Maven工程,将业务逻辑、数据访问、API接口分层解耦
前端采用Vue3 + Element Plus方案,实测数据显示:
- 组件化开发使页面复用率提升至65%
- Axios封装的统一请求拦截器,减少30%的重复代码量
- 采用JWT无状态认证,支持移动端和PC端统一鉴权
2.2 微服务化设计要点
虽然单体架构足以支撑初期业务,但我们仍预留了微服务扩展能力:
- 通过Spring Cloud Alibaba Nacos实现配置中心化
- 使用FeignClient抽象服务间调用接口
- 数据库按业务垂直分库(用户库、订单库、服务库)
- 关键业务表设计分片键(如按地区分片的服务人员表)
3. 核心业务模块实现
3.1 智能派单算法
java复制// 基于权重计算的派单逻辑核心代码
public Staff dispatchService(Order order) {
List<Staff> candidates = staffMapper.selectAvailableStaff(
order.getServiceType(),
order.getLocation()
);
return candidates.stream()
.max(Comparator.comparingDouble(staff ->
0.4 * staff.getScore() +
0.3 * (1 - distance(staff, order)) +
0.2 * staff.getAcceptRate() +
0.1 * staff.getResponseSpeed()
)).orElseThrow();
}
权重分配策略:
- 历史评分(40%):体现服务质量
- 距离系数(30%):采用Haversine公式计算实际距离
- 接单率(20%):反映服务积极性
- 响应速度(10%):平均接单响应时间
3.2 支付结算流程
采用TCC型分布式事务保证资金安全:
- Try阶段:冻结用户账户金额
- Confirm阶段:实际划转至平台中间账户
- Cancel阶段:服务取消时解冻金额
关键数据库表设计:
sql复制CREATE TABLE `payment_transaction` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_id` varchar(32) NOT NULL COMMENT '业务订单号',
`amount` decimal(10,2) NOT NULL,
`status` tinyint NOT NULL COMMENT '0-待支付 1-已支付 2-已退款',
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 性能优化实践
4.1 缓存策略设计
采用多级缓存架构:
- 本地缓存(Caffeine):缓存静态配置数据,TTL=5分钟
- Redis缓存:
- 服务人员信息:30分钟过期 + 主动更新
- 地理围栏数据:永不过期 + 版本号控制
- 数据库缓存:
- 使用MySQL查询缓存(8.0以下版本)
- 关键表增加内存引擎(如用户基础表)
4.2 高并发处理方案
压力测试数据(4核8G服务器):
- 无缓存时:QPS约120,平均响应时间450ms
- 优化后:QPS提升至2100,响应时间降至85ms
具体优化措施:
- 使用Redisson实现分布式锁,解决超卖问题
- 热点数据预加载:每日凌晨预计算各区域服务人员分布
- 写操作异步化:通过RabbitMQ实现订单状态变更的最终一致性
5. 安全防护体系
5.1 敏感数据保护
- 数据加密:
- 身份证号使用AES-256-GCM加密存储
- 数据库连接信息通过Jasypt加密
- 接口安全:
- 敏感接口增加@PreAuthorize注解
- 使用Spring Security OAuth2实现RBAC
- 日志脱敏:
java复制@Bean public ConversionRule conversionRule() { return new MaskingConversionRule("*") .addPattern("1[3-9]\\d{9}") // 手机号 .addPattern("\\d{17}[\\dXx]"); // 身份证 }
5.2 常见攻击防护
- SQL注入:
- 强制使用MyBatis参数绑定
- 安装Druid Filter拦截可疑SQL
- XSS攻击:
- 全局配置Jackson的HTML转义
- 前端使用DOMPurify过滤富文本
- CSRF防护:
- 启用Spring Security的CSRF保护
- 关键操作增加二次验证
6. 部署与监控方案
6.1 容器化部署
Docker Compose编排示例:
yaml复制version: '3'
services:
app:
image: jdk17-springboot-app
ports:
- "8080:8080"
depends_on:
- redis
- mysql
redis:
image: redis:6-alpine
volumes:
- redis_data:/data
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
6.2 监控指标设计
Prometheus监控关键指标:
- 业务指标:日活用户数、订单转化率、平均服务时长
- 系统指标:JVM内存使用率、SQL执行耗时、缓存命中率
- 告警阈值:
- CPU持续5分钟>80%
- 订单失败率>1%
- 平均响应时间>1s
7. 典型问题排查实录
7.1 分布式事务问题
现象:订单状态显示支付成功,但服务人员端未收到通知
排查步骤:
- 检查RabbitMQ消息队列积压情况
- 确认消费者服务日志是否有异常
- 查询分布式事务协调器状态
- 最终发现是网络分区导致的事务悬挂
解决方案:
- 增加事务状态补偿任务
- 实现人工干预接口
- 添加事务生命周期监控
7.2 缓存一致性挑战
问题场景:服务人员修改基础信息后,客户端仍显示旧数据
优化方案:
- 采用Cache Aside Pattern策略
- 关键数据变更时广播Redis Pub/Sub消息
- 实现双删策略(更新前删缓存+更新后延迟删)
java复制@Transactional
public void updateStaff(Staff staff) {
// 第一次删除
redisTemplate.delete("staff:" + staff.getId());
// 更新数据库
staffMapper.updateById(staff);
// 发送广播消息
redisTemplate.convertAndSend("staff.update", staff.getId());
// 延迟队列二次删除
delayQueue.add(new DeleteTask("staff:" + staff.getId(), 1000));
}
8. 扩展与演进方向
当前系统已支持家政服务的核心场景,后续可扩展:
- 智能硬件对接:门锁摄像头等设备接入
- 保险服务集成:为高价服务提供保障
- 培训认证体系:建立服务人员技能图谱
- 大数据分析:用户行为预测与个性化推荐
在架构演进上建议:
- 当QPS突破5000时考虑服务拆分
- 引入Elasticsearch实现复杂搜索
- 采用Service Mesh治理微服务