秒杀系统项目介绍及搭建环境(一)

项目使用方案:

前端:

后端:SpringBoot、Mybatis

中间件:RabbitMQ、Redis、Druid

环境:Linux CentOS

工具:IDEA开发、Navicate数据库管理

远程连接工具:MobaXterm

数据库:MySql

压力测试工具:Jmeter

远程登录工具MobaXterm

可直接利用工具编写命令,传输文件

打开软件,在Remote host输入IP地址

image-20210302192933216

在服务器上部署Redis

注意改redis.conf配置:

(1)允许所有IP访问

image-20210305152548215

(2)允许后台访问

image-20210305152707976

(3)设置stop-write为no

image-20210312143321946

否则会出现以下问题:

ResponseError: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

究其原因是因为强制把redis快照关闭了导致不能持久化的问题,在网上查了一些相关解决方案。

通过stop-writes-on-bgsave-error值设置为no即可避免这种问题。

不过需要先将之前启动的redis进程kill掉,然后再重新启动新的redis,才能避免报相同的错

查看进程:ps -ef|grep redis

然后kill掉对应的进程:kill -9 pid

image-20210312144517831

对应此处:kill -9 23789

参考安装教程:Redis安装及部署(windos、Linux)使用Linux教程安装

SpringBoot集成Redis

参考SpringBoot整合Redis依赖导入及配置

在服务器上部署RabbitMQ

参考安装教程:RabbitMQ安装及集群搭建

RabbitMQ更新到3.8以后安装过程都与网上介绍有所不同,此处介绍3.8.11的新版安装过程

登陆使用两次MD5校验

  • 用户端:Pass = MD5(明文 + 固定的salt)
  • 服务端:Pass = MD5(明文 + 随机的salt)

导入MD5依赖

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>

前端(将用户的密码进行MD5转换)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function doLogin(){
g_showLoading();

var inputPass = $("#password").val();
var salt = g_passsword_salt;
var str = ""+salt.charAt(0)+salt.charAt(2) + inputPass +salt.charAt(5) + salt.charAt(4);
var password = md5(str);

$.ajax({
url: "/login/do_login",
type: "POST",
data:{
mobile:$("#mobile").val(),
password: password
},
}

后端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import org.apache.commons.codec.digest.DigestUtils;

public class MD5Util {
public static String md5(String src){
return DigestUtils.md5Hex(src);
}

//设置固定的salt
private static final String salt = "1a2b3c4d";

/**
* 将用户输入的密码进行md5后再传输到网络
* @param inputPass
* @return
*/
public static String inputPassToFormPass(String inputPass){
String str = ""+salt.charAt(0)+salt.charAt(2)+inputPass+salt.charAt(5)+salt.charAt(4);
return md5(str);
}

/**
* 将form中的表单密码进行md5后在传输到数据库中
*/
public static String formPassToDbPass(String formPass, String salt){
String str = ""+salt.charAt(0)+salt.charAt(2)+formPass+salt.charAt(5)+salt.charAt(4);
return md5(str);
}

/**
* 将用户的密码传到数据库中
* @param input
* @param saltDB
* @return
*/
public static String inputPassToDbPass(String input, String saltDB){
String formPass = inputPassToFormPass(input);
String dbPass = formPassToDbPass(formPass, saltDB);
return dbPass;
}

public static void main(String[] args) {
System.out.println(inputPassToFormPass("123456"));//d3b1294a61a07da9b49b6e22b2cbd7f9
System.out.println(formPassToDbPass(inputPassToFormPass("123456"), "1a2b3c4d"));
System.out.println(inputPassToDbPass("123456", "1a2b3c4d"));//b7797cce01b4b131b433b6acf4add449
}
}

具体登陆流程

image-20210309151745454

JSR303参数校验

为简化参数校验引入JSR303参数校验的依赖

1
2
3
4
5
<!--参数校验-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

SpingBoot已经集成JSR303数据校验 ,可直接使用

或者引入Hibernate Validator依赖

1
2
3
4
5
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>4.0.0</version>
</dependency>

1、在需要验证的类上加@Validated

image-20210309170306862

2、去实体类中在需要验证的参数加具体验证内容

image-20210309170812181

WebMvcConfigurerAdapter 弃用处理

SpringBoot2.0 是基于 spring 5.0 实现的。

在Spring 5.0 中,已经将 WebMvcConfigurerAdapter 抽象类加上 @Deprecated 注解 已经被弃用。

过时方法:

1
2
3
4
5
6
7
8
9
10
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{

@Autowired
UserArgumentResolver userArgumentResolver;

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}

WebMvcConfigurerAdapter 抽象类实现了 WebMvcConfigurer 接口,这里我们只需要将 extends WebMvcConfigurerAdapter 替换为 implements WebMvcConfigurer 即可。代码如下:

1
2
3
4
5
6
7
8
9
10
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
UserArgumentResolver userArgumentResolver;

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}

数据库设计

image-20210316155354513

goods

image-20210316155506779

miaosha_goods

image-20210316155557269

miaosha_order

image-20210316155657625

miaosha_user

image-20210316155744536

order_info

image-20210316155843975

复制数据库导入Linux

1
2
3
4
5
6
7
8
9
10
#启动数据库
mysql -u root -p
#新建一个同名的空数据库
create database miaosha;
#使用此数据库
use miaosha;
#导入数据库
source /home/lwj/myproject/miaosha.sql;
#查看数据库中的表
show tables;