当前位置: 首页 > news >正文

一小时玩转【负载均衡】

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

文章目录

  • 一 🚗 什么是负载均衡
  • 二 🤫 负载均衡的作用
  • 三 🐮负载均衡的原理
  • 四 🏠负载均衡算法
  • 五 Go语言实现负载均衡
  • 六 🎬负载均衡应用场景
  • 小结

在日常开发中遇到负载均衡方面的知识,无论是分布式,中间件,还是微服务,都需要涉及到负载均衡,索性就整理下,以备不时之需。

一 🚗 什么是负载均衡

负载均衡是一种在计算机网络和服务器集群中分配工作负载的技术,将工作负载均匀地分布到多个服务器上,确保每个服务器的负载相对均衡。在一个高流量的网络环境中,单个服务器可能无法满足所有用户的请求,这可能导致性能下降、响应时间延迟或服务不可用的情况。
在这里插入图片描述

二 🤫 负载均衡的作用

  • 提高性能:负载均衡可以将请求均匀地分配到多个服务器或节点上,避免某个节点过载而导致性能下降。通过分流请求,负载均衡可以最大限度地利用系统资源,提高系统的响应速度和吞吐量。
  • 提高可靠性:通过将请求分发到多个服务器上,负载均衡可以实现冗余和故障恢复。当某个服务器发生故障时,负载均衡可以自动将请求转发到其他可用的服务器,确保服务的连续性和可用性。
  • 实现扩展性:随着业务的增长,服务器的负载也会增加。负载均衡可以通过增加更多的服务器来扩展系统的容量,使系统能够处理更多的请求和流量。通过动态地添加和移除服务器,负载均衡可以根据当前的负载情况进行自适应调整,以满足系统的需求。
  • 简化管理:负载均衡器可以作为一个中心化的调度和管理节点,统一管理和监控系统中的服务器。管理员可以通过负载均衡器进行配置和管理,而无需直接操作每个服务器,从而简化了系统的管理和维护工作。

三 🐮负载均衡的原理

负载均衡的工作原理大致可以分为以下几个步骤:

  1. 监听和接收请求:负载均衡器作为网络入口,监听来自客户端的请求。它可以通过虚拟IP(VIP)或域名来公开服务。
  2. 选择合适的服务器:负载均衡器使用特定的算法和策略来选择合适的服务器来处理请求。这些算法和策略可以基于服务器的负载情况、响应时间、连接数等因素进行选择。
  3. 分发请求:一旦负载均衡器选择了目标服务器,它会将请求转发到该服务器。转发可以通过网络层(如IP层)或应用层(如HTTP层)进行。
  4. 处理请求:目标服务器接收到请求后,根据请求的内容进行处理,并生成响应。
  5. 返回响应:目标服务器将生成的响应发送回负载均衡器。
  6. 将响应传递给客户端:负载均衡器将目标服务器返回的响应传递给相应的客户端。

四 🏠负载均衡算法

可以分为两种:静态算法和动态算法

  1. 静态算法:静态算法是负载均衡配置阶段确定的固定算法,不会根据服务器状态或负载情况进行调整。分配规则是静态的,不会根据实时情况作出变化,缺点就是无法适应动态变化的负载。

    • 轮询算法(Round Robin):按照顺序将请求依次分配给后端服务器。每个请求按照轮询顺序依次分发到不同的服务器,实现请求均衡分配。
    • 加权轮询算法(Weighted Round Robin)算法:
  2. 动态算法:动态算法是根据实时服务器状态和负载情况动态调整请求的分配。它们可以根据服务器的负载情况自适应地调整请求分发策略,以实现更好的负载均衡效果。

    • 最少连接(Least Connection)算法:将请求发送到当前连接数最少的服务器。这样可以确保负载较轻的服务器获得更多请求,从而平衡服务器的负载。
    • 响应时间加权(Response Time Weighted)算法:根据服务器的平均响应时间来分配请求。响应时间较低的服务器将获得更多的请求,以提供更快的响应。

五 Go语言实现负载均衡

在 Go 语言中实现负载均衡可以利用其并发和网络编程的特性。以下是一个简单的示例,展示了如何使用 Go 实现基于轮询的负载均衡。

package mainimport ("fmt""net/http""net/http/httputil""net/url"
)var targets = []string{"http://localhost:8000","http://localhost:8001","http://localhost:8002",
}func main() {// 创建反向代理器proxy := NewLoadBalancer(targets)// 启动负载均衡器服务器http.HandleFunc("/", proxy.Handler)if err := http.ListenAndServe(":8080", nil); err != nil {fmt.Println(err)}
}// LoadBalancer 负载均衡器结构体
type LoadBalancer struct {targets []*url.URLindex   int
}// NewLoadBalancer 创建负载均衡器
func NewLoadBalancer(targets []string) *LoadBalancer {lb := &LoadBalancer{}for _, target := range targets {u, _ := url.Parse(target)lb.targets = append(lb.targets, u)}return lb
}// Handler 负载均衡请求处理器
func (lb *LoadBalancer) Handler(w http.ResponseWriter, r *http.Request) {// 轮询选择目标服务器target := lb.targets[lb.index]lb.index = (lb.index + 1) % len(lb.targets)// 创建反向代理proxy := httputil.NewSingleHostReverseProxy(target)// 更改请求头中的主机信息r.URL.Host = target.Hostr.URL.Scheme = target.Schemer.Header.Set("X-Forwarded-Host", r.Header.Get("Host"))// 执行反向代理proxy.ServeHTTP(w, r)
}

在上述示例中,我们创建了一个名为 LoadBalancer 的结构体,其中包含一个目标服务器列表和一个索引变量。NewLoadBalancer 函数用于初始化负载均衡器,并将目标服务器的 URL 存储在 targets 列表中。Handler 函数是负载均衡请求的处理器,它使用轮询算法选择下一个目标服务器,并创建反向代理对象。最后,我们使用 http.ListenAndServe 启动负载均衡器服务器,并将请求转发给选择的目标服务器。

六 🎬负载均衡应用场景

适用于许多不同的系统和网络环境。以下是一些常见的负载均衡应用场景:

  1. Web 服务器:在 Web 应用程序中,负载均衡用于分发和平衡进入的 HTTP 请求,以确保服务器能够处理大量的并发请求。通过将请求分发到多个后端服务器(如应用服务器集群),负载均衡可以提高系统的可用性、性能和吞吐量。
  2. 数据库服务器:在具有高负载的数据库环境中,负载均衡可以用于将数据库请求分发到多个数据库服务器上,以实现数据库的水平扩展和负载分担。这有助于提高数据库的性能、可伸缩性和容错能力。
  3. 应用程序服务器集群:在大规模应用程序中,负载均衡可用于分发用户请求到多个应用程序服务器上,实现请求处理的并行处理和负载分担。这有助于提高应用程序的性能、可扩展性和容错能力。
  4. 网络流量路由:在网络环境中,负载均衡可用于将网络流量分发到不同的网络路径、链路或节点上,以实现流量的均衡分配和优化网络资源的利用。这有助于提高网络的可用性、带宽利用率和故障恢复能力。
  5. 媒体流服务:在流媒体应用中,负载均衡可以用于分发媒体流到多个流媒体服务器上,以实现高并发的流媒体传输和负载分担。这有助于提供稳定的媒体服务、减少延迟和提高用户体验。

总的来说,负载均衡适用于任何需要分发和处理大量请求或数据的系统和网络环境。它可以提高系统的可用性、性能和扩展性,同时平衡资源利用和减轻单个节点的负载压力。

小结

在本篇文章中我们了解到负载均衡的概念,原理已经负载均衡常用的算法,以及负载均衡的应用,当然也用go为大家展示了负载均衡的使用。

相关文章:

  • AD7124-4 实测热电偶数据读取,电压精度到稳定到±1uV, 电压波动260nV, 温度精度到±0.01℃
  • HarmonyOS——UI开展前的阶段总结
  • c++ day 4
  • 【slab/0x40 UAF】TPCTF2023 - core 一题多解
  • Linux查看计算机处理器相关的信息
  • 在oracle中的scn技术
  • C/C++ 发送与接收HTTP/S请求
  • ChatGPT 问世一周年之际,开源大模型能否迎头赶上?
  • NoSQL 数据建模错误会降低性能
  • Linux: FS: inotify
  • matlab 计算两点云之间的放缩倍数
  • python+Qt5+sqllite 个性化单词记忆软件设计
  • 水库监管AI视觉算法与边缘计算盒子
  • 通过查看ThreadLocal的源码进行简单理解
  • Unittest单元测试之unittest用例执行顺序
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • css属性的继承、初识值、计算值、当前值、应用值
  • iOS 系统授权开发
  • PermissionScope Swift4 兼容问题
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python利用正则抓取网页内容保存到本地
  • React 快速上手 - 07 前端路由 react-router
  • Vue2.x学习三:事件处理生命周期钩子
  • 测试如何在敏捷团队中工作?
  • 通过几道题目学习二叉搜索树
  • 源码安装memcached和php memcache扩展
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • mysql面试题分组并合并列
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • #13 yum、编译安装与sed命令的使用
  • #etcd#安装时出错
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (145)光线追踪距离场柔和阴影
  • (ibm)Java 语言的 XPath API
  • (SpringBoot)第七章:SpringBoot日志文件
  • (ZT)出版业改革:该死的死,该生的生
  • (多级缓存)多级缓存
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)认识微服务
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 使用配置文件
  • .NET 中 GetProcess 相关方法的性能
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net反编译的九款神器
  • @SentinelResource详解
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [51nod1610]路径计数
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心