/goodsKill

🚀基于慕课网秒杀项目扩展了部分功能,完善登录注册以及用户角色权限管理,使用dubbo搭建分布式服务调用,模块化设计,集成了gradle和maven两种构建工具🚧,最新分支基于springboot2.x构建

Primary LanguageJavaMIT LicenseMIT

Codacy Badge License Build Status codecov Quality Gate Status

前言

项目命名为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支持一下~~~~。

附:码云项目链接https://gitee.com/techa/goodsKill ,clone速度慢的用码云仓库拉吧,不定期同步到码云,顺便给个星呗,佛系经营~

技术选型

后端技术:

技术 名称 官网
SpringBoot 框架 https://spring.io/projects/spring-boot
MyBatis-Plus MyBatis增强工具 https://mp.baomidou.com/
PageHelper MyBatis物理分页插件 http://git.oschina.net/free/Mybatis_PageHelper
Hikari 数据库连接池 https://github.com/brettwooldridge/HikariCP
ZooKeeper 分布式协调服务 http://zookeeper.apache.org/
Dubbo 分布式服务框架 http://dubbo.io/
Redis 分布式缓存数据库 https://redis.io/
ActiveMQ 消息队列 http://activemq.apache.org/
Kafka 消息队列 http://kafka.apache.org/
Logback 日志组件 https://logback.qos.ch/
Protobuf & json 数据序列化 https://github.com/google/protobuf
Maven 项目构建管理 http://maven.apache.org/
SonarQube 项目代码质量监控 https://www.sonarqube.org/
Swagger2 项目API文档生成及测试工具 http://swagger.io/
Mockito mock类生成测试工具 https://site.mockito.org/
Jacoco 测试覆盖率报告插件 http://www.eclemma.org/jacoco/
Shiro 用户权限安全管理框架 https://shiro.apache.org/
MongoDB Mongo数据库 https://www.mongodb.com/
MySQL MySQL数据库 https://www.mysql.com/
Reactor 响应式开发 https://projectreactor.io/
Spring Session Spring会话管理 https://spring.io/projects/spring-session
Elasticsearch 全文搜索引擎 https://www.elastic.co
H2 H2数据库 http://www.h2database.com/html/main.html

前端技术:

技术 名称 官网
JQuery 函式库 http://jquery.com/
Bootstrap 前端框架 http://getbootstrap.com/
LayUI 前端UI框架 http://www.layui.com/

API接口

image

API接口说明

image

页面展示

登录:

image

注册:

image

主页:

image

商品查询:

搜索框下拉商品候选信息基于elasticsearch实现,支持关键词高亮显示

image

用户角色权限管理:

image image image image

支付宝二维码扫码支付:

image

项目模块介绍

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-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    

数据库表结构

image

开发环境版本说明

  • JDK: JDK8(JDK9会卡在编译阶段,原因不明)
  • MySQL: 8.0+
  • ActiveMQ: 5.8.0
  • Kafka: kafka_2.11-2.0.0
  • MongoDB: 4.0+
  • Elasticsearch: 7.7.0

:其他环境版本暂未测试,使用最新版应该也没毛病

项目启动方法

编译并构建镜像

  1. 项目根目录goodsKill中执行mvn clean install

  2. 进入项目根目录(确保已安装compose以支持docker-compose命令),执行以下命令:

    docker-compose up (第一次运行只需执行此命令)
    or
    docker-compose up -d //-d后台运行
    or
    docker-compose up -d --build //build重新构建镜像文件,针对项目自定义镜像配置需要修改的情况
    or
    docker-compose up -d --no-recreate //如上次以构建容器,则此次会跳过构建容器
    

    :推荐使用docker-compose命令(推荐电脑运行内存16G以上,es比较吃内存),无需手动下载软件安装包,开箱即用。此命令会自动拉取docker镜像并以默认端口运行

    镜像 版本 端口 用户名密码
    Redis latest 6379
    Mongo 4.2.6 27017
    MySQL 8.0 3306 root:Password123
    Zookeeper latest 2181
    Elasticsearch 7.7.0 9200 9300
    Kibana 7.7.0 5601
    ActiveMQ 5.4.18 2181 61616
  3. 如无docker运行环境,可参照官网安装Redis/mongoDB/ActiveMQ/Kafka/Zookeeper/MySQL8.0+/Elasticsearch本地默认端口启动,Kafka不安装不影响项目启动

导入项目基础数据并配置环境

  1. 找到seckill.sql,procedure.sql文件,在本地mysql数据库中建立seckill仓库并执行完成数据初始化操作

  2. 数据库密码需要根据个人密码设置进行更改,数据库密码保存在application.yml,可以使用AESUtil工具类进行数据库密码加密替换master.password和slave.password(主从数据库信息可以一致)

  3. applicatio.yml已包含所有环境配置信息,根据个人需要切换环境配置修改,修改active属性值即可

    spring:
      profiles:
        active: dev
    

:以下步骤如docker-compose已执行可直接跳过,直接访问项目地址即可http://localhost:8080/goodsKill/login

在开发环境中运行项目

  1. 找到EsApplication类main方法启动远程服务

  2. 找到GoodsKillRpcServiceApplication类main方法启动远程服务

  3. 进入goodsKill-web模块根目录模块,运行命令

    mvn spring-boot:run -Dspring.profiles.active=dev
    
  4. 启动完成后访问登录页面http://localhost:8080/goodsKill/login,默认管理员账号admin123,密码:aa123456

    支付宝二维码接入指南:https://blog.csdn.net/techa/article/details/71003519

  5. 如已安装MongoDB,可以main方法启动MongoReactiveApplication,通过使用该服务操作mongo库

打包部署方法

  • 可参考Dockerfile文件

并发方案

目前实现了几种秒杀方案

swagger主页测试地址:http://localhost:8080/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

后续更新计划

  • 添加秒杀用户聊天室功能,使用netty网络通信,maven分支已经实现,master分支待集成
  • 模拟秒杀控台日志显示优化,后续考虑增加一个benchmark跑分功能,依次调用各个秒杀场景方案,最后输出各个方案的用时