Java秒杀方案

目录

项目搭建

SpringBoot

Lombok

Spring Web

Thymeleaf

Mybatis-plus

分布式会话

用户登录

逆向工程

参数校验

异常处理

共享Session

功能开发

前提:用逆向工程生成数据库表对应所需要的所有类

商品列表

商品详情

秒杀

订单详情

系统压测

JMeter入门

自定义变量

JMeterr命令行

正式压测

页面优化

缓存

静态化分离

库存超卖

服务优化

RabbitMQ消息队列

接口优化

分布式锁

安全优化

隐藏秒杀地址

算术验证码

接口限流


项目搭建

SpringBoot

Lombok

  • 是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码

Spring Web

Thymeleaf

  • 是一个Java XML / XHTML / HTML5 模板引擎 ,可以在Web(基于servlet )和非Web环境中工作。它更适合在基于MVC的Web应用程序的视图层提供XHTML / HTML5,但它甚至可以在脱机环境中处理任何XML文件。它提供完整的Spring Framework

Mybatis-plus

分布式会话

用户登录

  • 两次MD5加密 (MD5工具类)

    • 用户端 :PASS = MD5(明文 + 固定salt)

    • 客户端:PASS = MD5(用户输入 + 随机salt)

    • 目的:用户端MD5加密是为了防止用户密码在网络中明文传输,服务端MD5加密是为了提高密码安全性,双重保险

逆向工程

  • 使用了Mybatis-plus提供的AutoGenerator

  • 生成数据库表对应的POJO、Mapper、Service、ServiceImpl、Controller等

参数校验

  • 自定义注解

    • validation组件

    • isMobile注解

异常处理

  • @ControllerAdvice 和 @ExceptionHandler

    • 只能处理控制器抛出的异常。此时请求已经进入控制器中,可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大

  • @ErrorController

    • 可以处理所有的异常,包括未进入控制器的错误

共享Session

  • 目的:解决分布式会话的问题
  • 问题:Nginx 使用默认负载均衡策略(轮询),请求将会按照时间顺序逐一分发到后端应用上。 也就是说刚开始我们在 Tomcat1 登录之后,用户信息放在 Tomcat1 的 Session 里。过了一会,请求 又被 Nginx 分发到了 Tomcat2 上,这时 Tomcat2 上 Session 里还没有用户信息,于是又要登录

  • 方法一:使用Spring Session

    • 只需添加依赖以及添加配置即可,不需要修改代码,重新登录,会发现Session已经存储在Redis上了

  • 方法二:将用户信息存入Redis

    • 添加依赖以及添加配置,并配置RedisConfig配置类

功能开发

前提:用逆向工程生成数据库表对应所需要的所有类

商品列表

商品详情

秒杀

  • 秒杀前

  • 秒杀中

  • 秒杀结束

1、页面优化

  • 缓存
    • 页面缓存
    • URL缓存
    • 对象缓存
  • 页面静态化 [主要对商品详情、秒杀页面、订单详情页面进行静态化处理]
  • 库存超卖问题
    • 唯一索引
    • Lua脚本

2、服务优化

  • RabbitMQ 异步下单
  • 接口优化
    • Redis预减库存
    • 内存标记

3、安全优化

  • 接口地址隐藏
  • 算术验证码
  • 接口限流
    • 自定义拦截器

订单详情

系统压测

JMeter入门

  • 步骤

    • 1、添加--> 线程(用户) --> 线程组

    • 2、添加--> 配置元件 --> HTTP请求默认值

    • 3、添加 --> 取样器 --> HTTP请求

    • 4、添加 --> 监听器 --> 聚合报告/图形结果/用表格察看结果

自定义变量

  • 配置同一用户测试

  • 配置不同用户测试

    • 准备配置文件config.txt,,往里面添加具体用户及userTicket

    • 添加 --> 配置元件 --> CSV Data Set Config

    • 添加 --> 配置元件 --> HTTP Cookie管理器

JMeterr命令行

  • jmeter -n -t *.jmx -l *.jtl

正式压测

  • 使用工具类UserUtil.java往数据库插入5000用户,并且调用登录接口获取token,写入config.txt

    • 问题:并发一高会出现超卖的问题

  • 商品列表

  • 秒杀

页面优化

缓存

  • 页面

  • Url

  • 对象

静态化分离

  • 商品详细

  • 秒杀

  • 订单详情

现在基本上都前后端分离,本项目利用Themeleaf模板引擎进行手动静态化,利用ajax进行接口调用,获取数据
将一些页面进行缓存,服务器只需要传输一些对象即可,减少传输量,速度会提高一些

库存超卖

  • 给用户id和商品id加了唯一索引,用于避免一个用户进行多次下单操作

  • 重新编写了SQL语句,对库存进行一个判断,防止库存变成负数

  • Lua脚本stock.lua

服务优化

RabbitMQ消息队列

接口优化

  • 问题:即使加了优化,还是需要与数据库进行频繁的交互(数据库并发瓶颈低 ,远远不如缓存 ,但是仍然需要一些接口需要与数据库进行交互,如:获取库存、扣减库存等等),可以通过redis预减库存, 减少对数据库的访问,但是需要与redis频繁交互,而redis又是放在单独的服务器上的,还是 需要与redis服务器进频繁访问,所以我们提出一个内存标记,减少对redis服务器的访问

  • Redis 预减库存减少数据库的访问

  • 内存标记减少Redis的访问

  • RabbitMQ异步下单

    • SpringBoot整合Rabbit MQ

    • 交换机

    • 使用Topic模式

分布式锁

  • Lua脚本lock.lua

安全优化

隐藏秒杀地址

  • 用MD5生成一串随机数作为value存入Redis中

算术验证码

接口限流

  • 自定义拦截器,实现接口限流

你可能感兴趣的:(其他,java,redis,rabbitmq,前端框架)