【负载均衡】这些内容你需要知道下
😄作者简介: 小曾同学.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 自适应点云聚类...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...