SpringBoot+微信小程序实现高并发选课系统
1. 项目概述智慧校园选课系统的技术实现去年为某职业技术学院开发智慧校园系统时我深刻体会到传统选课模式存在的痛点高峰期服务器崩溃、手机端适配差、选课结果不同步等问题频发。基于SpringBoot微信小程序的解决方案我们最终实现了3000人同时在线选课零故障的成绩。这套系统核心包含微信小程序前端、SpringBoot后端服务、MySQL数据库三大模块通过合理的架构设计解决了高并发场景下的选课难题。微信小程序作为前端载体具有天然优势学生无需下载APP扫码即用利用微信账号体系自动绑定学籍信息支持实时消息推送选课结果。而后端采用SpringBoot快速构建RESTful API配合Redis缓存和分布式锁机制确保选课操作的原子性和数据一致性。2. 技术架构解析2.1 整体架构设计系统采用经典的三层架构模式[微信小程序] ←HTTP→ [SpringBoot API] ←JDBC→ [MySQL] ↑ [Redis缓存层]在具体实现上做了这些关键设计接口限流通过Guava RateLimiter控制每秒请求量热点数据缓存课程余量信息缓存到Redis并设置5秒过期分布式锁采用Redisson实现选课操作的互斥锁异步日志选课记录通过RabbitMQ异步写入数据库2.2 微信小程序端关键技术小程序端主要解决三个核心问题身份认证通过wx.login获取code后端交换openid并与学号绑定数据渲染采用WXS处理课程时间冲突检测逻辑交互优化使用骨架屏提升加载体验关键代码示例// pages/select/index.js Page({ data: { loading: true, courses: [] }, onLoad() { this.showSkeleton() wx.request({ url: https://api.xxx.com/courses, success: (res) { this.setData({ courses: res.data, loading: false }) } }) }, showSkeleton() { // 骨架屏显示逻辑 } })3. 后端核心实现3.1 SpringBoot应用配置采用多环境配置方案关键application.yml配置spring: profiles: active: profileActive redis: host: 127.0.0.1 port: 6379 timeout: 3000 datasource: url: jdbc:mysql://localhost:3306/course_db?useSSLfalse username: root password: 123456 hikari: maximum-pool-size: 203.2 选课业务逻辑实现核心选课服务伪代码Transactional public Result selectCourse(String studentId, Long courseId) { // 1. 校验选课资格 if(!checkQualification(studentId)) { return Result.error(不满足选课条件); } // 2. 获取分布式锁 RLock lock redissonClient.getLock(LOCK: courseId); try { if(lock.tryLock(3, 10, TimeUnit.SECONDS)) { // 3. 检查课程余量 Course course courseService.getById(courseId); if(course.getRemain() 0) { return Result.error(课程已满); } // 4. 执行选课操作 courseService.updateRemain(courseId, -1); selectionService.save(new Selection(studentId, courseId)); // 5. 发送选课成功通知 wechatService.sendTemplateMsg(studentId, course); return Result.success(); } } finally { lock.unlock(); } }3.3 高并发解决方案针对选课高峰期的技术措施缓存策略课程基本信息缓存120分钟课程余量信息缓存5秒通过Cacheable实现数据库优化课程表添加remain字段冗余计数选课记录表添加联合索引(student_id, course_id)服务降级当系统负载超过80%时关闭非核心功能如课程评价4. 数据库设计要点4.1 核心表结构CREATE TABLE t_course ( id bigint NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL COMMENT 课程名称, teacher_id bigint NOT NULL, max_num int DEFAULT 100 COMMENT 最大人数, remain int DEFAULT 100 COMMENT 剩余名额, schedule json DEFAULT NULL COMMENT 上课时间安排, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE t_selection ( id bigint NOT NULL AUTO_INCREMENT, student_id varchar(20) NOT NULL, course_id bigint NOT NULL, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_student_course (student_id,course_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;4.2 性能优化实践索引策略为教师ID添加普通索引加速查询选课记录表建立(student_id, course_id)联合唯一索引分表方案按学年分表存储选课记录t_selection_2023SQL优化避免使用SELECT *批量插入使用rewriteBatchedStatementstrue5. 部署与运维实战5.1 服务器环境搭建推荐使用Docker Compose部署version: 3 services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: 123456 ports: - 3306:3306 volumes: - ./mysql/data:/var/lib/mysql redis: image: redis:6 ports: - 6379:6379 app: build: . ports: - 8080:8080 depends_on: - mysql - redis5.2 监控与日志SpringBoot Actuator配置Configuration public class ActuatorConfig { Bean public MeterRegistryCustomizerPrometheusMeterRegistry metricsCommonTags() { return registry - registry.config().commonTags(application, course-system); } }ELK日志收集方案Filebeat采集SpringBoot日志Logstash进行日志过滤Kibana展示实时监控数据6. 典型问题排查实录6.1 微信小程序常见问题问题1iOS设备无法播放课程视频现象控制台报错MEDIA_ERR_NETWORK原因微信iOS端对HTTPS证书要求更严格解决方案确保证书链完整视频服务器开启Range请求支持使用微信官方video组件替代webview问题2上传文件失败错误信息backgroundfetch privacy fail解决方法wx.chooseMessageFile({ count: 1, type: file, success(res) { // 必须在此回调中立即调用上传接口 uploadFile(res.tempFiles[0].path) } })6.2 后端性能问题场景选课高峰期接口响应变慢排查步骤使用Arthas监控方法执行时间发现Redis连接获取阻塞检查连接池配置优化方案spring: redis: lettuce: pool: max-active: 50 max-wait: 10007. 扩展功能建议智能推荐系统基于协同过滤算法推荐相似课程实现代码片段# 使用Surprise库实现推荐 from surprise import Dataset, KNNBasic data Dataset.load_builtin(ml-100k) algo KNNBasic() algo.fit(data.build_full_trainset())可视化数据分析使用ECharts展示选课热力图集成到管理后台实时监控消息推送增强课程变更通知上课提醒功能使用微信订阅消息模板这套系统在实际运行中经受住了3000并发量的考验关键点在于合理的缓存策略、精细的锁控制、以及前后端的协同优化。特别提醒微信小程序端的网络状态处理需要格外注意建议增加本地缓存机制应对弱网环境。对于课程冲突检测这类复杂逻辑推荐放在服务端实现以保证一致性。