【从单体架构到分布式架构】(三)请求增多,单点变集群(2):Nginx (2)

注意这里并没有加端口号,是因为 url 中没有端口号的时候表示端口号为 80,而我们 Nginx 的配置文件中,监听的正是 80 端口 (listen 80);我们可以在浏览器中看到服务返回的结果:

User : Admin

这就说明 Nginx 已经转发了我们的请求到了服务端,并正确返回,那么负载均衡是如何体现的呢?让我们多刷新几次浏览器,然后看看后台日志:

我前后一共调用了 5 次服务,可以看到两个服务端分别接收到了 2 次和 3 次请求,负载均衡达到了效果。

4. Nginx 常见的路由策略 1. 轮询法

最简单的轮询法,多余的配置不需要增加。

upstream myserver{ server 127.0.0.1:8088; # 有几套环境,就配置几条 server 127.0.0.1:8089; } 2. 源地址哈希法

使用 ip_hash 关键字,每一个请求,都按 hash(IP) 的结果决定访问哪台服务器;

upstream myserver{ ip_hash; # hash(IP) server 127.0.0.1:8088; # 有几套环境,就配置几条 server 127.0.0.1:8089; }

如果我们本地测试,多次访问接口,可以发现请求永远落到同一个服务上,因为本地 IP 一直没有改变。

3. 加权轮询法

使用 weight 关键字,设置每台服务器的权重;

upstream myserver{ server 127.0.0.1:8088 weight=1; # 20% 请求会发给8088 server 127.0.0.1:8089 weight=4; }

4. 最小连接数法

根据每个服务器节点的连接数,动态地选择当前连接数最少的服务器转发请求;

upstream myserver{ least_conn; server 127.0.0.1:8088; server 127.0.0.1:8089; } 5. 最快响应速度法

根据每个服务器节点的响应时间(请求的往返延迟),动态地选择当前响应速度最快的服务器转发请求;需要额外安装 nginx-upstream-fair 模块。

upstream myserver{ fair; # 额外安装 nginx-upstream-fair 模块 server 127.0.0.1:8088; server 127.0.0.1:8089; } 6. URL 哈希算法

对 URL 进行 Hash 运算,根据结果来分配请求,这样每个 URL 都可以访问到同一个服务端;当服务端有缓存的时候,比较有效。

upstream myserver{ hash $request_uri; server 127.0.0.1:8088; # 有几套环境,就配置几条 server 127.0.0.1:8089; }

也可以安装第三方模块,比如我们要使用 URL 一致性哈希算法,那么我们可以安装 ngx_http_upstream_consistent_hash 模块。

upstream myserver{ consistent_hash $request_uri; server 127.0.0.1:8088; server 127.0.0.1:8089; }

参考资料:Upstream Consistent Hash

5. Nginx 常用功能 5.1 请求失败重试 当一台服务器挂掉,请求如何转发到其他正常的服务器上?

我们可以先做个试验,就是关闭 8089 端口的服务,只保留 8088 端口的服务,然后调用几次接口,如果其中一次调用长时间不返回(浏览器访问状态图标一直在打转),表示本次请求发送到了 8089 端口,那么让我们等待一段时间...大约一分钟之后,8080 端口服务的后台日志,打印出来日志,调用端接收到了返回,这说明:

Nginx 默认有失败重试机制;

默认的超时时间为 60s 。

这里的超时时间是可以修改的,需要在 http.server.location 中增加如下配置:

location / { root html; index index.html index.htm; proxy_pass ; proxy_connect_timeout 5; # 连接超时时间 proxy_send_timeout 5; # 发送数据给后端服务器的超时时间 proxy_read_timeout 5; # 后端服务器的相应时间 #proxy_next_upstream off; # 是否要关闭重试机制 }

完整配置文件请参考:设置超时重试时间5秒-nginx.conf

不过这里要注意一点,如果设置了服务器相应超时时间(比如设置了 10s ),万一应用的业务处理时间比较慢(业务处理花费了 15s ),那么会导致 Nginx 超时重试,那么可能会造成重复处理。

5.2 后端服务器节点健康状态检查 如果挂掉一台服务器,路由到这台服务器请求每次都要等到超时时间过去,才能发起重试,如果 Nginx 不再把请求发送给挂掉的服务器,那就省事多了; 这就叫做“后端服务器节点健康状态检查”。

如果不安装第三方模块,可以做如下配置完成“后端服务器节点健康状态检查”:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjfxp.html