电商秒杀系统框架回顾

  • 项目简介
  • 外部依赖
  • 框架回顾
  • 项目要点
  • 项目中存在的问题
  • 小结

课程是免费的,课程地址如下:SpringBoot搭建电商秒杀项目,课程真的很棒,作者的思路很清晰,建议各位读者可以跟着视频练习一下这个项目;

项目简介

通过SpringBoot快速搭建的前后端分离的电商基础秒杀项目。项目通过应用领域驱动型的分层模型设计方式去完成:用户otp注册、登陆、查看、商品列表、进入商品详情以及倒计时秒杀开始后下单购买的基本流程;

架构图如下:

外部依赖

  • org.springframework.boot:spring-boot-starter-web
  • mysql:mysql-connector-java
  • com.alibaba:druid
  • org.mybatis.spring.boot:mybatis-spring-boot-starter
  • org.apache.commons:commons-lang3
  • org.hibernate:hibernate-validator
  • joda-time:joda-time
  • junit:junit
  • org.springframework:spring-test
  • org.mybatis.generator:mybatis-generator-maven-plugin (插件)

框架回顾

Spring Boot 对应的配置化操作,只需要在resources目录下创建默认配置文件——application.ymlapplication.properties,在其中进行配置


集成Mybatis:进入pom文件,确定使用的数据库,使用mysql,则引入mysql-connector-java包;确定使用什么连接池来管理mysql的链接,这里使用阿里巴巴的druid连接池。然后将spring boot对mybatis的支持引入,这里使用mybatis-spring-boot-starter包;在配置文件类导入mybatis需要的一些配置,用来启动一个带mybatis数据库访问的一个spring boot工程;然后使用mybatis的自动生成工具,用来生成对应数据库文件的映射;


dao层与dataobject层由mybatis自动生成工具生成,dataobject层(负责数据存储到service层的传输)下的类对应数据库对象模型,其中的字段与数据库一一映射,dao层下的类定义对数据库进行交互的方法,在resources的mapping目录下有自动生成dao层对应的配置文件,一起实现对数据库的操作。


在service层下的model目录中创建对象模型(不可以把数据库的映射简单透传返回给想要service的服务,这个model对应Spring MVC中业务逻辑交互的模型),然后在数据库中创建对应的表,在service层下创建对应对象的service接口,接口中定义需要的方法(方法的返回类型大部分为model对象),在service层下impl目录下去实现。添加方法:在mapping目录下对应配置文件中添加相应的SQL语句,在dao目录下的对应接口中建立映射(添加方法)。


在serviceImpl中定义数据库对象dataobject与模型对象model相互转换的方法,在controller中定义模型对象model与视图对象viewobject相互转换的方法,这里使用到了org.springframework.beans.BeanUtils方法;serviceImpl类与controller类中分别需要添加@Service注解和@Controller注解


response层定义了统一返回类型,有一个通用对象,最终返回前端的对象为该通用对象


error层有一个common error接口,一个Enum枚举类实现该接口,该枚举类通过构造方法构造一个实现common error接口的enum类型的子类,一个继承Exception且实现common error方法的类,其内强关联一个对应的common error(即enum类),且实现其对应构造函数以方便使用。该方式对应设计模式——包装器业务异常类实现。


controller层下中的viewobject目录下创建可供UI使用的对象,其中的字段为可以给用户查看的字段。在controller层下创建对应对象的controller类,在其中调用其service接口中的方法来实现相应逻辑;


@ExceptionHandler(Exception.class)//需要指明收到什么样的exception之后才会进入它的处理环节,此处定义为根类
@ResponseStatus(HttpStatus.OK)//捕获到controller抛出的exception,并返回HttpStatus.OK,即status=200
@ResponseBody //handler exception使用这种方式(Object会寻找本地页面文件)仅仅只能返回页面路径,无法处理viewobject类对应的@ResponseBody形式,加上@ResponseBody注解即可解决
public Object handlerException(HttpServletRequest request, Exception ex){//获取异常并处理
}

其他所有controller类都要继承基类BaseController

UserController中,用户登录接口中将登陆凭证加入到用户登录成功的session中;

@Autowired
private HttpServletRequest httpServletRequest;
//通过bean的方式注入进来,代表这个HttpServletRequest是单例模式
//单例模式怎么可以支持一个request支持多个用户的并发访问?
//bean包装的HttpServletRequest,本质是一个proxy,它内部拥有ThreadLocal方式的map,去让用户在每个线程当中去处理它自己对应的request,
//并且有ThreadLocal清除机制,可以放心使用,且这个HttpServletRequest对应当前用户的http请求//将登陆凭证加入到用户登录成功的session中,分布式中用token
this.httpServletRequest.getSession().setAttribute("IS_LOGIN",true);
this.httpServletRequest.getSession().setAttribute("LOGIN_USER",userVO);

登录密码加密
因为jdk自带的MD5实现的方式只支持16位MD5,更改加密方法;

//将密码加密
public String EncodeByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException {//确定计算方法MessageDigest md5 = MessageDigest.getInstance("MD5");BASE64Encoder base64Encoder = new BASE64Encoder();//加密字符串String newstr = base64Encoder.encode(md5.digest(str.getBytes("utf-8")));return newstr;
}

validator层下为格式化校验规则,在pom文件中引入Apache Commons Lang包,使用了其StringUtils工具类;还引入了hibernate-validator包来进行校验。其下建立一个校验结果对象,对象中还创建一个获取错误信息的方法以便使用;并创建一个实现InitializingBean类的一个校验实现类,将hibernate validator 通过工厂校验的方式使其实例化,然后实现校验方法并返回校验结果对象。另外对字段有什么限制可在model层下对象模型的字段上添加注解如@NotBlank、@NotNull、@Max、@Min等。


跨域解决:在controller类上加上如下注解

@CrossOrigin(allowCredentials = "true",allowedHeaders = "*")  //实现跨域

DEFAULT_ALLOW_CREDENTIALS = true: 需配合前端设置,xhrFields授信后

使得跨域session共享 前端ajax请求添加设置:xhrFields:{withCredentials:true}

DEFAULT_ALLOWED_HEADERS = *:允许跨域传输所有的header参数,将用于使用token放入header域做session共享的跨域请求

项目要点

  1. 在mybatis-generator.xml配置文件中在对应生成表类名配置中加入;

  2. 前端 ajax 调用接口获取验证码 html/getotp.html,出现跨域请求问题 解决方法:@CrossOrigin(origins = {"*"}, allowCredentials = “true”) allowedHeaders 允许前端将 token 放入 header 做 session 共享的跨域请求。 allowCredentials 授信后,需前端也设置 xhfFields 授信才能实现跨域 session 共享。 xhrFields: {withCredentials: true},

  3. 统一前端返回格式CommonReturnType {status: xx ,object:xx} dataobject -> 与数据库对应的映射对象 model -> 用于业务逻辑service的领域模型对象 viewobject -> 用于前端交互的模型对象

  4. 使用 hibernate-validator 通过注解来完成模型参数校验;

  5. insertSelective 中设置 keyProperty=“id” useGeneratedKeys=“true” 使得插入完后的 DO 生成自增 id 。 insertSelective与insert区别: insertSelective对应的sql语句加入了NULL校验,即只会插入数据不为null的字段值(null的字段依赖于数据库字段默认值)insert则会插入所有字段,会插入null。

  6. 数据库设计规范,设计时字段要设置为not null,并设置默认值,避免唯一索引在null情况下失效等类似场景

  7. 解决如果事务createorder下单如果回滚,该下单方法中获得流水号id回滚,使等到的id号可能再一次被使用 在generatorOrderNo方法前加注解: @Transactional(propagation = Propagation.REQUIRES_NEW)

  8. 使用聚合模型在itemModel加入PromoModel promoModel,若不为空表示其有未结束的秒杀活动;在orderModel中加入promoId,若不为空,则以秒杀方式下单;

项目中存在的问题

  • 如何发现容量问题?
  • 如何使系统得以水平扩展;
  • 查询效率低下;
  • 活动开始前页面被疯狂刷新;
  • 库存行锁的问题;
  • 下单操作多,缓慢
  • 浪涌流量如何解决;

小结

对之前的SpringBoot电商秒杀项目,有了基础的模型和有技术的人员才能屹立不倒;

Java电商秒杀系统性能优化(一)——电商秒杀系统框架回顾相关推荐

  1. 西电计算机学院工程优化,西电2017年下学期工程优化考题.pdf

    西安电子科技大学 研究生课程考试试题 考试科目 工程优化方法____________ _____ 考试日期: 2018 年 1 月 10 日 考试时间: 150 分钟 考试方式:(闭 卷) 任课教师: ...

  2. java电商秒杀深度优化_【B0796】Java性能优化亿级流量秒杀方案及电商项目秒杀实操2020视频教程...

    Java视频教程名称:Java性能优化亿级流量秒杀方案及电商项目秒杀实操2020视频教程    java自学网[javazx.com]  性能视频教程   it教程 Java自学网收集整理 java论 ...

  3. Java开发技术大杂烩(三)之电商项目优化、rabbitmq、Git、OSI、VIM、Intellj IDEA、HTTP、JS、Java...

    前言 最近公司让我维护Spring+Servlet+Hibernate+Spring Security+Jsp的老项目,正好可以锻炼我的业务逻辑和掌控项目的能力.虽然项目很老,但是其中还是有很多值我学 ...

  4. 电商扣减库存_电商系统秒杀架构设计

    作者:曹林华 https://blog.51cto.com/13527416/2085258 前言 最近在部门内部分享了原来在电商业务做秒杀活动的整体思路,大家对这次分享反馈还不错,所以我就简单整理了 ...

  5. 商城前后端原型、商城prd文档、商城后台管理系统、商城app文档、电商需求文档、限时秒杀、电商平台、促销助力、拼团抽奖、电商文档、prd文档、电商前后端原型、电商原型、Axure电商系统、rp原型

    商城前后端.商城prd文档.商城后台管理系统.商城app文档.电商需求文档.限时秒杀.电商平台.促销助力.拼团抽奖.电商文档.prd文档.电商前后端原型.电商原型.Axure电商系统.rp原型 Axu ...

  6. Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP)

    Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP) 说明:在微服务生鲜电商用户中心的系统设计中,我一直强调一个观点,就是你这个系统使用用户到底是TO B的还是TO C的呢?这个是 ...

  7. java计算机毕业设计ssm木棉堂水果电商平台1r83i(附源码、数据库)

    java计算机毕业设计ssm木棉堂水果电商平台1r83i(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...

  8. 计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档)

    计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档) 计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档) 本源码技术栈: ...

  9. java计算机毕业设计O2O生鲜果蔬电商设计与实现源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计O2O生鲜果蔬电商设计与实现源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计O2O生鲜果蔬电商设计与实现源码+mysql数据库+系统+lw文档+部署 本源码技 ...

最新文章

  1. AI独角兽面对BAT,挑战还是臣服?| 《财经》封面
  2. js中JSON.stringify用于自定义的类
  3. Spring中IoC的入门实例
  4. ajax 如何禁止 预检请求,如何跳过“选项”预检请求?
  5. docker pull php7,Docker pull php:7.1-fpm的php.ini配置修改
  6. ES6学习笔记(四):教你轻松搞懂ES6的新增语法
  7. GaussDB T 强体验:通过 DBeaver/RazorSQL/DbVisualizer工具连接数据库(附测试账号)
  8. 《深入分析Linux内核源代码》读书、私藏笔记大放送
  9. python就业方向-目前Python这么火,Python有哪些就业方向?
  10. 使用 rem 设置文字大小(文字响应式)
  11. Android AIDL
  12. java底层实现分页
  13. php odbc驱动,php ODBC
  14. 基本系统设备_正规全体灭火系统承包资质品质更好_天霖工程
  15. Qt实现登陆界面(含代码)
  16. Altium_Designer17-PCB-如何重新定义板子外形
  17. android nfc P2P模式
  18. DBCC CHECKDB用法 手工修复数据库
  19. VS code 下载加速 中文设置 中英文切换 中文注释乱码
  20. 批量jpg转png 批量png转jpg 批量jpg2png 批量png2jpg

热门文章

  1. aspectj tomcat load-time waver
  2. kaggle房价预测代码
  3. 凯撒密码/自定义移位加密
  4. Cadence: 各软件业务
  5. 语音验证码的优势以及应用场景,最齐全的语言验证码介绍!
  6. python高德地图api调用实例_Python调用高德地图API实现经纬度换算、地图可视化
  7. Restful API 接口规范
  8. phpAdmin中id字段如何设置自增
  9. ASP计算周开始和一年有多少周及某年第一周开始日期
  10. LZW算法原理及实现