目录 项目搭建 SpringBoot Lombok Spring Web Thymeleaf Mybatis-plus 分布式会话 用户登录 逆向工程 ...页面优化 缓存 静态化分离 库存超卖 服务优化 RabbitMQ消息队列 接口优化 分布
目录
<a href="#%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA">项目搭建</a>
<a href="#SpringBoot">SpringBoot</a>
<a href="#Lombok">Lombok</a>
<a href="#Spring%20Web">Spring Web</a>
<a href="#Thymeleaf">Thymeleaf</a>
<a href="#Mybatis-plus">Mybatis-plus</a>
<a href="#%E5%88%86%E5%B8%83%E5%BC%8F%E4%BC%9A%E8%AF%9D">分布式会话</a>
<a href="#%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95">用户登录</a>
<a href="#%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B">逆向工程</a>
<a href="#%E5%8F%82%E6%95%B0%E6%A0%A1%E9%AA%8C">参数校验</a>
<a href="#%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86">异常处理</a>
<a href="#%E5%85%B1%E4%BA%ABSession">共享Session</a>
<a href="#%E5%8A%9F%E8%83%BD%E5%BC%80%E5%8F%91">功能开发</a>
<a href="#%E5%89%8D%E6%8F%90%EF%BC%9A%E7%94%A8%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E5%AF%B9%E5%BA%94%E6%89%80%E9%9C%80%E8%A6%81%E7%9A%84%E6%89%80%E6%9C%89%E7%B1%BB">前提:用逆向工程生成数据库表对应所需要的所有类</a>
<a href="#%E5%95%86%E5%93%81%E5%88%97%E8%A1%A8">商品列表</a>
<a href="#%E5%95%86%E5%93%81%E8%AF%A6%E6%83%85">商品详情</a>
<a href="#%E7%A7%92%E6%9D%80">秒杀</a>
<a href="#%E8%AE%A2%E5%8D%95%E8%AF%A6%E6%83%85">订单详情</a>
<a href="#%E7%B3%BB%E7%BB%9F%E5%8E%8B%E6%B5%8B">系统压测</a>
<a href="#JMeter%E5%85%A5%E9%97%A8">JMeter入门</a>
<a href="#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8F%98%E9%87%8F">自定义变量</a>
<a href="#JMeterr%E5%91%BD%E4%BB%A4%E8%A1%8C">JMeterr命令行</a>
<a href="#%E6%AD%A3%E5%BC%8F%E5%8E%8B%E6%B5%8B">正式压测</a>
<a href="#%E9%A1%B5%E9%9D%A2%E4%BC%98%E5%8C%96">页面优化</a>
<a href="#%E7%BC%93%E5%AD%98">缓存</a>
<a href="#%E9%9D%99%E6%80%81%E5%8C%96%E5%88%86%E7%A6%BB">静态化分离</a>
<a href="#%E5%BA%93%E5%AD%98%E8%B6%85%E5%8D%96">库存超卖</a>
<a href="#%E6%9C%8D%E5%8A%A1%E4%BC%98%E5%8C%96">服务优化</a>
<a href="#RabbitMQ%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97">RabbitMQ消息队列</a>
<a href="#%E6%8E%A5%E5%8F%A3%E4%BC%98%E5%8C%96">接口优化</a>
<a href="#%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81">分布式锁</a>
<a href="#%E5%AE%89%E5%85%A8%E4%BC%98%E5%8C%96">安全优化</a>
<a href="#%E9%9A%90%E8%97%8F%E7%A7%92%E6%9D%80%E5%9C%B0%E5%9D%80">隐藏秒杀地址</a>
<a href="#%E7%AE%97%E6%9C%AF%E9%AA%8C%E8%AF%81%E7%A0%81">算术验证码</a>
<a href="#%E6%8E%A5%E5%8F%A3%E9%99%90%E6%B5%81">接口限流</a>
<hr id="hr-toc">
是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码
是一个Java XML / XHTML / HTML5 模板引擎 ,可以在Web(基于servlet )和非Web环境中工作。它更适合在基于MVC的Web应用程序的视图层提供XHTML / HTML5,但它甚至可以在脱机环境中处理任何XML文件。它提供完整的Spring Framework
两次MD5加密 (MD5工具类)
用户端 :PASS = MD5(明文 + 固定salt)
客户端:PASS = MD5(用户输入 + 随机salt)
目的:用户端MD5加密是为了防止用户密码在网络中明文传输,服务端MD5加密是为了提高密码安全性,双重保险
使用了Mybatis-plus提供的AutoGenerator
生成数据库表对应的POJO、Mapper、Service、ServiceImpl、Controller等
自定义注解
validation组件
isMobile注解
@ControllerAdvice 和 @ExceptionHandler
只能处理控制器抛出的异常。此时请求已经进入控制器中,可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大
@ErrorController
可以处理所有的异常,包括未进入控制器的错误
目的:解决分布式会话的问题
问题:Nginx 使用默认负载均衡策略(轮询),请求将会按照时间顺序逐一分发到后端应用上。 也就是说刚开始我们在 Tomcat1 登录之后,用户信息放在 Tomcat1 的 Session 里。过了一会,请求 又被 Nginx 分发到了 Tomcat2 上,这时 Tomcat2 上 Session 里还没有用户信息,于是又要登录
方法一:使用Spring Session
只需添加依赖以及添加配置即可,不需要修改代码,重新登录,会发现Session已经存储在Redis上了
方法二:将用户信息存入Redis
添加依赖以及添加配置,并配置RedisConfig配置类
秒杀前
秒杀中
秒杀结束
1、页面优化
缓存
页面缓存 URL缓存 对象缓存 页面静态化 [主要对商品详情、秒杀页面、订单详情页面进行静态化处理] 库存超卖问题
唯一索引 Lua脚本
2、服务优化
RabbitMQ 异步下单 接口优化
Redis预减库存 内存标记
3、安全优化
接口地址隐藏 算术验证码 接口限流
自定义拦截器
步骤
1、添加--> 线程(用户) --> 线程组
2、添加--> 配置元件 --> HTTP请求默认值
3、添加 --> 取样器 --> HTTP请求
4、添加 --> 监听器 --> 聚合报告/图形结果/用表格察看结果
配置同一用户测试
配置不同用户测试
准备配置文件config.txt,,往里面添加具体用户及userTicket
添加 --> 配置元件 --> CSV Data Set Config
添加 --> 配置元件 --> HTTP Cookie管理器
jmeter -n -t *.jmx -l *.jtl
使用工具类UserUtil.java往数据库插入5000用户,并且调用登录接口获取token,写入config.txt
问题:并发一高会出现超卖的问题
商品列表
秒杀
页面
Url
对象
商品详细
秒杀
订单详情
现在基本上都前后端分离,本项目利用Themeleaf模板引擎进行手动静态化,利用ajax进行接口调用,获取数据 将一些页面进行缓存,服务器只需要传输一些对象即可,减少传输量,速度会提高一些
给用户id和商品id加了唯一索引,用于避免一个用户进行多次下单操作
重新编写了SQL语句,对库存进行一个判断,防止库存变成负数
Lua脚本stock.lua
问题:即使加了优化,还是需要与数据库进行频繁的交互(数据库并发瓶颈低 ,远远不如缓存 ,但是仍然需要一些接口需要与数据库进行交互,如:获取库存、扣减库存等等),可以通过redis预减库存, 减少对数据库的访问,但是需要与redis频繁交互,而redis又是放在单独的服务器上的,还是 需要与redis服务器进频繁访问,所以我们提出一个内存标记,减少对redis服务器的访问
Redis 预减库存减少数据库的访问
内存标记减少Redis的访问
RabbitMQ异步下单
SpringBoot整合Rabbit MQ
交换机
使用Topic模式
Lua脚本lock.lua
用MD5生成一串随机数作为value存入Redis中
自定义拦截器,实现接口限流
本站主要用于,日常笔记的记录,和生活日志。本站不保证所有内容信息可靠!(大多数文章属于搬运!)如有版权问题!请联系我立即删除“abcdsjx@126.com”
QQ: 1164453243
邮箱: abcdsjx@126.com