乐优商城(四十五)秒杀功能压测_一个商城的压测-程序员宅基地

技术标签: 高并发  乐优商城  

一、压测数据准备

1.1 注册5000个用户

在leyou-user中增加测试方法,用来注册5000个用户。

import com.leyou.user.LyUserApplication;
import com.leyou.user.mapper.UserMapper;
import com.leyou.user.pojo.User;
import com.leyou.utils.CodecUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;


/**
 * @Author: 98050
 * @Time: 2018-11-14 23:31
 * @Feature:
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = LyUserApplication.class)
public class UserTest {

    @Autowired
    private UserMapper userMapper;

    /**
     * 注册5000个用户
     */
    @Test
    public void addUser(){
        User user = new User();
        for (int i = 1; i < 5000; i ++){
            user.setId(null);
            user.setCreated(new Date());
            user.setPhone("1883482"+String.format("%04d",i));
            user.setUsername("username"+i);
            user.setPassword("abcdefg"+i);
            String encodePassword = CodecUtils.passwordBcryptEncode(user.getUsername().trim(),user.getPassword().trim());
            user.setPassword(encodePassword);
            this.userMapper.insertSelective(user);
        }
    }
    
}

1.2 获取5000用户的登录Token

在授权中心leyou-authentication里添加测试方法,获取5000用户的Token并写入文件中。获取token前,设置永不过期

import com.leyou.auth.LyAuthApplication;
        import com.leyou.auth.service.AuthService;
        import com.leyou.user.pojo.User;
        import org.junit.Test;
        import org.junit.runner.RunWith;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.boot.test.context.SpringBootTest;
        import org.springframework.test.context.junit4.SpringRunner;

        import java.io.*;

/**
 * @Author: 98050
 * @Time: 2018-11-15 00:00
 * @Feature: 获取5000用户的Token,写入文件中
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = LyAuthApplication.class)
public class TokenTest {

    @Autowired
    private AuthService authService;

    @Test
    public void getTokenCSV(){
        try {
            File csv = new File("G://Token.csv");//CSV文件
            BufferedWriter bw = new BufferedWriter(new FileWriter(csv, true));
            for (int i =0; i < 5000; i++) {
                //新增一行数据
                String token = this.authService.authentication("username"+i,"abcdefg"+i);
                bw.write("username"+i+","+token);
                bw.newLine();
            }
            bw.close();
        } catch (FileNotFoundException e) {
            //捕获File对象生成时的异常
            e.printStackTrace();
        } catch (IOException e) {
            //捕获BufferedWriter对象关闭时的异常
            e.printStackTrace();
        }
    }
}

二、测试

2.1 秒杀商品准备

2.2 可以用来秒杀的库存

2.3 Jmeter压测

2.2.1 设置读取csv文件

模拟不同用户

2.2.2 测试

50个用户,循环请求10次,看一下结果:

发现问题,stock多减了好多。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

2.2.3 修改配置

在进行测试时,由于秒杀服务通过Feign Client来调用订单服务下订单,有可能出现超时的情况,这里面需要在秒杀微服务中配置一下Ribbon和Hystix。

ribbon:
  ConnectTimeout: 400 # 连接超时时间(ms)
  ReadTimeout: 2000 # 通信超时时间(ms)
  OkToRetryOnAllOperations: true # 是否对所有操作重试
  MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数
  MaxAutoRetries: 1 # 同一实例的重试次数
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMillisecond: 10000 # 熔断超时时长:10000ms

2.2.4 错误分析

为什么会造成多余的订单呢?因为数据不一致造成的,当一次请求到达订单微服务,检查库存充足,然后开始下订单,结果由于高并发,这次操作中还没有修改数据库中的库存,结果第二个请求就来了,造成多余的订单生成。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lyj2018gyq/article/details/84075983

智能推荐

用C语言写循环赛日程表,循环赛的方法与编排-程序员宅基地

文章浏览阅读1k次。一、循环赛的种类与特点(一)循环赛的种类循环赛又称循环法。是指参赛队(或个人,下同)之间,都要互相轮流比赛,最后按照各参赛队在全部比赛中的胜负场数、得分多少排定名次的比赛方法。它在对抗性项目比赛中经常被采用。循环赛包括单循环、双循环或分组循环三种。单循环是所有参赛队(人)相互轮赛一次;双循环是所有参赛队(人)相互轮赛二次;分组循环是参赛队(人)较多时,采用种子法,把强队(人)分散在各组,先进行小组..._c语言循环赛互打一场比赛 甲队两胜

springboot项目访问html页面,发现端口不一致&继承WebMvcConfigurationSupport类会导致自动配置失效_springboot项目前端端口号不同怎么办-程序员宅基地

文章浏览阅读1.6k次,点赞4次,收藏6次。最后的解决方法“在config--WebMvcConfig中不要继承WebMvcConfigurationSupport,而是实现WebMvcConfigurer接口”,且不要在idea中直接点击浏览器图标打开对应的html页面,要自己在浏览器输入url。在本次debug过程中,更加清楚地明白了,springboot项目启动过程中,只扫描引导类同包或子包下的程序,而在resources目录下的静态资源文件(没放到),需要被映射,才能被扫描到。_springboot项目前端端口号不同怎么办

k8s.配置管理.configmap&secret_configmap @value-程序员宅基地

文章浏览阅读80次。configmap 和secret 都需要提前创建configmap和secret都可以为pod提供挂载和变量的方式变量的方式有envfrom全部变量和valuefrom单个变量的引用configmap和secret 需要和引用的pod或者资源对象在同一个ns下。_configmap @value

System.TypeInitializationException: 'The type initializer for 'MySql.Data.MySqlClient.Replication.Re...-程序员宅基地

文章浏览阅读2.2k次。下午在调试的时候报错数据库连接就报错我就很纳闷后面用原来的代码写发现还是报错System.TypeInitializationException:'The type initializer for 'MySql.Data.MySqlClient.Replication.ReplicationManager' threw an exception.'应该是出在Mysql包上的问题..._system.typeinitializationexception:““mysql.data.mysqlclient.mysqlpoolmanag

树莓派上部署jeecg-boot快速开发平台_jeecgboot linux部署-程序员宅基地

文章浏览阅读249次。系统安装Ubuntu Server(可百度)更换软件源打开位置cd /etc/apt/编辑sources.listsudo nano sources.list使用清华的软件源镜像deb https://mirrors.ustc.edu.cn/ubuntu-ports/ focal main restricted universe multiversedeb https://mirrors.ustc.edu.cn/ubuntu-ports/ focal-updates main restricted univ_jeecgboot linux部署

C/C++操作YUV视频_c++读取yuv视频-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏5次。C/C++对YUV数据的一些操作_c++读取yuv视频

随便推点

Flutter混合开发-Null check operator used on a null value_flutter null check operator used on a null value-程序员宅基地

文章浏览阅读4.8k次。标题Flutter与Android混编在Android与Flutter混编中导入flutter的GetX框架时,配置getPages参数出错,在编译时不报错,但是运行之后,debug模式下出现红底白色的错误,错误显示为 Null check operator used on a null value,看一眼懵了,本地开发版本使用的是flutter2,配置的Getx库也确实在很早的版本中就支持了Null safety ,且配置的getPages为数组并且可为空,按照常理怎么也不可能出现这个错误!尝试的方案_flutter null check operator used on a null value

查看WIN10 SDK的版本_win10 sdk 版本好哪里查-程序员宅基地

文章浏览阅读4.4k次。查看WIN10 SDK的版本_win10 sdk 版本好哪里查

MFC C++改变控件字体大小颜色的方法_cfont设置字体大小-程序员宅基地

文章浏览阅读1.4k次。MFC C++改变控件字体大小颜色的方法_cfont设置字体大小

requests(网络请求库神器 )库快速上手_requests 在线请求工具-程序员宅基地

文章浏览阅读202次。关于requests(网络请求库神器 )库快速上手urllib、urllib2、urllib3、httplib、httplib2 都是和 HTTP 相关的 Python 模块,看名字就觉得很反人类,更糟糕的是这些模块在 Python2 与 Python3 中有很大的差异,如果业务代码要同时兼容 2 和 3,写起来会让人崩溃。好在,还有一个非常惊艳的 HTTP 库叫 requests,它是 ..._requests 在线请求工具

springboot使用EntityManager执行自定义SQL_springboot 执行自定义sql-程序员宅基地

文章浏览阅读2.9k次。1.在代码中注入 EntityManager import javax.persistence.EntityManager;@AutowiredEntityManager entityManager; 2.在方法中具体使用EntityManager public List<DefColumn> findAllColumns(String table) { Query query = entityManager.createNativeQue._springboot 执行自定义sql

MSYS2安装和使用_pacman windows-程序员宅基地

文章浏览阅读546次,点赞14次,收藏12次。msys2是一款跨平台编译套件,它模拟linux编译环境,支持整合mingw32和mingw64,能很方便的在windows上对一些开源的linux工程进行编译运行。更重要的是它支持pacman包管理器;这意味着你可以很方便的安装所需要的软件包和开发库,而不需要自己去找源码编译。_pacman windows