《谷粒商城》开发记录 7:压力测试和性能调优

一、压力测试

通过压力测试,我们有希望找到许多种用其他测试方法难以发现的错误,如内存泄漏、线程不安全。
有效的压力测试系统将应用以下这些关键条件:重复、并发、随机变化。

压力测试主要关注的性能指标有:
● 吞吐量:单位时间内系统能够处理请求的数量。
● 响应时间:用户从客户端发起请求开始,到客户端接收到服务端返回的响应,整个过程所耗费的时间。通常会关注响应时间的平均值、中位数、最小值、最大值、第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实现分布式缓存

《谷粒商城》开发记录 8:缓存技术

6 使用异步优化业务逻辑

《谷粒商城》开发记录 9:线程池和异步编排

三、其他内容

Spring Boot Devtools热部署

使用Maven引入Spring Boot Devtools组件,可以实现应用的热部署。
groupId:org.framework.boot
artifactId:spring-boot-devtools

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值