一、压力测试
通过压力测试,我们有希望找到许多种用其他测试方法难以发现的错误,如内存泄漏、线程不安全。
有效的压力测试系统将应用以下这些关键条件:重复、并发、随机变化。
压力测试主要关注的性能指标有:
● 吞吐量:单位时间内系统能够处理请求的数量。
● 响应时间:用户从客户端发起请求开始,到客户端接收到服务端返回的响应,整个过程所耗费的时间。通常会关注响应时间的平均值、中位数、最小值、最大值、第90百分位数、第99百分位数等等。
● 错误率:一批请求中结果出错的请求所占的比例。
本项目使用的压力测试工具是JMeter、使用的监测内存的工具是JVisualVM。
二、性能调优
1 调优方案
1) 给服务分配更大的内存。
● 搭建分布式集群,理论上可以使内存无限大。
2) 优化业务逻辑。
● 优化数据库查询逻辑。
● 引入Elasticsearch优化检索。
● 引入Nginx实现动静分离。
● 引入Redis实现分布式缓存。
● 使用异步优化业务逻辑。
2 优化数据库查询逻辑
● 避免在循环中操作数据库。
可以在准备数据时一次查询所有可能用到的数据,再在服务层对数据进行过滤。
● 尽量不采用联表查询,而是采用单表查询+代码层组装的方式。
单表查询SQL的复用率较高,缓存利用率也较高。
联表查询情况下,表结构变动导致查询SQL需要同步修改的可能性更高。
两个大表联查的效率可能很低。
3 引入Elasticsearch优化检索
《谷粒商城》开发记录 6:Elasticsearch和商品上架
4 引入Nginx实现动静分离
用户浏览器向服务器请求的页面资源分为静态资源和动态资源,其中静态资源对任何请求的返回结果都是一致的,包括js文件、css文件、图片等。
引入Nginx实现动静分离,就是让Nginx处理对静态资源的请求,让服务器专注于处理对动态资源的请求,可以有效提升服务器的吞吐量。
4.1 引入Nginx搭建域名访问环境
1. 修改本机hosts文件:C:\Windows\System32\drivers\etc\hosts
在hosts中添加配置:
192.168.56.10 gulimall.com
这样在本机使用浏览器访问域名gulimall.com时,会访问192.168.56.10,即虚拟机IP地址。
2. Nginx配置文件的格式为:
nginx.conf {
全局块
events块
http块 {
http全局块
server块
}
}
3. 配置Nginx负载均衡。
在http全局块中配置上游服务器:(88端口是Gateway服务)
upstream gulimall {
server 192.168.56.10:88;
}
表示将大括号内的所有服务器,整体上当作一个逻辑上的单独服务器gulimall。然后Nginx会将所有发送给服务器gulimall的请求,负载均衡地转发给大括号内的每个服务器。
4. 配置Nginx反向代理。
在nginx.conf的一个server块中配置:
listen 80;
server_name gulimall.com;
location / {
proxy_set_header Host $host
proxy_pass http://gulimall;
}
表示监听gulimall.com的80端口,将发送给gulimall.com:80的所有请求转发给服务器gulimall。Nginx在做反向代理转发请求的时候,会丢失请求的Host信息,这里也做了配置。
5. 在Gateway服务的配置文件中添加路由规则:
- id: gulimall_host_route
uri: lb://gulimall-product
predicates:
Host=**gulimall.com, gulimall.com
至此,配置完成。
从浏览器发送请求到浏览器收到响应的整个流程为:
1. 在浏览器输入域名gulimall.com,访问到虚拟机192.168.56.10,默认访问80端口;
2. Nginx监听虚拟机的80端口,收到来自浏览器的请求;
3. Nginix做负载均衡、反向代理,将请求转发给网关服务Gateway(88端口);
4. Gateway根据路由规则,将请求转发到商品服务。
4.2 Nginx实现动静分离
定下规则:来自前端页面的所有/static/**请求由Nginx直接返回结果。
1. 在虚拟机上Nginx的安装路径下创建目录nginx/html/static/,把静态资源(js、css、img等)都放进去。
2. 配置Nginx,在配置反向代理的 location / { … } 前面添加配置:
location /static/ {
root /usr/share/nginx/html;
}
3. 把前端页面文件中所有href、src、url链接前加上/static/。
这样,来自前端页面的所有对静态资源的请求,全部由Nginx直接返回。
5 引入Redis实现分布式缓存
6 使用异步优化业务逻辑
三、其他内容
Spring Boot Devtools热部署
使用Maven引入Spring Boot Devtools组件,可以实现应用的热部署。
groupId:org.framework.boot
artifactId:spring-boot-devtools