要理解负载均衡,必须先搞清楚正向代理和反向代理。
注:
正向代理,代理的是用户。
反向代理,代理的是服务器。
当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。
我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
负载均衡是用反向代理的原理实现的。
结合本文场景,需要安装Nginx和Java环境(运行SpringBoot项目)
本次用的是 homebrew 安装的
大家也可前去官网下载
由于只是测试, SpringBoot只是映射了根路径,端口分别是 10001 和 10002 ,分别返回 demo1 和 demo2 字符串作为区分。
轮询方式是Nginx负载默认
的方式,顾名思义,所有请求都按照时间顺序分配到不同的服务上,如果服务Down掉,可以自动剔除,如下配置后轮训10001服务和10002服务。
upstream codingce-nginx {
server localhost:10001;
server localhost:10002;
}
指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能,如下配置后10002服务的访问比率会是10001服务的二倍。
upstream codingce-nginx {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用)。
upstream codingce-nginx {
ip_hash;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
将请求分配到连接数最少的服务上。
upstream codingce-nginx {
least_conn;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream codingce-nginx {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
fair;
}
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream codingce-nginx {
server localhost:10001;
server localhost:10002;
hash $request_uri;
hash_method crc32;
}
访问http://localhost:10000
如果要修改负载均衡算法修改对应upstream模块即可。
此次nginx路径展示
主配置与自定义配置
注意:下方自定义配置文件是自定义配置文件目录 vhost/
轮询配置 在nginx.conf文件中配置的
upstream codingce-nginx {
server localhost:10001;
server localhost:10002;
}
进入自定义配置文件夹配置自定义配置
williamma@WilliamdeMacBook-Pro nginx % cd vhost
williamma@WilliamdeMacBook-Pro vhost % ll
total 16
drwxr-xr-x 4 williamma admin 128 5 13 15:17 ./
drwxr-xr-x 19 williamma admin 608 5 13 15:28 ../
-rw-r--r-- 1 williamma admin 549 4 16 16:17 gulimall.conf
-rw-r--r-- 1 williamma admin 167 5 13 15:17 mytest.conf
williamma@WilliamdeMacBook-Pro vhost % vim mytest.conf
配置文件展示
server {
listen 10000;
server_name localhost;
location / {
#用在此处
proxy_pass http://codingce-nginx;
proxy_redirect default;
}
}
[Github]:https://github.com/xzMhehe/codingce-java
[Gitee]:https://gitee.com/codingce/codingce-java
如有问题欢迎评论区讨论