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

原文地址:https://www.cnblogs.com/tomyu123/p/14207646.html