SpringBoot电商秒杀项目优化知识点总结

文章目录

  • 3-1 云端部署---系统构建
  • 3-2 云端部署---Java环境安装
  • 3-3 云端部署---数据库环境安装
  • 3-4 云端部署---数据库部署
  • 3-5 云端部署---打包上传
  • 3-6 云端部署---编写deploy脚本启动
  • 3-7 性能压测---jmeter工具简介(上)
  • 3-9 性能压测---发现并发容量问题(上)
  • 3-10 性能压测---发现并发容量问题(下)
  • 3-11 性能压测之定制化内嵌tomcat开发
  • 3-12 性能压测---容量问题优化方向


3-1 云端部署—系统构建

阿里云 centos7.4 (1核2G)

3-2 云端部署—Java环境安装

上传本地jdk文件

scp .\jdk-8u65-linux-x64.rpm root@*.*.*.*://tmp/

赋予可执行权限

chmod 777 jdk-8u65-linux-x64.rpm 

安装rpm文件 此时系统会自动配置环境变量

rpm -ivh jdk-8u65-linux-x64.rpm 

手动配置环境变量

vim ~/.bash_profile 

添加

JAVA_HOME=//usr/java/jdk1.8.0_65
PATH=$PATH:$JAVA_HOME/bin

刷新环境变量 否则需要重新登录服务器配置才能生效

source ~/.bash_profile 

3-3 云端部署—数据库环境安装

下载安装mysql

yum install mysql*

centos7中已经用mariadb server替代了mysql server,所以必须要安装mariadb server
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

yum install mariadb-server

启动mysql服务器

systemctl start mariadb.service

查看mysqld进程是否启动

systemctl start mariadb.service

通过3306端口查看mysqld是否启动

netstat -anp | grep 3306

重置mysql的root用户密码

mysqladmin -u root password root

尝试连接mysql

mysql -uroot -proot

3-4 云端部署—数据库部署

win查看mysql安装位置

show variables like "%char%";

备份mysql问sql文件

 ./mysqldump -uroot -proot --databases seckill > C:\Users\z1161\Desktop\seckill.sql

上传sql文件并回复数据库(管道操作)

mysql -uroot -proot < //tmp/seckill.sql

3-5 云端部署—打包上传

利用mvn clean package命令在项目根目录打jar包

    <plugins>
    //此插件不能打包依赖
      <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-compiler-pluginartifactId>
        <configuration>
          <source>1.8source>
          <target>1.8target>
        configuration>
      plugin>
    //加入此插件后能打包依赖
      <plugin>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-maven-pluginartifactId>
      plugin>
    plugins>

修改权限并尝试启动

mv //tmp/seckill-1.0-SNAPSHOT.jar  //var/www/seckill/seckill.jar
chmod -R 777 *
java -jar seckill.jar

3-6 云端部署—编写deploy脚本启动

外挂配置文件:application.properties 同名外挂配置文件的优先级高于内置配置文件

server.port=80

外挂配置文件的启动方式

java -jar seckill.jar --spring.config.addition-location=/var/www/seckill/application.properties 

编写deploy.sh启动脚本用于后台启动jar包
nohup命令表示console退出程序也不会退出 并将输出写到nohup.out文件
最大最小堆栈都设置为400m 并且指定200m以及最大为200m的新生代JVM

nohup java -Xms400m -Xmx400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar seckill.jar --spring.config.addition-location=/var/www/seckill/application.properties

更改该目录下所有文件的执行权限

chmod -R 777 *

在后台启动应用程序

./deploy.sh &

查看输出

tail -200f nohup.out 

3-7 性能压测—jmeter工具简介(上)

线程组 Http请求 查案结果树 聚合报告

根据进程名查看进程号

ps -ef | grep java
root     30274     1  0 00:59 ?        00:00:16 java -Xms400m -Xmx400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar seckill.jar --spring.config.addition-location=/var/www/seckill/application.properties

根据进程号查看端口号

netstat -anp | grep 30274
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      30274/java

修改hosts文件的DNS解析
win:

C:\Windows\System32\drivers\etc\hosts

linux:

//etc/hosts

jemeter要勾选keep alive 建立长连接

3-9 性能压测—发现并发容量问题(上)

支持高并发且快速返回的系统即为高性能系统 总并发数除以每个并发所耗的时间即TPS

TPS是每秒事务数(TransactionsPerSecond),也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
平均TPS:用聚合报告中Throughput表示

耗时的操作看这两个指标:load average: 0.11, 0.05, 0.05 %Cpu(s): 1.4 us, 1.7 sy,

根据进程名查看进程号

ps -ef | grep java
root     30274     1  0 00:59 ?        00:00:16 java -Xms400m -Xmx400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar seckill.jar --spring.config.addition-location=/var/www/seckill/application.properties

查看该进程的线程数,此时显示的线程数为tomcat的线程数加上springboot的线程数之和

pstree -p 30274 | wc -l

3-10 性能压测—发现并发容量问题(下)

修改springboot内嵌的tomcat默认配置(spring-configuration-metadata.json 有三个此文件 选择超过8000行的) 以提高并发线程数
server.tomcat.accept-count:等待队列长度,默认100
server.tomcat.max-connections:最大可被连接数,默认10000
server.tomcat.max-threads:最大工作线程数,默认200
server.tomcat.min-spare-threads:最小工作线程数,默认10
默认配置下,连接超过10000后出现拒绝连接情况
默认配置下,触发的请求超过200+100后拒绝处理

对于4核8G的单机 最优配置为

server.tomcat.accept-count=1000
server.tomcat.max-connections=10000
server.tomcat.max-threads=800
server.tomcat.min-spare-threads=100

3-11 性能压测之定制化内嵌tomcat开发

keepalive缺点:
1.一直连接但如果不使用则浪费资源
2.成为系统的后门被攻击

keepAliveTimeOut:多少毫秒后不响应的断开
keepalivemaxKeepAliveRequests:多少次请求后keepalive断开失效
使用WebServerFactoryCustomizer定制化内嵌tomcat配置:

@Component
public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
    @Override
    public void customize(ConfigurableWebServerFactory configurableWebServerFactory) {
        //使用对应工厂类提供给我们的接口定制化我们的tomcat connector
        ((TomcatServletWebServerFactory) configurableWebServerFactory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                //定制化keepalivetimeout 设置30秒内没有请求则服务器自动断开keepalive连接
                protocol.setKeepAliveTimeout(30000);
                //当客户端发送超过10000个请求则自动断开keepalive连接
                protocol.setMaxKeepAliveRequests(10000);
            }
        });
    }
}

3-12 性能压测—容量问题优化方向

MySql数据库QPS容量问题:尽量保证所有查询为主键查询和唯一索引查询
主键查询:千万级别数据= 1-10毫秒
唯一索引查询:千万级别数据=10-100毫秒
非唯一索引查询:千万级别数据=100-1000毫秒
无索引:百万条数据= 1000毫秒+

MySql数据库TPS容量问题:
非插入的更新删除操作∶同查询
插入操作:1w ~ 10w tps(依赖配置优化)

你可能感兴趣的:(SpringBoot项目,spring,boot,mysql,后端)