架構(gòu)在智慧校園系統(tǒng)中的應(yīng)用實(shí)踐)
1. 項(xiàng)目背景與核心價(jià)值高校信息化建設(shè)已經(jīng)進(jìn)入深水區(qū)傳統(tǒng)煙囪式的業(yè)務(wù)系統(tǒng)越來(lái)越難以滿足師生多元化的服務(wù)需求。去年我在參與某211高校的信息化評(píng)估時(shí)發(fā)現(xiàn)該校竟然同時(shí)運(yùn)行著17套獨(dú)立系統(tǒng)光是統(tǒng)一身份認(rèn)證就有3套不同的方案。這種碎片化現(xiàn)狀直接導(dǎo)致新生需要記住5組不同密碼教職工報(bào)銷(xiāo)要反復(fù)填寫(xiě)相同信息會(huì)議室預(yù)訂永遠(yuǎn)顯示已占用卻實(shí)際空置...基于SpringBoot的智慧校園服務(wù)系統(tǒng)正是為了解決這些痛點(diǎn)而生。這個(gè)畢業(yè)設(shè)計(jì)項(xiàng)目的核心價(jià)值在于通過(guò)微服務(wù)架構(gòu)整合教務(wù)、后勤、OA等核心業(yè)務(wù)利用統(tǒng)一身份認(rèn)證實(shí)現(xiàn)單點(diǎn)登錄基于行為數(shù)據(jù)分析提供個(gè)性化服務(wù)推薦建立標(biāo)準(zhǔn)化接口規(guī)范未來(lái)系統(tǒng)接入2. 技術(shù)架構(gòu)設(shè)計(jì)解析2.1 整體技術(shù)選型采用經(jīng)典的SpringBootMyBatis PlusVue.js技術(shù)棧但有幾個(gè)關(guān)鍵設(shè)計(jì)點(diǎn)值得注意認(rèn)證服務(wù)使用Spring Security OAuth2.0 JWT組合方案消息推送采用WebSocketSTOMP協(xié)議文件存儲(chǔ)使用MinIO替代FastDFS更易部署定時(shí)任務(wù)選用XXL-JOB分布式調(diào)度框架// 典型的多數(shù)據(jù)源配置示例 Configuration MapperScan(basePackages com.campus.mapper) public class DataSourceConfig { Bean ConfigurationProperties(spring.datasource.druid.master) public DataSource masterDataSource(){ return DruidDataSourceBuilder.create().build(); } Bean Primary public DynamicDataSource dataSource(){ MapObject, Object targetDataSources new HashMap(); targetDataSources.put(master, masterDataSource()); return new DynamicDataSource(masterDataSource(), targetDataSources); } }2.2 微服務(wù)模塊劃分系統(tǒng)按業(yè)務(wù)域劃分為6個(gè)核心微服務(wù)統(tǒng)一認(rèn)證中心auth-service教務(wù)管理服務(wù)edu-service后勤服務(wù)logistics-service消息中心message-service數(shù)據(jù)中臺(tái)data-service網(wǎng)關(guān)路由gateway特別注意微服務(wù)間調(diào)用建議采用FeignSentinel組合避免直接使用RestTemplate導(dǎo)致熔斷降級(jí)困難。3. 核心功能實(shí)現(xiàn)細(xì)節(jié)3.1 智能課表系統(tǒng)不同于傳統(tǒng)靜態(tài)課表本系統(tǒng)實(shí)現(xiàn)了教室實(shí)時(shí)狀態(tài)可視化通過(guò)IoT設(shè)備采集沖突檢測(cè)算法基于時(shí)間重疊度計(jì)算移動(dòng)端離線緩存策略-- 課表沖突檢測(cè)關(guān)鍵SQL SELECT COUNT(*) FROM course_schedule WHERE classroom_id #{classroomId} AND ((start_time BETWEEN #{start} AND #{end}) OR (end_time BETWEEN #{start} AND #{end})) AND day_of_week #{day} AND is_canceled 03.2 統(tǒng)一支付中臺(tái)整合校園卡、微信、支付寶的支付體系時(shí)需要注意交易流水號(hào)生成規(guī)則時(shí)間戳業(yè)務(wù)編碼隨機(jī)數(shù)對(duì)賬文件定時(shí)下載解析分布式事務(wù)處理采用Seata AT模式支付狀態(tài)機(jī)設(shè)計(jì)[待支付] - [支付中] - [支付成功/失敗] ↓ [部分退款] - [全額退款]4. 性能優(yōu)化實(shí)戰(zhàn)4.1 高并發(fā)場(chǎng)景應(yīng)對(duì)在選課秒殺場(chǎng)景下我們采用三級(jí)緩存策略本地緩存Caffeine課程基本信息Redis集群剩余名額計(jì)數(shù)數(shù)據(jù)庫(kù)最終一致性?xún)?yōu)化前后對(duì)比指標(biāo)優(yōu)化前優(yōu)化后QPS1204500平均響應(yīng)時(shí)間800ms35ms錯(cuò)誤率23%0.1%4.2 數(shù)據(jù)庫(kù)分庫(kù)分表學(xué)生成績(jī)表采用復(fù)合分片策略按學(xué)年水平分庫(kù)2020_edu, 2021_edu...按學(xué)院ID取模分表score_0到score_9# ShardingSphere配置片段 spring: shardingsphere: datasource: names: ds0,ds1 sharding: tables: t_score: actual-data-nodes: ds$-{0..1}.t_score_$-{0..9} database-strategy: standard: precise-algorithm-class-name: com.campus.sharding.YearPreciseShardingAlgorithm table-strategy: inline: algorithm-expression: t_score_$-{student_id % 10}5. 典型問(wèn)題排查實(shí)錄5.1 JWT令牌失效異常現(xiàn)象移動(dòng)端頻繁提示登錄已過(guò)期 排查過(guò)程檢查Redis發(fā)現(xiàn)令牌黑名單正常發(fā)現(xiàn)Nginx配置了60s keepalive_timeout而網(wǎng)關(guān)設(shè)置的令牌有效期是30分鐘 根本原因移動(dòng)運(yùn)營(yíng)商TCP連接回收策略導(dǎo)致長(zhǎng)連接中斷解決方案調(diào)整keepalive_timeout為300s客戶(hù)端增加心跳檢測(cè)機(jī)制實(shí)現(xiàn)靜默自動(dòng)續(xù)簽功能5.2 消息推送延遲線上反饋重要通知有時(shí)延遲10分鐘 分析工具Arthas監(jiān)控WebSocket線程池SkyWalking追蹤消息鏈路定位到問(wèn)題// 錯(cuò)誤寫(xiě)法同步阻塞 public void pushNotification(ListLong userIds, String content) { userIds.forEach(id - { webSocketSessionMap.get(id).sendMessage(content); // 阻塞點(diǎn) }); }優(yōu)化方案改用Netty的EventLoopGroup異步發(fā)送引入消息優(yōu)先級(jí)隊(duì)列增加失敗重試機(jī)制6. 擴(kuò)展功能建議對(duì)于想提升項(xiàng)目競(jìng)爭(zhēng)力的同學(xué)可以考慮接入ELK實(shí)現(xiàn)日志分析增加基于Flink的實(shí)時(shí)數(shù)據(jù)分析開(kāi)發(fā)微信小程序輕量版實(shí)現(xiàn)教室智能照明節(jié)能策略我在實(shí)際部署時(shí)發(fā)現(xiàn)使用PrometheusGrafana監(jiān)控SpringBoot Actuator端點(diǎn)特別有用能提前發(fā)現(xiàn)線程池阻塞等問(wèn)題。建議在application.yml中配置management: endpoints: web: exposure: include: * metrics: tags: application: ${spring.application.name}這個(gè)項(xiàng)目最讓我有成就感的是解決了食堂檔口智能推薦功能。通過(guò)分析學(xué)生消費(fèi)記錄和課程表用協(xié)同過(guò)濾算法實(shí)現(xiàn)了個(gè)性化推薦使檔口營(yíng)業(yè)額平均提升了18%。關(guān)鍵是要處理好冷啟動(dòng)問(wèn)題 - 我們采用了基于熱銷(xiāo)榜的降級(jí)策略。