{"repo":"Grootzz/seckill","free":true,"listed":false,"github":"https://github.com/Grootzz/seckill","clone":"git clone https://github.com/Grootzz/seckill.git","description":"Spring Boot+MySQL+Redis+RabbitMQ的高性能高并发商品秒杀系统设计与优化","language":"Java","stars":200,"topics":["spring-boot","redis","rabbitmq","mysql"],"license":null,"category":"databases-storage","readme_excerpt":"高性能高并发商品秒杀系统设计与优化 [TOC] - 项目简介 - 快速启动 - 数据库设计 - 秒杀功能的实现 - 页面优化技术 - 接口优化 - 超卖问题 - 安全优化 项目简介 本项目主要是模拟应对大并发场景下，如何完成商品的秒杀，以及针对秒杀场景下为应对大并发所做的优化。 项目的技术结构如下图所示： 秒杀场景下主要解决的问题： - 分布式会话 - 用户登录、商品列表、商品详情、订单详情模块 - 缓存优化 - 系统压测，测试系统的QPS - 信息队列 - 接口安全 本项目的分布式改造版本： 快速启动 1. 第一步；克隆仓库到本地 1. 第二步；构建工程 1. 第三步；启动 访问入口： 初始账号/密码： 18342390420/000000 。 数据库设计 这里的数据库设计只是为了模拟秒杀场景，实际的数据库会复杂很多。需要注意的是，因为参与秒杀的只有部分商品，所以单独建立一个 miaosha goods 存储于秒杀商品相关的字段。 - 秒杀用户表： miaosha user - 商品表： goods - 参与秒杀的商品表： miaosha goods - 秒杀订单表： miaosha order - 订单表： order info 登录实现 登录部分主要有以下几个部分： - 明文密码两次MD5处理 - JSR303参数检验和全局异常处理器 - 分布式Session 明文密码两次MD5处理 - 客户端：C PASS=MD5(明文+固定salt) - 服务端：S PASS=MD5(C PASS+随机salt) 加密：出于安全考虑 第一次 （在前端加密，客户端）：密码加密是（明文密码+固定盐值）生成md5用于传输，目的，由于http是明文传输，当输入密码若直接发送服务端验证，此时被截取将直接获取到明文密码，获取用户信息。 加盐值是为了混淆密码，原则就是明文密码不能在网络上传输。 第二次：在服务端再次加密，当获取到前端发送来的密码后。通过MD5（密码+随机盐值）再次生成密码后存入数据库。 防止数据库被盗的情况下，通过md5反查，查获用户密码。方法是盐值会在用户登陆的时候随机生成，并存在数据库中，这个时候就会获取到。 第二次的目的： 黑客若是同时黑掉数据库，通过解析前端js文件，知道如果md5加密的过程，就知道此时用户的密码。 但是此时我们要是在后端加入随机盐值和传输密码的md5组合，黑客是无法知道通过后端密码加密过程的，从而无法知道密码。 JSR303参数检验和全局异常处理器 JSR303 是一套 JavaBean 参数校验的标准，它定义了很多常用的校验注解。如 @NotNull 、 @Email 、 @Max 等。 在这个系统中，我们自定义了一个注解 @IsMobile 完成手机号码的参数检验, @IsMobile 的校验处理器为 IsMobileValidator 。 定义一个全局异常 GlobalException 和全局异常处理器 GlobalExceptionHandler ，可以完成系统异常的捕获和异常的统一处理。 分布式Session 在用户登录成功之后，将用户信息存储在redis中，然后生成一个token返回给客户端，这个token为存储在redis中的用户信息的key，这样，当客户端第二次访问服务端时会携带token，首先到redis中获取查询该token对应的用户使用是否存在，这样也就不用每次到数据库中去查询是不是该用户了，从而减轻数据库的访问压力。 秒杀功能的实现 - 数据库设计 - 商品列表页 - 商品详情页 - 订单详情页 页","default_branch":null,"files":null,"tree":[],"storefront":"/r/Grootzz","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/Grootzz/seckill/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}