【负载均衡】这些内容你需要知道下
😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍
文章目录
- 一 🚗 什么是负载均衡
- 二 🤫 负载均衡的作用
- 三 🐮负载均衡的原理
- 四 🏠负载均衡算法
- 五 Go语言实现负载均衡
- 六 🎬负载均衡应用场景
- 小结
在日常开发中遇到负载均衡方面的知识,无论是分布式,中间件,还是微服务,都需要涉及到负载均衡,索性就整理下,以备不时之需。
一 🚗 什么是负载均衡
负载均衡是一种在计算机网络和服务器集群中分配工作负载的技术,将工作负载均匀地分布到多个服务器上,确保每个服务器的负载相对均衡。在一个高流量的网络环境中,单个服务器可能无法满足所有用户的请求,这可能导致性能下降、响应时间延迟或服务不可用的情况。

二 🤫 负载均衡的作用
- 提高性能:负载均衡可以将请求均匀地分配到多个服务器或节点上,避免某个节点过载而导致性能下降。通过分流请求,负载均衡可以最大限度地利用系统资源,提高系统的响应速度和吞吐量。
- 提高可靠性:通过将请求分发到多个服务器上,负载均衡可以实现冗余和故障恢复。当某个服务器发生故障时,负载均衡可以自动将请求转发到其他可用的服务器,确保服务的连续性和可用性。
- 实现扩展性:随着业务的增长,服务器的负载也会增加。负载均衡可以通过增加更多的服务器来扩展系统的容量,使系统能够处理更多的请求和流量。通过动态地添加和移除服务器,负载均衡可以根据当前的负载情况进行自适应调整,以满足系统的需求。
- 简化管理:负载均衡器可以作为一个中心化的调度和管理节点,统一管理和监控系统中的服务器。管理员可以通过负载均衡器进行配置和管理,而无需直接操作每个服务器,从而简化了系统的管理和维护工作。
三 🐮负载均衡的原理
负载均衡的工作原理大致可以分为以下几个步骤:
- 监听和接收请求:负载均衡器作为网络入口,监听来自客户端的请求。它可以通过虚拟IP(VIP)或域名来公开服务。
- 选择合适的服务器:负载均衡器使用特定的算法和策略来选择合适的服务器来处理请求。这些算法和策略可以基于服务器的负载情况、响应时间、连接数等因素进行选择。
- 分发请求:一旦负载均衡器选择了目标服务器,它会将请求转发到该服务器。转发可以通过网络层(如IP层)或应用层(如HTTP层)进行。
- 处理请求:目标服务器接收到请求后,根据请求的内容进行处理,并生成响应。
- 返回响应:目标服务器将生成的响应发送回负载均衡器。
- 将响应传递给客户端:负载均衡器将目标服务器返回的响应传递给相应的客户端。
四 🏠负载均衡算法
可以分为两种:静态算法和动态算法
-
静态算法:静态算法是负载均衡配置阶段确定的固定算法,不会根据服务器状态或负载情况进行调整。分配规则是静态的,不会根据实时情况作出变化,缺点就是无法适应动态变化的负载。
轮询算法(Round Robin):按照顺序将请求依次分配给后端服务器。每个请求按照轮询顺序依次分发到不同的服务器,实现请求均衡分配。加权轮询算法(Weighted Round Robin)算法:
-
动态算法:动态算法是根据实时服务器状态和负载情况动态调整请求的分配。它们可以根据服务器的负载情况自适应地调整请求分发策略,以实现更好的负载均衡效果。
最少连接(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 启动负载均衡器服务器,并将请求转发给选择的目标服务器。
六 🎬负载均衡应用场景
适用于许多不同的系统和网络环境。以下是一些常见的负载均衡应用场景:
- Web 服务器:在 Web 应用程序中,负载均衡用于分发和平衡进入的 HTTP 请求,以确保服务器能够处理大量的并发请求。通过将请求分发到多个后端服务器(如应用服务器集群),负载均衡可以提高系统的可用性、性能和吞吐量。
- 数据库服务器:在具有高负载的数据库环境中,负载均衡可以用于将数据库请求分发到多个数据库服务器上,以实现数据库的水平扩展和负载分担。这有助于提高数据库的性能、可伸缩性和容错能力。
- 应用程序服务器集群:在大规模应用程序中,负载均衡可用于分发用户请求到多个应用程序服务器上,实现请求处理的并行处理和负载分担。这有助于提高应用程序的性能、可扩展性和容错能力。
- 网络流量路由:在网络环境中,负载均衡可用于将网络流量分发到不同的网络路径、链路或节点上,以实现流量的均衡分配和优化网络资源的利用。这有助于提高网络的可用性、带宽利用率和故障恢复能力。
- 媒体流服务:在流媒体应用中,负载均衡可以用于分发媒体流到多个流媒体服务器上,以实现高并发的流媒体传输和负载分担。这有助于提供稳定的媒体服务、减少延迟和提高用户体验。
总的来说,负载均衡适用于任何需要分发和处理大量请求或数据的系统和网络环境。它可以提高系统的可用性、性能和扩展性,同时平衡资源利用和减轻单个节点的负载压力。
小结
在本篇文章中我们了解到负载均衡的概念,原理已经负载均衡常用的算法,以及负载均衡的应用,当然也用go为大家展示了负载均衡的使用。
相关文章:
【负载均衡】这些内容你需要知道下
😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…...
深入理解 Django 中的事务管理
概要 在数据库操作中,事务是确保数据完整性和一致性的关键机制。Django 作为一个强大的 Python Web 框架,提供了灵活而强大的事务管理功能。理解和正确使用 Django 中的事务对于开发高质量的 Web 应用至关重要。本文将深入探讨 Django 的事务管理机制&a…...
springsecurity6配置一
springsecurity6默认的过滤器是UsernamePasswordAuthenticationToken。具体操作步骤如下: 一、定义一个实体实现springsecurity的UserDetails接口 package com.school.information.core.security.entity;import com.alibaba.fastjson.annotation.JSONField; import com.scho…...
四边形不等式优化DP
目录 四边形不等式内容[HNOI2008]玩具装箱解析代码实现 参考资料 四边形不等式内容 TODO [HNOI2008]玩具装箱 解析 满足四边形不等式,决策具有单调性. 对于两个位置 i , j i, j i,j, 对应的最优决策点一定有 o p t [ i ] < o p t [ j ] opt[i] < opt[j]…...
Gin 学习笔记01-数据返回
Gin 数据返回 1、返回 string 和 json2、返回 xml 和 ymal3、返回html4、重定向 1、返回 string 和 json c.String()c.JSON() package mainimport ("github.com/gin-gonic/gin""net/http" )func getJSON(c *gin.Context) {//c.String(http.StatusOK, &qu…...
【AI考证笔记】NO.1人工智能的基础概念
目录 一、什么是智能 1.什么是智能 2.智能的种类 二、什么是人工智能 1.人工智能之父——图灵 2.人工智能的定义 三、人工智能的发展阶段 四、哪些工作要被淘汰掉? 以下部分内容来自于百度智能云人才认证培训讲义,腾讯等也有人工智能类似的讲义&…...
【Exception】npm ERR! code UNABLE_TO_GET_ISSUER_CERT_LOCALLY
Talk is cheap, show me the code. 环境 | Environment kversionOSwindows 11nodev18.14.2npm9.5.0 报错日志 | Error log >npm create vitelatest Need to install the following packages:create-vite5.0.0 Ok to proceed? (y) y npm ERR! code UNABLE_TO_GET_ISSUER_…...
持续集成交付CICD:GitLabCI 通过trigger触发流水线
目录 一、理论 1.GitLabCI 二、实验 1.搭建共享库项目 2.GitLabCI 通过trigger触发流水线 三、问题 1.项目app02未触发项目app01 2.GitLab 报502网关错误 一、理论 1.GitLabCI (1) 概念 GitLab CI(Continuous Integration)是一种持续集成工具…...
Java 多线程中的sleep()和wait()方法的区别
Java 多线程中的sleep()和wait()方法的区别 1、相同点 sleep()和wait()都可以暂停线程的执行。 2、不同点 所在类不同 sleep()是Thread类的静态方法。 wait()是Object类的方法。 锁释放不同 sleep()是不释放锁的。 wait()是释放锁的。 用途不同 sleep()常用于一定时间内暂停…...
车载以太网-数据链路层-VLAN
文章目录 车载以太网VLAN(Vehicle Ethernet VLAN)车载以太网VLAN帧格式VLAN帧报文VLAN帧报文示例车载以太网VLAN(Vehicle Ethernet VLAN) 车载以太网VLAN(Vehicle Ethernet VLAN)是一种在车辆网络中使用的虚拟局域网技术。它允许在车载以太网网络中创建多个逻辑网络,从…...
【Vue】filter的用法
上一篇: vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5502 本篇所使用指令 v-for v-on v-html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…...
python web项目导包规范
python web项目导包规范 python 内置的模块通过第三方库安装的模块框架自身提供的模块用户自己定义的模块 如: from __future__ import absolute_import, unicode_literalsfrom debug_toolbar.panels import Panelfrom django.utils.translation import ugettext_…...
AtCoder Beginner Contest 330 题解
目录 A - Counting PassesB - Minimize Abs 1C - Minimize Abs 2D - Counting LsE - Mex and Update A - Counting Passes 原题链接 题目描述 给定N个数和一个整数L,输出大于等于L的数的个数。 public static void solve() throws IOException{int n readInt(), m…...
论文速读《DeepFusion: Lidar-Camera Deep Fusion for Multi-Modal 3D Object Detection》
概括主要内容 文章《DeepFusion: Lidar-Camera Deep Fusion for Multi-Modal 3D Object Detection》提出了两种创新技术,以改善多模态3D检测模型的性能,通过更有效地融合相机和激光雷达传感器数据来提高对象检测的准确性,尤其是在行人检测方面…...
关于前端处理后端轮询的操作 (总结)
使用场景:前端首次发起请求获取数据,若失败则每隔1s发起一次知道成功获取数据为止解决方案: 使用轮询操作,涉及定时器的使用和关闭 (使用vue2代码为例) data() {return {pollingResult_en: null, // 处理轮询结果bizI…...
【SpringCloud】设计原则之单一职责与服务拆分
一、设计原则之单一职责 设计原则很重要的一点就是简单,单一职责也就是所谓的专人干专事 一个单元(一个类、函数或微服务)应该有且只有一个职责 无论如何,一个微服务不应该包含多于一个的职责 职责单一的后果之一就是职责单…...
UDP分片和丢包与TCP效果对比
UDP 分片 与 丢包,UDP 真的比 TCP 高效吗? UDP(用户数据报协议)和TCP(传输控制协议)在很多方面都有显著的区别。总体来说,TCP更适合需要可靠传输的应用,例如网页浏览、电子邮件等&a…...
Inport 模块
文章目录 Interpolate datainport 模块存在于模型最顶层Port Dimension 和 Variable-size signal Interpolate data Interpolate data:当将 Workspace 的数据导人模型时, 对没有对应数据点的采样时刻进行线性插值的开关选项。 inport 模块存在于模型最顶层 inpo…...
Deep Learning for Monocular Depth Estimation: A Review.基于深度学习的深度估计
传统的深度估计方法通常是使用双目相机,计算两个2D图像的视差,然后通过立体匹配和三角剖分得到深度图。然而,双目深度估计方法至少需要两个固定的摄像机,当场景的纹理较少或者没有纹理的时候,很难从图像中捕捉足够的特…...
点云从入门到精通技术详解100篇-基于深度学习的稀疏点云障碍物检测(续)
目录 3.1 连续帧点云空间特征融合 3.1.1 点云预处理 3.1.2 地面分割 3.1.3 自适应点云聚类...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
