Java电商秒杀系统性能优化(一)——电商秒杀系统框架回顾
电商秒杀系统框架回顾
- 项目简介
- 外部依赖
- 框架回顾
- 项目要点
- 项目中存在的问题
- 小结
课程是免费的,课程地址如下: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.yml或application.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共享的跨域请求
项目要点
在mybatis-generator.xml配置文件中在对应生成表类名配置中加入;
前端 ajax 调用接口获取验证码 html/getotp.html,出现跨域请求问题 解决方法:@CrossOrigin(origins = {"*"}, allowCredentials = “true”) allowedHeaders 允许前端将 token 放入 header 做 session 共享的跨域请求。 allowCredentials 授信后,需前端也设置 xhfFields 授信才能实现跨域 session 共享。 xhrFields: {withCredentials: true},
统一前端返回格式CommonReturnType {status: xx ,object:xx} dataobject -> 与数据库对应的映射对象 model -> 用于业务逻辑service的领域模型对象 viewobject -> 用于前端交互的模型对象
使用 hibernate-validator 通过注解来完成模型参数校验;
insertSelective 中设置 keyProperty=“id” useGeneratedKeys=“true” 使得插入完后的 DO 生成自增 id 。 insertSelective与insert区别: insertSelective对应的sql语句加入了NULL校验,即只会插入数据不为null的字段值(null的字段依赖于数据库字段默认值)insert则会插入所有字段,会插入null。
数据库设计规范,设计时字段要设置为not null,并设置默认值,避免唯一索引在null情况下失效等类似场景
解决如果事务createorder下单如果回滚,该下单方法中获得流水号id回滚,使等到的id号可能再一次被使用 在generatorOrderNo方法前加注解: @Transactional(propagation = Propagation.REQUIRES_NEW)
使用聚合模型在itemModel加入PromoModel promoModel,若不为空表示其有未结束的秒杀活动;在orderModel中加入promoId,若不为空,则以秒杀方式下单;
项目中存在的问题
- 如何发现容量问题?
- 如何使系统得以水平扩展;
- 查询效率低下;
- 活动开始前页面被疯狂刷新;
- 库存行锁的问题;
- 下单操作多,缓慢
- 浪涌流量如何解决;
小结
对之前的SpringBoot电商秒杀项目,有了基础的模型和有技术的人员才能屹立不倒;
Java电商秒杀系统性能优化(一)——电商秒杀系统框架回顾相关推荐
- 西电计算机学院工程优化,西电2017年下学期工程优化考题.pdf
西安电子科技大学 研究生课程考试试题 考试科目 工程优化方法____________ _____ 考试日期: 2018 年 1 月 10 日 考试时间: 150 分钟 考试方式:(闭 卷) 任课教师: ...
- java电商秒杀深度优化_【B0796】Java性能优化亿级流量秒杀方案及电商项目秒杀实操2020视频教程...
Java视频教程名称:Java性能优化亿级流量秒杀方案及电商项目秒杀实操2020视频教程 java自学网[javazx.com] 性能视频教程 it教程 Java自学网收集整理 java论 ...
- Java开发技术大杂烩(三)之电商项目优化、rabbitmq、Git、OSI、VIM、Intellj IDEA、HTTP、JS、Java...
前言 最近公司让我维护Spring+Servlet+Hibernate+Spring Security+Jsp的老项目,正好可以锻炼我的业务逻辑和掌控项目的能力.虽然项目很老,但是其中还是有很多值我学 ...
- 电商扣减库存_电商系统秒杀架构设计
作者:曹林华 https://blog.51cto.com/13527416/2085258 前言 最近在部门内部分享了原来在电商业务做秒杀活动的整体思路,大家对这次分享反馈还不错,所以我就简单整理了 ...
- 商城前后端原型、商城prd文档、商城后台管理系统、商城app文档、电商需求文档、限时秒杀、电商平台、促销助力、拼团抽奖、电商文档、prd文档、电商前后端原型、电商原型、Axure电商系统、rp原型
商城前后端.商城prd文档.商城后台管理系统.商城app文档.电商需求文档.限时秒杀.电商平台.促销助力.拼团抽奖.电商文档.prd文档.电商前后端原型.电商原型.Axure电商系统.rp原型 Axu ...
- Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP)
Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP) 说明:在微服务生鲜电商用户中心的系统设计中,我一直强调一个观点,就是你这个系统使用用户到底是TO B的还是TO C的呢?这个是 ...
- java计算机毕业设计ssm木棉堂水果电商平台1r83i(附源码、数据库)
java计算机毕业设计ssm木棉堂水果电商平台1r83i(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...
- 计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档)
计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档) 计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档) 本源码技术栈: ...
- java计算机毕业设计O2O生鲜果蔬电商设计与实现源码+mysql数据库+系统+lw文档+部署
java计算机毕业设计O2O生鲜果蔬电商设计与实现源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计O2O生鲜果蔬电商设计与实现源码+mysql数据库+系统+lw文档+部署 本源码技 ...
最新文章
- AI独角兽面对BAT,挑战还是臣服?| 《财经》封面
- js中JSON.stringify用于自定义的类
- Spring中IoC的入门实例
- ajax 如何禁止 预检请求,如何跳过“选项”预检请求?
- docker pull php7,Docker pull php:7.1-fpm的php.ini配置修改
- ES6学习笔记(四):教你轻松搞懂ES6的新增语法
- GaussDB T 强体验:通过 DBeaver/RazorSQL/DbVisualizer工具连接数据库(附测试账号)
- 《深入分析Linux内核源代码》读书、私藏笔记大放送
- python就业方向-目前Python这么火,Python有哪些就业方向?
- 使用 rem 设置文字大小(文字响应式)
- Android AIDL
- java底层实现分页
- php odbc驱动,php ODBC
- 基本系统设备_正规全体灭火系统承包资质品质更好_天霖工程
- Qt实现登陆界面(含代码)
- Altium_Designer17-PCB-如何重新定义板子外形
- android nfc P2P模式
- DBCC CHECKDB用法 手工修复数据库
- VS code 下载加速 中文设置 中英文切换 中文注释乱码
- 批量jpg转png 批量png转jpg 批量jpg2png 批量png2jpg