在动手实操之前,我们将撸一撸相关的理论知识要点!
一、理论的东西(不多,很快哈!)
(1)Nginx的负载均衡:所谓的负载,可以理解为服务器承担的压力,而在一个常规的Web应用系统中,压力主要来源于前端以及其他应用服务的请求;如果应用系统只是部署单例且在一台机器上,那么几乎就是由这台机器承担下了所有的压力(“终究是一个人扛下了所有”)
这种方式的弊端显而易见:当Web应用系统访问量达到一定的程度后,单机负载很可能会承受不了,万一要是宕了机,应用系统也就访问不了了,带来的损失难以估量;
因此也就有了“均衡负载”,专业术语叫“负载均衡”,见名知意:部署多台服务器以便平均分担来自四面八方的压力,当前端发来请求时,Nginx会自动根据某种策略检查哪台服务器空闲,则将该请求转发给该服务器处理;某种程度上讲,“负载均衡”可以用于保证应用系统架构的高可用。
(2)系统部署到Linux后,Nginx配置起到的作用:主要有几个,一个是用于充当前端http请求处理服务器(即网页等静态资源的处理);一个是请求代理转发(反向代理),如下所示:
location / {
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header remote_addr $remote_addr;
proxy_pass http://ip地址:应用服务的端口号/;
}
最后一个作用则是“负载均衡”;
二、动手实操走起:
(1)将“权限管理平台【简化版】”的源码下载解压,并导入IDEA,在本地运行没问题后,点击右侧的Maven,执行clean、install操作,稍等片刻即可打包出一个Jar包,名为ym-1.0.1.jar;然后在Linux环境下创建目录:/srv/dubbo/jiqun,在该目录下创建3个文件夹,分别是18081、18082、18083,代表着单台机多个服务实例对应的端口。
(2)将打包出来的ym-1.0.1.jar通过winscp等工具上传至/srv/dubbo/jiqun/18081、/srv/dubbo/jiqun/18082、/srv/dubbo/jiqun/18083 这3个目录,紧接着,cd切换到上面3个目录,然后执行以下的命令:
cd /srv/dubbo/jiqun/18081 进入该目录后执行:
nohup java -jar ym-1.0.1.jar --server.port=18081 &
tail -f nohup.out
cd /srv/dubbo/jiqun/18082 进入该目录后执行:
nohup java -jar ym-1.0.1.jar --server.port=18082 &
tail -f nohup.out
cd /srv/dubbo/jiqun/18083 进入该目录后执行:
nohup java -jar ym-1.0.1.jar --server.port=18083 &
tail -f nohup.out
观察上面多个服务实例打印出来的日志,如果正常运行则进入下一步,如果不正常,则按照报错信息自行检查,然后重新打包部署上传上去即可(解决问题期间有任何问题都可以联系debug,与debug交流)
(3)完了之后,将18081、18082、18083 这三个端口加入到防火墙白名单(iptables或者firewall),同时也需要在云服务器提供商ECS的网络安全组配置下安全规则(将端口加入进去即可);完了之后就是Nginx的配置了:
首先是配置个服务器组(单机多实例,即多端口的组名;如果是多机实例,则只需要将这行配置加入到每台机的Nginx配置文件nginx.conf即可) :
upstream debug-server {
#ip_hash;
server localhost:18081;
server localhost:18082;
server localhost:18083;
}
其中,ip_hash被我们注释起来了,则此时的集群负载均衡策略为默认的“轮询”,所谓的“轮询”,顾名思义就是轮番检查哪台机/哪个服务实例目前处于空闲状态,如果有资源(CPU/内存)闲置,则交给那台机/那个服务器实例处理即可!
如果将 ip_hash前面的注释去掉,则变为:源地址哈希hash,即根据请求客户端(浏览器)的IP地址通过某种hash算法计算出对应的服务实例(比如localhost:18081),那么往后在不做调整的情况下,该客户端几乎所有的请求将交给 localhost:18081 进行处理(可以理解一一绑定);