最近在做负载均衡相关的东西。遇到了一些问题,做一些总结如下。
1,为什么需要负载均衡?
先说为什么需要负载均衡,因为传统的 web网站都是客户端(无数个)+服务器(一个)。如果服务器宕机了,那么就收不到客户端的请求了,那问题就大了。所以我们此时多增加几个服务器,每个服务器上部署一样的业务代码,假如服务器A在部署或者宕机了,那么客户端还可以请求服务器B和服务器C。那么此时有个问题,我们分给客户端的请求链接URL是唯一的,那客户端怎么去请求服务器B和服务器C呢。答案就在这个负载均衡,通过负载均衡可以检测出服务器A宕机了,然后就把请求转发服务器B或者C。
2,什么是负载均衡?
可以把负载均衡理解为一个硬件产品,就把它当成一台跳板机,或者直接理解成负载均衡器(可以百度),通过这个跳板机把客户端的请求分发到不同的服务器,简单说就是利用多台服务器提供单一服务。负载均衡又分4层负载均衡和7层负载均衡,4层负载均衡指的是处于OSI协议的第四层(即传输层,可以理解为传输信息的层级),7层指处于OSI协议的第7层(即应用层,可以理解为 有业务逻辑参与的层级),7层负载均衡是建立在4层负载的基础上的,通常我们使用4层负载均衡已经可以达到比较可靠的分发请求的目的了。 4层负载均衡的实现我是通过nginx反向代理实现的。
有张图很有意思的说明了什么是反向代理,
正经点,
3,demo
1,下载nginx,为了此demo是在windows上运行的,如果是在linux上运行的话可以自行下载http://nginx.org/en/download.html
链接: https://pan.baidu.com/s/1_6iHwFOY4JDrWa2j7yXKCw 提取码: aqm2
2,下载之后将压缩包解压,放到一个全英文路径的文件夹下。修改nginx.conf文件。
2,修改这个配置文件,具体每个参数的意义已经注释了。
worker_processes 1;#工作进程的个数,一般与计算机的cpu核数一致
events {
worker_connections 1024;#单个进程最大连接数(最大连接数=连接数*进程数)
}
http {
upstream mysite{
server 127.0.0.1:8082 weight=2;#权重,eg:8082 weight=2,8092 weight=1;访问3次,会先访问两次8082端口,再访问一次8092端口
server 127.0.0.1:8092 weight=1;
}
#当前的Nginx的配置
server {
#监听80端口,可以改成其他端口。这个端口号是一个虚拟的临时端口号,可自定义未被占用的端口号,
#来自外部的请求会先通过这个虚拟的8083端口再转发到配置的真正端口上去
listen 8083;
#server_name当前服务的域名,如果只有一个server域的话,此参数是不起作用的,可以去掉或者随便定义。只有当配置了多个server的时候,这个参数才会发挥作用
server_name localhost;
location / {
#这个参数的值自定义,只需要与upstream后面的名字一致即可,不用顾虑其他
proxy_pass http://mysite;
#不进行重定向
proxy_redirect off;
#不隐藏端口号
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#请求超时时间
proxy_connect_timeout 1;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
下面再多余的解释一下。我是在本地起了两个springboot应用,不同的tomcat端口号,用来模拟两台服务器,这两个应用是相同的代码连接相同的数据库。这两个端口号分别是8082和8092,但是我不想把这两个端口号暴露出去,所以我定义了一个模拟端口号8083。当我们在访问这个代理接口的时候,如果是内网ip地址访问,就可以通过127.0.0.1:8083来访问。如果内容已被外网映射,通过外网域名访问的,我们在外网穿透工具中将原来的8082端口号设置为8083,就可以通过域名访问了。后端多台服务器,但我们通过一个模拟端口,将多台服务器模拟成一台,这个就是集群这个概念的体现。这样做隐藏了内网结构,阻止了对服务器真实端口的攻击,使真实服务器更加安全,并且提高了服务器的稳定性。
3,访问。在访问之前需要先启动nginx才能达到负载均衡的效果。每次修改配置文件需要重新加载。常用cmd命令如下,linux命令自行百度
检测nginx配置文件格式是否正确:nginx.exe -t
关闭所有nginx端口占用后台:taskkill /IM nginx.exe /F
开启nginx负载均衡:start nginx
重新加载nginx改动(改动配置文件后用):nginx.exe -s reload
退出nginx负载均衡nginx.exe -s quit