12306项目的亮点
* 海量数据分库分表
* 多种设计模式代码中实战
* 敏感数据加密存储
* 保障数据库与缓存一致性
* 全局唯一分布式 ID 改造
* 缓存穿透&击穿等问题
* 售票的业务问题
1.项目概述
12306项目采用前后端分离的分布式架构实现的,前端主要完成会员登陆,注册,购票,订单等功能的展示,其中会员可以使用浏览器通过用户名或邮箱或手机号三者中的任意一个配合密码完成登陆;后端主要以微服务的形式提供数据支持和业务流程处理;
需求分析
12306的核心业务逻辑有3块,分别是: 车票模块,会员模块,订单模块;
**会员模块的核心功能:**
1. 会员注册/登陆
2. 个人信息展示/编辑
3. 乘车人/CRUD
**票务模块的功能有:**
1. 车票查询(带分页和条件)/预订车票
**订单模块的核心功能有:**
1. 全部车票订单
2. 本人车票订单
3. 订单支付
4. 订单删除
相关技术:**
前后端分离架构 + 高并发技术项目实战
Vue3 + Vue CLI5 + Ant Design Vue3
JDK17
Springboot3 (最低JDK17)
SpirngCloudAlibaba 2022:gateway、nacos、sentinel、openfeign
mybatis plus、通用mapper
高并发技术:分布式缓存、分布式锁、分布式事务、限流、异步削峰等
xxl-job
首先搭建微服务
1.新建父工程
* pom中加入依赖
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2、搭建公共模块common
* pom中加入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
3、搭建提供者business
* pom加入公共模块即可
<dependencies>
<dependency>
<groupId>com.jiyun</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
在resource下创建application.yml文件
在com.**下创建business启动类
创建application-dev.yml文件并且写入配置文件更改数据库名称
在resources下创建templates包导入
通过Gene编写controller mapper service 层
4、搭建网关
* pom文件
<dependencies>
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
在com.**下创建GatewayApplication启动类
在resource下创建application.yml文件
创建application-dev.yml文件并且写入配置文件
server:
port: 10010
spring:
application:
name: gatewayh2204a
cloud:
nacos:
server-addr: localhost:8848
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求,这里填写你前端项目的路径
- "*"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期
routes: # 网关路由配置
- id: consumerh2204a # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://consumerh2204a # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/consumer/** # 这个是按照路径匹配,只要以/user/开头就符合要求
4.搭建服务消费者member
写入pom文件
在com.**下写入MemberApplication启动类
在resource下创建application.yml文件
创建application-dev.yml文件并且写入配置文件更改端口号防止端口被占用
编写controller mapper service 层
在userController下编写查询全部分页代码
编写逻辑删除代码
//不能使用Mybatis=plus的逻辑删除功能,手动实现逻辑删除 //给username这个人的del_flag改为1 //update user set del_flag=1 where username=#{username}