(1) 项目整体认识
(1)redis做对象缓存:(因为redis毕竟有网络开销,有些地方可以使用conCurrentHashMap代替redis
)
将商品秒杀对象缓存在redis中减少mysql的io
用户登录token(分布式session)
常用的数据标记在redis中(如:数据是否被秒杀了,是否重复秒杀等等)
(2)ajax前端静态化:将html缓存在客户端,减少网络数据传输(vue是更好的选择,如果会前端编程可以用nodejs相关框架)
(3)加密使用的是两次MD5:前端一次MD5传到后端,后端一次MD5,最后加入数据库
(4)validate自定义注解(JSR303):访问数据前对数据正则判断,不符合要求的一律不允许通过,用注解统一管理使得代码更加优雅简洁
(5)全局异常处理:使得就算报错,前端也不会跳出奇怪的异常界面,而是在后端控制台显示已经捕获的异常
(6)本项目的util也提供了雪花算法生成id
的方式,虽然为了简化代码量没有使用,但是提供简单的demo供大家学习。
也可以参考雪花算法的使用:https://blog.youkuaiyun.com/qq_35688140/article/details/100152631
(7)rabbitmq:为了减少数据库一次性写入太多数据而无法承受,故设置了rabbitmq作为数据的缓冲
,稍后再写入到数据库
。
(8)隐藏秒杀的url
:在调用秒杀的url之前多加了一层验证,防止机器人不停刷秒杀用的url,该验证层使用限流算法限制流量
(9)限流设置
:使用自定义注解的方式限制用户的流量,一旦流量大于5秒内5次,就返回刷新频率过高。(因为采用注解的方式,可以手动传入秒数和次数)
限流算法
:https://blog.youkuaiyun.com/qq_35688140/article/details/100775820
(10)服务器可以nginx+多个tomcat
实现分担负载
(2)access:access中定义了一个自定义注解@AccessLimit
1.AccessValidator:实现了相关的handler进行对带有@AccessLimit注解的方法做出处理
2.UserContext:用于保存一些某个线程中的全局数据,借用了ThreadLocal
3.AccessLimit接口:有三个属性,分别限制了用户的是否登陆和刷新页面的频率
(3)config:对全局的所有方法拦截,当访问方法时,如果url上带有user对象或者cookie中有MiaoshaUser的就取出改user,这样每个方法只需要在参数中写一个MiaoshaUser user就可以直接获取到user,不必每个方法都重复获取user这个动作
1.UserArgumentResolver:拦截获取参数的具体实现
2.WebConfig:将UserArgumentResolver配置到spring容器中
(4)controller:所有程序的入口
1.DemoController:主要是测试比如mybatis是否整合成功,thymleaf是否整合成功等等。
2.GoodsController: 实现获取某个商品和获取所有商品信息(里面有一些关于html静态化到redis的操作,但是改造成前后分离以后redis缓存html页面也就没有意义了,浏览缓存比redis缓存更有效),里面使用的商品对象大都是GoodsDetailVo或者GoodsVo,这一下都是经过多张表但关联起来的包装类
3.LoginController:实现用户登录
4.MiaoshaController:
(1)秒杀
(2)获取秒杀接口:对秒杀接口进行多一层封装,防止机器人刷url,并且限制了刷新频率
5.OrderController:获取订单详情
(5)dao:数据库访问
1.GoodsDAO:列出所有商品,列除某个商品,减少商品库存
2.MiaoshaUserDAO:查询某个用户,更新某个用户密码
3.OrderDao:操作订单数据和秒杀订单数据(有一个是普通的商品订单,有一个秒杀商品的订单)
4.UserDAO:修改用户密码,查询用户
(6)domain:和数据库一一对应
(7)exception:定义全局异常和异常处理器
1.GlobalExceptionHandler:将所有的异常以Result.error(ex.getCm())方式返回出去。可以被前端获取并弹窗。
(8)rabbitmq: 关于rabbitmq的使用方法和配置
1.MQConfig:配置rabbitmq
2.MiaoshaMessage:rabbitmq的消息传递的信息封装类
3.MQReceiver:监听相应的消息队列,一旦有数据,马上取出处理
4.MQSender:发送消息
(9)redis:所有redis的配置和redis封装方法
1.RedisConfig:配置好了redis的参数,与application.properties中的redis参数一一对应
2.impl:此包下的都是redis的自定义前缀
3.BaseKeyPrefix :自定义前缀的抽象类
4.KeyPrefix:自定义前缀的接口
5.JedisPoolFactory:jedis工厂,用于生产jedisPool
6.RedisService:封装了redis的增删改查方法(带有自定义前缀的增删改查方式)
(10)result:返回信息的规范化(rest风格)
1.CodeMsg:返回的错误类型
2.Result:封装了成功和失败方法
(11)service:业务逻辑
1.GoodsService:商品的查询和减少库存
2.MiaoshaService:作为正好个程序最复杂的类
(1)秒杀的事务处理
(2)秒杀的成功失败和排队中三种状态的查询,
(3)验证码的生成和验证
(4)获取秒杀path的验证和生成
3.MiaoshaUserService
(1)秒杀用户的登录和校验
(2)token放入到redis中和cookie中
4.OrderService:下订单,和订单缓存到redis
5.UserService:这是一个redis和mybatis整合是否通过的测试类
(12)util:工具包
1.MD5Util:md5加密解密(两次md5)
2.SnowFlowUtil:雪花算法
3.UUIDUtil:生成uuid
4.ValidatorUtil:@IsMobile标签的正则验证类
(13)validate:jsr303参数验证自定标签
1.IsMobile:标签类型定义
2.IsMobileValidator:验证@IsMobile标签的验证实现