第三章 分布式扩展

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

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

Nginx 反向代理负载均衡

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

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

单机容量问题,水平扩展

  • Mysql 数据库开放远端连接
  • 服务端水平对称部署
  • 验证访问

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

原单机系统架构图

改进后的Nginx系统架构图

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

修改前端资源用于部署 Nginx

Nginx有三种用途:

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

整个项目前端 H5 请求的类型有两种,一种是静态资源,一种是ajax请求动态资源。

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

部署Nginx OpenResty

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

部署静态资源请求:

  • 因为我们在每个页面中都写上了ajax请求地址,所以现在我们要编写一个整体的 js 文件,里面写一个全局变量来代表服务器 tomcat 端口地址,然后在每个页面中引用该 js 文件。
  • static 静态资源目录下新建 gethost.js,用来方便配置修改远端连接地址,然后在每个页面上对应修改,最后将静态资源上传到服务器中
var g_host = "localhost";

Nginx 部署

  • 因为 nginx 在编译阶段需要指定很多参数来支持那些东西,对初学者不友好,所以我们选择了安装OpenResty
  • 下载好 openresty,然后 chmod -R 777 openresty安装包,然后解压 tar -xvzf openresty安装包

  • 进入到 openresty 目录,开始编译 ./configure

  • 此时会报错:根据报错信息我们需要安装 readline、pcre、openssl 等相关的一些操作

yum install pcre-devel openssl-devel gcc curl
  • 官网文档中写清楚了我们需要的前提环境:

  • 然后再次执行 ./configure,出现下图后执行 make 命令:

  • 下图代表编译完成,然后执行安装命令 make install

  • 安装在目录:

  • nginx 的启动:sbin/nginx -c conf/nginx.conf

使用 nginx 作为 web 服务器

将 nginx 指定成对应的 web 服务器

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

前端资源部署

  • 启动 nginx:sbin/nginx -c conf/nginx.conf,默认 nginx 的端口在80端口