1. 项目背景与核心需求
无人共享健身房作为近年来兴起的新型健身模式,正在快速改变传统健身行业的运营方式。这种24小时无人值守的智能健身空间,通过物联网技术、移动支付和自动化管理,实现了健身服务的"去人工化"运营。作为技术核心的后端系统,需要同时处理硬件设备控制、用户服务、支付结算等多维度需求。
这个Java后端项目需要解决几个关键问题:
- 设备状态实时监控(跑步机、力量器械等IoT设备)
- 多端用户鉴权与权限管理(小程序/APP/管理后台)
- 动态定价与分时计费逻辑
- 订单与支付系统的强一致性
- 高并发场景下的系统稳定性
提示:在健身行业,上午7-9点、晚上7-10点是典型的流量高峰时段,系统设计必须考虑10倍日常流量的突发请求处理能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选型
采用Spring Boot 3.x作为基础框架,配合以下核心组件:
- 设备通信:Netty + MQTT协议(低延迟设备控制)
- 数据持久化:MySQL 8.0(事务型数据)+ Redis 7(缓存/秒杀)
- 分布式协调:Zookeeper(设备状态管理)
- 消息队列:RocketMQ 5.0(订单异步处理)
- 监控体系:Prometheus + Grafana(实时系统监控)
java复制// 典型设备状态上报处理逻辑示例
@MQTTListener(topic = "equipment/status/+")
public void handleEquipmentStatus(MqttMessage message) {
EquipmentStatus status = JsonUtils.parse(message.getPayload(), EquipmentStatus.class);
equipmentService.updateStatus(status);
if(status.getErrorCode() != 0) {
alertService.triggerEquipmentAlert(status);
}
}
2.2 微服务拆分方案
系统按功能划分为六个微服务:
- 用户中心服务(会员体系/权限管理)
- 设备控制服务(IoT指令下发/状态采集)
- 订单服务(计费规则/订单生成)
- 支付服务(多渠道支付对接)
- 调度服务(自动清洁/设备维护)
- 数据分析服务(用户行为分析)
3. 核心业务逻辑实现
3.1 动态定价算法
采用基于时间和使用率的双重因素定价模型:
java复制public BigDecimal calculateDynamicPrice(LocalDateTime time,
Integer currentUsers,
Integer totalCapacity) {
// 基础时段价格
BigDecimal basePrice = getBasePriceByTime(time);
// 负载率系数 = 当前人数 / 总容量
double loadFactor = currentUsers.doubleValue() / totalCapacity;
// 动态调整公式
return basePrice.multiply(BigDecimal.valueOf(1 + 0.5 * loadFactor));
}
3.2 设备控制状态机
每个健身设备实现为有限状态机:
code复制[待机] --扫码成功--> [准备中] --用户确认--> [使用中]
↑ |
|--超时未确认-- |--异常停止--> [故障]
| |
|--支付失败-- |--正常结束--> [待清洁]
对应Java实现:
java复制public enum EquipmentState {
IDLE,
PREPARING,
IN_USE,
NEED_CLEANING,
MALFUNCTION
}
// 状态转换校验逻辑
public boolean canTransit(EquipmentState from, EquipmentState to) {
switch (from) {
case IDLE:
return to == PREPARING;
case PREPARING:
return to == IN_USE || to == IDLE;
// ...其他状态转换规则
}
}
4. 多端对接关键技术
4.1 微信小程序对接
采用JWT+双token机制保障安全:
- access_token(30分钟有效期)
- refresh_token(7天有效期)
java复制// 小程序登录拦截器示例
public class MiniProgramInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
String token = request.getHeader("X-Access-Token");
if(!jwtHelper.validateToken(token)) {
throw new BizException(ErrorCode.TOKEN_INVALID);
}
// 将用户信息存入ThreadLocal
UserContext.set(jwtHelper.parseUser(token));
return true;
}
}
4.2 管理后台SSE实时推送
使用Server-Sent Events实现设备状态实时看板:
java复制@GetMapping("/equipment/events")
public SseEmitter streamEquipmentEvents() {
SseEmitter emitter = new SseEmitter(3600_000L);
equipmentEventPublisher.addEmitter(emitter);
emitter.onCompletion(() -> equipmentEventPublisher.removeEmitter(emitter));
return emitter;
}
// 设备状态变更时推送
public void pushEquipmentUpdate(Equipment equipment) {
SseEmitter.SseEventBuilder event = SseEmitter.event()
.name("equipment_update")
.data(equipment);
emitters.forEach(emitter -> {
try {
emitter.send(event);
} catch (IOException e) {
emitter.complete();
}
});
}
5. 高并发优化实践
5.1 热点数据缓存策略
采用多级缓存架构:
- 本地Caffeine缓存(毫秒级响应)
- Redis集群缓存(秒级数据)
- MySQL持久化(最终一致性)
java复制@Cacheable(value = "equipment",
key = "#id",
cacheManager = "multiLevelCacheManager")
public Equipment getEquipmentById(Long id) {
return equipmentMapper.selectById(id);
}
5.2 分布式锁实现
基于Redisson实现设备操作互斥锁:
java复制public boolean startEquipment(Long userId, Long equipmentId) {
RLock lock = redissonClient.getLock("equipment:" + equipmentId);
try {
if(lock.tryLock(3, 10, TimeUnit.SECONDS)) {
// 业务处理
return equipmentService.start(userId, equipmentId);
}
throw new BizException("设备操作冲突");
} finally {
lock.unlock();
}
}
6. 安全防护体系
6.1 支付风控规则
- 同设备15分钟内最多3次支付尝试
- 单日累计金额不超过5000元
- 夜间时段(0-6点)大额支付需短信验证
java复制public void checkPaymentRisk(PaymentRequest request) {
// 规则1:频率检查
int recentAttempts = paymentMapper.countRecentAttempts(
request.getDeviceId(),
LocalDateTime.now().minusMinutes(15));
if(recentAttempts >= 3) {
throw new PaymentRiskException("操作过于频繁");
}
// 规则2:时段检查
if(isNightTime() && request.getAmount().compareTo(NIGHT_LIMIT) > 0) {
smsService.sendVerifyCode(request.getMobile());
}
}
6.2 设备指令签名验证
采用HMAC-SHA256保证指令真实性:
java复制public boolean verifyCommand(EquipmentCommand command) {
String computed = HmacUtils.hmacSha256Hex(secretKey,
command.getEquipmentId() + command.getTimestamp());
return computed.equals(command.getSignature());
}
7. 运维监控方案
7.1 健康检查端点
Spring Boot Actuator定制端点:
yaml复制# application.yml配置
management:
endpoints:
web:
exposure:
include: health,metrics,equipment
endpoint:
health:
show-details: always
equipment:
enabled: true
7.2 日志追踪体系
基于MDC实现全链路追踪:
java复制@Aspect
public class LogTraceAspect {
@Before("execution(* com..service.*.*(..))")
public void before(JoinPoint jp) {
MDC.put("traceId", UUID.randomUUID().toString());
}
@AfterReturning(pointcut = "execution(* com..service.*.*(..))",
returning = "result")
public void afterReturning(Object result) {
log.info("Result: {}", result);
MDC.clear();
}
}
8. 项目部署实践
8.1 Docker化部署
多阶段构建优化镜像大小:
dockerfile复制# 第一阶段:构建
FROM maven:3.8-jdk-17 AS build
COPY . /app
RUN mvn -f /app/pom.xml clean package
# 第二阶段:运行
FROM openjdk:17-jdk-slim
COPY --from=build /app/target/*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
8.2 Kubernetes资源配置
HPA自动扩缩容配置示例:
yaml复制apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: order-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
在实际部署中,我们通过Jenkins Pipeline实现了从代码提交到Kubernetes集群的全自动化部署,平均部署时间从原来的15分钟缩短到3分钟。特别是在流量突增时,HPA能在2分钟内完成pod扩容,保证高峰期的服务稳定性。
