首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >带你用Go实现二维码小游戏(扩展篇)

带你用Go实现二维码小游戏(扩展篇)

原创
作者头像
闫同学
修改2024-11-25 23:24:29
修改2024-11-25 23:24:29
2310
举报
文章被收录于专栏:Coding实践Coding实践

我非常推荐您阅读这篇名为《『学习笔记』Nginx 中的负载均衡配置与优化全面指南》

链接:https://cloud.tencent.com/developer/article/2470754

该博客由腾讯云开发者社区的作者数字扫地僧精心撰写,内容全面且深入,详细讲解了Nginx中负载均衡的配置与优化方法。从负载均衡的基本概念到Nginx的负载均衡核心功能,再到具体的配置示例和性能调优建议,作者都进行了清晰的阐述。此外,博客还提供了丰富的示例代码和实用的优化技巧,帮助您更好地理解和应用Nginx的负载均衡功能。无论您是初学者还是有一定经验的开发者,都能从这篇博客中受益匪浅。


相信大多数人都没想到吧,这个项目还有一个扩展篇,感觉在出完上、中、下和优化篇后还意犹未尽,所以想再从另一方面进行扩展,就是我们这篇文章将要介绍的——支持集群进行分布式扩展

为什么要支持集群?

集群部署相比单机部署具有多方面的显著优势,这些优势主要体现在以下几个方面:

1)高可用性

:集群部署通过冗余配置,即多台服务器共同承担任务,确保了即使部分服务器出现故障,整个系统仍能继续运行,从而提高了系统的稳定性和可靠性。在某些情况下,集群甚至可以在不中断服务的情况下进行维护或升级,进一步增强了系统的可用性。

2)负载均衡:集群中的服务器可以共同分担用户请求,从而有效缓解单一服务器的压力,提高系统的响应速度和处理能力。

3)扩展性:集群部署使得系统能够轻松添加新的服务器来扩展处理能力,满足不断增长的业务需求,这种扩展性不仅体现在硬件层面,还体现在软件层面,因为集群系统通常支持动态添加和删除节点。

4)容错性:集群中的服务器之间可以相互备份数据,确保数据的完整性和安全性。即使部分服务器发生故障,集群也能通过数据恢复和重建机制来确保服务的连续性。

综上所述,集群部署在多个方面相比单机部署具有显著优势,这些优势使得集群部署成为处理大规模、高并发、高可用性需求的首选方案。然而,集群部署也带来了更高的复杂性和管理成本,因此在选择部署方式时需要综合考虑业务需求、技术实力和资源投入等因素。

本项目如何进行集群部署

首先分析下本项目的现状,主要是使用HTTP接口提供对外服务,针对使用HTTP接口的项目,利用Nginx进行分布式集群扩展是一种高效且常见的方法。

Nginx在分布式集群中的作用

Nginx是一个开源的、高性能的HTTP和反向代理服务器,同时也支持IMAP/POP3/SMTP代理。在分布式系统中,Nginx常被用作反向代理服务器,负责接收客户端的请求,并根据配置规则将这些请求转发给后端的服务器集群。这种方式不仅隐藏了后端服务器的真实IP地址,提高了系统的安全性,还能通过负载均衡算法优化请求分配,提高系统性能。

分布式集群架构

基本的架构图就是这样,Nginx服务器后是我们多个服务节点:

但是实际企业中使用的场景是往往Nginx也要做集群,为了高可用:

配置Nginx

首先我们先使用节点作为分布式服务的主要节点:

代码语言:conf
复制
upstream backend_servers {
    server localhost:8081;
    server localhost:8082;
    server localhost:8083;
}

然后配置Nginx代理的Path:

代码语言:conf
复制
location /qrcode/gen {
    proxy_pass http://backend_servers/qrcode/gen;
    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 X-Forwarded-Proto $scheme;
}

location /success {
    proxy_pass http://backend_servers/success;
    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 X-Forwarded-Proto $scheme;
}

以及静态资源路径:

代码语言:conf
复制
location / {
    proxy_pass http://backend_servers/static/;
}

location /static/ {
    proxy_pass http://backend_servers/static/;
}

location /tmp/ {
    proxy_pass http://backend_servers/tmp/;
}

以上都配置完之后,我们还需要更改配置文件中的domain配置项:

代码语言:yml
复制
server:
  port: 8082
  tmp-path: /tmp
  domain: http://localhost # 修改成Nginx的域名

task:
  cron: '10 * * * *'

然后我们就能通过访问Nginx的域名来使用应用了。

集群的负载均衡

Nginx支持多种负载均衡算法,如轮询、IP哈希、最少连接等。选择合适的负载均衡算法对于优化系统性能至关重要。

Nginx默认使用的负载均衡算法是轮询(Round Robin)。在轮询模式下,每个请求会按时间顺序逐一分配到不同的后端服务器。如果后端某台服务器宕机,Nginx会自动剔除故障系统,使用户访问不受影响。

除了默认的轮询算法,Nginx还支持多种其他负载均衡算法,具体如下:

加权轮询(Weighted Round Robin)

在轮询的基础上,可以为每个服务器设定一个权重值,权重高的服务器会被分配到更多的请求。

代码语言:conf
复制
upstream myapp {
    server backend1.example.com weight=3;
    server backend2.example.com weight=2;
    server backend3.example.com weight=1;
}
IP哈希(IP Hash)

根据客户端IP地址的哈希值来分配请求,确保来自同一IP的客户端请求总能被同一台后端服务器处理,适用于需要会话保持(Session Persistence)的场景。

代码语言:conf
复制
upstream myapp {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}
最少连接(Least Connections)

将请求分发给当前活动连接数最少的服务器,这样可以避免将请求发给压力较大的服务器。Nginx原生并不直接支持最少连接策略作为负载均衡算法,需要安装并配置第三方模块。

代码语言:conf
复制
upstream myapp {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}
URL哈希(URL Hash)

根据请求的URL的哈希值来分配服务器,当后台服务器为缓存时,效率较高。

最快响应时间(Fair)

根据后端服务器的响应时间来分配请求,响应时间短的服务器会优先分配到更多的请求。

随机算法(Random)

将请求随机分配给后端服务器,可以与其他策略结合使用,如结合权重的随机选择。

为了提高系统的响应速度,可以将静态文件(如HTML、CSS、JavaScript、图片等)存储在Nginx服务器上,由Nginx直接提供访问。这样可以减轻后端应用服务器的负担。同时,Nginx还支持缓存功能,可以进一步提高静态文件的访问速度。

小总结

在这篇文章里我们使用Nginx进行了对项目的分布式代理,达到了将服务扩展成集群的目的,一定程度上能够提高服务的运行效率,但是集群也有一定的弊端。

如果大家还记得我们生成二维码的整个流程的话就会想到,生成二维码和生成证书是两个接口:/qrcode/gen/success,大家有没有想过,假设有A、B、C三个节点,且三个节点在三台机器上,如果/qrcode/gen请求到了A节点而/success请求到了B节点,就会发生/success请求不到资源的情况,因为资源以及预先生成在了A节点所在机器上,那么这种情况如何解决?

最简单的方法就是使用IP地址哈希,因为两个请求大概率是一个机器发起的,IP地址不变,因此使用IP地址哈希就会把两个请求都代理到同一台机器。当然,除此之外也有很多其他的方式来规避这个问题,比如使用统一的文件目录、自定义负载均衡算法等等。

好了,本次的分享就到这里,大家如果有问题可以在留言区进行留言和讨论。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要支持集群?
  • 本项目如何进行集群部署
    • Nginx在分布式集群中的作用
    • 分布式集群架构
    • 配置Nginx
  • 集群的负载均衡
    • 加权轮询(Weighted Round Robin)
    • IP哈希(IP Hash)
    • 最少连接(Least Connections)
    • URL哈希(URL Hash)
    • 最快响应时间(Fair)
    • 随机算法(Random)
  • 小总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档