Skip to main content

SpringBoot - 电商购物平台后端

项目内容

课程中借由“电商秒杀”案例,通过多种性能优化技术,总结了互联网项目中“秒杀”的经典性能优化方案技术,提供了统一的设计思维和思考方式,帮助同学们真正理解性能优化中每个技术的使用以及背后的原理。

E-commerce Website Backend built with Java/Spring Boot

  • Developed an e-commerce website backend that includes an authentication system, shopping cart, and order modules and deployed on a Cloud Server(2 cores and 4GB memory).
  • Implemented a simplified version of the single sign-on authentication method by using Redis/Token.
  • Designed RESTful API for backend server enabling data to be stored in MySQL.
  • Increased the max concurrent threads from 100 to 300 by modifying Tomcat configuration and performing a load test via JMeter.
  • Utilized: Java, Spring Boot, Redis, MySQL, Tomcat, JMeter, Maven, Git.

分层设计

项目结构

云端部署

本机远程连接服务器

# 我的服务器ip 登录名@root
ssh root@116.62.21.206

# 输入密码

MySQL

启动MySQL服务

systemctl start mariadb.service

# 查看mysql 环境
ps -ef | grep mysql

# 或者查看3306端口
netstat -anp | grep 3306

连接MySQL@root

# 初始化 用户@root 密码初始化为root
mysqladmin -u root password root

# 尝试连接本地mysql
# 用户root 密码root
mysql -uroot -proot

导出本地数据库备份 将本机使用的数据库备份为.sql文件 使用transmit传输到 root@116.62.21.206 //tmp/目录下

创建至服务器的MySQL中

# 指向的管道操作
mysql -uroot -proot < //tmp/miaosha.sql

# 登录mysql检查
mysql -uroot -proot
show databases;
use miaosha;
show tables;

应用程序

Maven 打包

# 进入相关目录
cd miaoshaStable

# maven 打包
mvn clean package

cd target
ls
# miaosha-1.0-SNAPSHOT.jar是我们的打包文件
# classes maven-status
# generated-sources miaosha-1.0-SNAPSHOT.jar
# maven-archiver miaosha-1.0-SNAPSHOT.jar.original

上传

# 在target目录下使用scp指令上传
scp miaosha-1.0-SNAPSHOT.jar root@116.62.21.206:/tmp/

启动

# 创建新文件夹
cd //var/
mkdir www
cd www/

mkdir java
mv java miaosha # 改名

cd miaosha/

# 将jar包 移动到//tmp/miaosha 目录
mv //tmp/miaosha-1.0-SNAPSHOT.jar ./miaosha.jar


# 成功移动过来后,修改权限
chmod -R 777 *

# 测试启动
java -jar miaosha.jar

云服务器

配置安全组规则

开放2000-9999所有端口

访问 http://116.62.21.206:8090/user/get?id=1 测试

{
"status": "success",
"data": {
"id": 1,
"name": "第一个用户",
"gender": 1,
"age": 30,
"telphone": "13521234859"
}
}

编写deploy.sh脚本启动

如果需要外部配置

vim application.properties

# insert
server.port=xx

编写脚本

# 编辑脚本
vim deploy.sh

# 使用nohup指令 让程序基本退出也在运行
nohup java -Xms400m -Xmx400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar

# 如果需要编写外部配置进行启动
nohup java -Xms400m -Xmx400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar --spring.config.addition-location=/var/www/miaosha/application.properties

# 修改权限
chmod -R 777 *

# 使用脚本启动
./deploy.sh &

# 所有的输出追加到"nohup.out"

性能压测

安装JMeter

官网地址

cd bin

# 启动 JMeter
sh jmeter

更改本地Hosts

sudo vim //etc/hosts

# insert
116.62.21.206 miaoshaserver

# 测试ping
ping miaoshaserver

JMeter 创建测试单元

  • Thread Group 线程组
  • HTTP Request
  • View Results Tree 查看结果树
  • Aggregate Report 聚合报告

# 找到对应进程的编号
ps -ef | grep java
# root 4482 4361 0 13:34 pts/1 00:00:00 grep --color=auto java

pstree -p 4482

# 查看对应的线程数量
pstree -p 4482 | wc -l

# 查看机器资源
top -H

压测5000线程 循环100次

配置 外部配置

# 在服务器root下
cd /var/www/miaosha

# 配置外部挂载文件
vim application.properties

server.tomcat.accept-count=1000
server.tomcat.max-connections=10000
server.tomcat.max-threads=500
server.tomcat.min-spare-threads=100
server.tomcat.keepAliveTimeOut=1800000
server.tomcat.maxKeepAliveRequests=100

-----------------------------------------

# 关闭原应用程序
kill xxx

# 重新启动
vim deploy.sh
./deploy.sh &

实战经验 在4核8g的ecs上最佳核心线程数是200 最大是800左右 超过了800性能不升级反降 折合到2核4g 则最佳核心线程数是100 最大不要超过400 否则cpu会浪费在线程调度的时间里

查看新启动的线程数

pstree -p 4629 | wc -l
# output: 118

# 开始压测后
pstree -p 4629 | wc -l
# output: 338

压测2000线程 循环100次

分布式扩展

知识梳理

Debug