聚焦Java性能优化 打造亿级流量秒杀系统【学习笔记】03_分布式扩展

本文详细介绍了如何利用Nginx进行反向代理和负载均衡,解决单机容量问题。通过部署Nginx OpenResty,实现动静分离,并探讨了Nginx的高性能原因,如epoll多路复用。此外,文章还讨论了分布式会话管理,包括基于cookie和token的实现,以及如何将session存储在Redis中以适应分布式系统。

本章目标

  • nginx反向代理均衡
  • 分布式会话管理
  • 使用redis实现分布式会话存储

4-1 Nginx反向代理

上一章我们看到当单机系统时候,容量有限,响应时间变长TPS上不去的问题。nginx反向代理的功能就是代理后端Tomcat服务器集群,以统一域名方式来访问

  • 单机容量问题,水平扩展
  • nginx反向代理
  • 负载均衡配置

当我们用top -H命令查询cpu运行状况时,单机运行很卡,表象是cpu使用率增高,内存memory占用增加,网络带宽使用增加,有几个参数值得注意

  • cpu us : 用户空间cpu使用情况(用户态进程占比)
  • cpu sy:内核空间cpu使用情况(核心态进程占比)
  • load average:1分钟/5分钟/15分钟负载load平均值,跟着核系数变化,0表示正常,1表示cpu打满,1+代表等待阻塞
  • memory:free 空闲内存,used使用内存

4-2 单机容量问题,水平扩展

这次的水平扩展指的是对应用系统程序扩展,而mysql数据库只有一个,用来开放远端连接(mysql读写分离、分库分表等方法可实现mysql水平扩展,这里没讨论),服务端实现水平对称部署,最后验证访问

Nginx系统框图如下:

我们在阿里云就需要4台服务器(其中1台用作数据库,2台用作应用进程,1台用作nginx反向代理)

4-3修改前端资源用于部署nginx

nginx有三种用途:

  1. 使用nginx作为web服务器(静态资源访问)
  2. 使用nginx作为动静分离服务器
  3. 使用nginx作为反向代理服务器(动态资源请求)

整个项目前端H5请求的类型有两种,一种是静态资源,一种是ajax请求动态资源。对于ajax向域名miaoshaserver请求时,mginx会作为反向代理部署到不同miaosha项目jar包下;而对于静态资源(static,HTML,CSS等)访问域名miaoshaserver/resources时,nginx会向本地磁盘请求资源(企业级应用通常使用的是NAS

那先部署静态资源请求:

在static静态资源目录下新建gethost.js,用来方便配置修改远端连接地址,然后在每个页面上对应修改,然后将静态资源上传到服务器上

4-4 部署Nginx OpenResty

使用Nginx的框架OpenResty来开发配置Nginx,OpenResty是基于NGINX和LuaJIT的动态Web平台。优点是可以支持lua的一些开发。

安装OpenResty

将nginx指定成web服务器

  • location节点path :指定url映射key
  • location节点内容:root指定location path后对应的根路径,index指定默认的访问页
  • sbin/nginx -c conf/nginx.conf启动
  • 修改配置后直接sbin/nginx -s reload无缝重启

访问nginx服务器ip地址,出现welcome to OpenResty 则成功😄

4-5/6 前端资源部署

  1. scp 指令将htmlStable文件夹上传到//usr/local/openresty/nginx/html目录下

  2. 修改本地hosts文件指定nginx的IP地址域名为miaoshaserver

  3. 修改nginx目录下conf文件:

当我们浏览器访问miaoshaserver/resources/…时,访问的是/usr/local/openresty/nginx/html/resources/目录下的静态资源文件,做到H5请求静态资源到nginx服务器

  1. 使用sbin/nginx -s reload无缝重启,指的是修改nginx配置文件后不需要重启nginx服务器,连接不会断,只变化了进程号

可以看到执行命令前后 master进程不改变,worker进程的进程号变化

4-7 Nginx配置动静分离服务器

location 节点path特定resources : 静态资源路径

location节点其他路径:动态资源用

  • 设置upstream server

  • 设置动态请求location为proxy pass 路径

  • 开启tomcat access log 验证

设置upstream server

修改/usr/local/openresty/nginx/conf/nginx.conf文件

添加以下内容:配置两个应用服务器以轮询的方式 权重1:1来执行负载均衡

添加其他路径访问,设置动态请求location为proxy pass 路径

开启tomcat access log来验证反向代理是否成功,虽然开启日志要消耗一定的性能,但tomcat采用的是异步队列

在application.properties中添加:

%h表示远端host地址(远端IP地址)

%l 默认返回-

%u 表示远端主机user

%t 表示处理时间

%r 打印请求的方法/url

%s HTTP返回状态码

%b 表示请求response的大小

%D 表示处理请求时长

在miaosha/下面新建文件夹tomcat,授权所有权限sudo chmod 777 tomcat/,这个文件夹作为nginx代理请求的日志文件地址

刷新网页,发现多了一个access_log文件 tail -f access_log查看

表示 远端主机为172,26.241.152(应用服务器2)的请求,GET请求,返回码200,返回response大小32,处理时间4ms

4-8 分布式扩展后的性能压测

分布式扩展后,我们测试一下压测前后的性能,设置线程数1000,循环2

Java性能优化: 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问; 控制实例的产生,以达到节约资源的目的; 控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 2.尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic的变量所引用,那么GC通常是不会回收这个对象所占有的内存,如 public class A{ static B b = new B();} 此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。 3.尽量避免过多过常的创建Java对象 尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度的重用对象,最好能用基本的数据类型或数组来替代对象。 4.尽量使用final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。 .......
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值