12306火车售票系统设计方案
12306火車售票系統設計方案
簡介
本項目是嘗試實現12306的網上售票系統,盡量接近真實的12306系統。在上一篇文章中,我們分析了系統的概念設計與需求分析。下面我將通過給出分解視圖、依賴視圖、執行視圖、實現視圖、部署視圖和數據庫實現來描述項目的完整設計方案。
分解視圖
???項目采用微服務架構,對模塊進行垂直拆分并水平擴展,保證系統的高性能。
不同模塊可能放在不同的機器上,通過PRC調用
TicketServer為購票服務,負責接受前端的請求,生成訂單,然后進行處理
ReTicketServer為退票服務
StaticSearchServer是靜態搜索功能,檢索靜態數據,如站點等
UserServer是用戶相關的服務
CandidateServer是候補服務,通過輪詢訪問票池是否還有余票,或者是退票
DynamicSearchServer動態數據的查詢,負責處理經常變化的數據的查詢,例如余票的查詢
PayServer負責支付和退款服務
TicketPool票池,用來存儲和計算余票情況
依賴視圖
模塊之間通過RPC調用,不同服務放在不同機器上,訪問頻率較高的操作搭建集群。
依賴視圖
分多個模塊,對幾個復雜的執行過程做時序圖。
支付
退票
購票
實現視圖
12306A/???????12306后端A小組
|------rpc???????grpc相關的接口和協議文件
|?? |------pay?? ??pay服務器的rpc代碼, 同理如果是user服務應該在該文件夾下建立user文件夾
|???? |------proto??.proto文件存放
|???? |------client??grpc客戶端, grpc服務再server中自己實現
|------server??????每個微服務項目
|?? |------candidate??候補服務器
|?? ?? |------controller??控制層,數據的接受的校驗
|?? ?? |------service??服務層,業務邏輯
|?? ?? |------model??模型層,與數據庫連接
|?? ?? |------redis??緩存連接
|?? ?? |------setting??配置服務
|?? ?? |------config??配置文件存放
|?? |------pay???? 支付服務器
|?? |------reticket???退票服務器
|?? |------search???搜索
|???? |------dynamic??動態搜索
|???? |------static??靜態搜索
|?? |------ticket????購票服務器
|?? |------user???? 用戶服務器
|------ticketPool???? 線程池服務,主要是對內提供服務
部署視圖
數據庫
?
技術選型說明
開發方法:
??主要采用面向接口的方式進行開發,盡量解耦合,模塊之間通過RPC調用,這樣能夠很好的保持軟件的可維護性和可擴展性。
保證軟件的安全性
采用JWT技術和gin框架自帶的validator對所用的數據進行驗證,拒絕非法數據,使用token拒絕過期服務。
性能要求
因為票是動態變化的,所以查詢與購票需要遍歷很多數據,我們盡量減少模塊之間的網絡通信時間,達到高性能的要求。redis是一個K-V內存數據庫,我們使用redis緩存最近的車票信息,減少對外存的訪問,而且將余票信息存在在內存中,這樣可以快速計算余票。
開發主要語言:Golang
開發環境:Windows10,MacOS
部署環境:Docker+Ubuntu
開發工具:Goland,VSCode
測試方案:wrk性能測試,配合前端進行黑盒測試,postman
總結
以上是生活随笔為你收集整理的12306火车售票系统设计方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java thread setname_
- 下一篇: 期中总结