项目命名为goodsKill一方面有商品秒杀的意思(好像有点chinglish的味道),另外也可理解为good skill,本项目就是希望搭建一套完整的项目框架,把一些好的技术和技巧整合进来,方便学习和查阅。
本项目为慕课网仿购物秒杀网站,系统分为用户注册登录、秒杀商品管理模块。注册登录功能目前使用shiro完成权限验证,前端页面基于bootstrap框架搭建,并使用bootstrap-validator插件进行表单验证。 此项目整体采用springMVC+RESTFUL风格,mybatis持久层框架,数据库密码采用AES加密保护(默认未开启)。采用dubbo+zookeeper实现服务分布式部署及调用。集成了支付宝支付功能(详见service模块),用户完成秒杀操作成功之后即可通过二维码扫码完成支付(本demo基于支付宝沙箱环境)。
本项目扩展了秒杀功能,集成了jmock完成service层的测试,支持数据库读写分离,同时项目使用travis持续集成,提交更新后即可触发travis自动构建并完成项目测试覆盖率报告。
集成内嵌式H2数据库,方便独立进行单元功能测试。
dev_gradle
分支为使用gradle构建工具管理项目依赖,dev_maven
分支对应maven构建工具(springframework版本4.x),dev_springboot_2.x
分支基于最新springboot2.x构建简化配置(springframework版本5.x)。该项目功能目前比较简陋,功能还有很多不完善的地方,仅作学习参考之用,如果觉得本项目对你有帮助的请多多star支持一下~~~~。
技术 | 名称 | 官网 |
---|---|---|
jQuery | 函式库 | http://jquery.com/ |
Bootstrap | 前端框架 | http://getbootstrap.com/ |
LayUI | 前端UI框架 | http://www.layui.com/ |
goodsKill
|--goodskill-chat-provider ||聊天室服务提供者(待完成)
|--goodsKill-common ||项目公共服务(待补充)
|--goodsKill-es-provider ||elasticsearch搜索服务提供者
| |--goodskill-es-api
| |--goodskill-es-dao
| |--goodskill-es-service
|--goodsKill-mongo-provider ||mongo存储服务提供者
| |--goodskill-mongo-service
|--goodsKill-spring-boot-provider ||订单、用户、登录、商品管理服务提供者(待拆分)
| |--goodsKill-api
| |--goodsKill-dao ||已移除
| |--goodsKill-mp-dao ||使用MyBatis-Plus访问MySql数据源,替换原goodsKill-dao模块
| |--goodsKill-entry
| |--goodsKill-generator
| |--goodsKill-service
| |--goodsKill-util
|--goodskill-spring-boot-starter ||项目配置自动装配(待完成)
|--goodsKill-spring-boot-web-consumer ||提供页面客户端访问,controller层在这一模块
| |--goodsKill-web
- JDK :JDK1.8+
- MYSQL :8.0+
- activemq: 5.8.0
- kafka: kafka_2.11-2.0.0
- mongoDb: 4.0+
- elasticsearch: 6.4.3
其他环境版本暂未测试
-
参照官网安装redis/mongoDb/activeMQ/kafkaMQ/zookeeper/mysql8.0+本地默认端口启动,其中mongoDB和kafka非必须;
-
找到seckill.sql,procedure.sql文件,在本地mysql数据库中建立seckill仓库并执行完成数据初始化操作;
-
二维码图片存放路径配置信息在application.yml中的QRCODE_IMAGE_DIR配置中修改;
-
数据库密码需要根据个人密码设置进行更改,数据库密码保存在application.yml,可以使用AESUtil工具类进行数据库密码加密替换master.password和slave.password(主从数据库信息可以一致)
-
applicatio.yml已包含所有环境配置信息,根据个人需要切换环境配置修改,修改active属性值即可
spring:
profiles:
active: dev
-
项目根目录goodsKill中执行mvn clean install
-
在service模块中找到GoodsKillRpcServiceApplication类main方法启动远程服务,不想安装mongoDB/kafkaMQ的同学,可以使用GoodsKillRpcServiceSimpleApplication类启动(只需安装redis/mysql/activeMQ/zookeeper并启动);
-
在web模块使用maven spring-boot插件运行spring-boot:run
-
启动完成后访问http://localhost:18080/goodsKill/login登录页面,默认管理员账号admin123,密码:aa123456;
-
支付宝二维码接入指南:https://blog.csdn.net/techa/article/details/71003519
-
如已安装mongoDB,可以main方法启动MongoReactiveApplication,通过使用该服务操作mongo库
- 进入goodsKill项目根目录
mvn clean package -DskipTests=true -Pdev
- 启动服务提供方服务
cd 项目根目录/goodsKill-spring-boot-provider/goodsKill-service/target
java -jar goodsKill-service.jar
- 启动服务消费方(包含web容器)
- target目录找到goodsKill.war,使用tomcat 18080端口启动
目前实现了几种秒杀方案
测试地址:http://localhost:18080/goodsKill/swagger-ui.html#/
- 场景一:sychronized同步锁实现
- 场景二:redisson分布式锁实现
- 场景三:activemq实现
- 场景四:kafkamq实现
- 场景五:存储过程实现
- 场景六:实时等待秒杀处理结果
- 场景七:zookeeper分布式锁
- 场景八:使用redis进行秒杀商品减库存操作,秒杀结束后异步发送MQ,使用mongoDb完成数据落地
可在web控台查看秒杀结果,打印信息类似:
2019-03-25 13:40:42.123 INFO 1016 --- [io-18080-exec-9] o.s.w.controller.SeckillMockController : 秒杀活动开始,秒杀场景三(activemq消息队列实现)时间:Mon Mar 25 13:40:42 CST 2019,秒杀id:1001
2019-03-25 13:40:49.050 INFO 1016 --- [ jmsContainer-1] o.s.web.mqlistener.SeckillTopicListener : 最终成功交易笔数:100
2019-03-25 13:40:49.050 INFO 1016 --- [ jmsContainer-1] o.s.web.mqlistener.SeckillTopicListener : 秒杀活动结束,秒杀场景三(activemq消息队列实现)时间:Mon Mar 25 13:40:49 CST 2019,秒杀id:1001
- 使用redis优化秒杀执行过程,异步发送秒杀成功MQ消息完成数据落地,并使用mongo存储秒杀信息提升TPS;(已完成,见场景八)
- 集成spring-session管理会话,目前使用shiro由于只保存在单机上,重启应用或分布式环境可能需要重新登录;(已完成)
- 添加秒杀用户聊天室功能,使用netty网络通信,maven分支已经实现,master分支待集成;
- 模拟秒杀控台日志显示优化,后续考虑增加一个benchmark跑分功能,依次调用各个秒杀场景方案,最后输出各个方案的用时;