梳理日常开发涉及的负载均衡
负载均衡是当前分布式微服务时代最能提及的词之一,出于对分层、解耦、弱依赖、可配置、可靠性等概念的解读,一对一的模式变得不再可信赖,千变万化的网络环境中,冗余和备份显得格外重要,稍大型的系统就会存在大量微服务、服务器、中间件资源,如何将各个资源进行平衡调度,在不浪费算力的同时保证服务的可靠性、稳定性来提供基础架构。负载均衡是一个绕不开的话题,这里只列举出开发过程中需要了解到的负载均衡框架或技术,底层涉及的算法就不在此详述。
以web服务为例,从用户侧出发到服务端请求的处理,大概要经过以下四层负载均衡,最终实现用户请求与接口处理的对应。
1. DNS解析负载均衡
DNS主要是对域名的解析,正常域名可以添加多条主机记录,例如www二级域名对应记录值的IP地址,同一www二级域名可以添加多条IP地址的记录值,当存在多个IP,可以通过权重配置修改IP的权重,修改完成后,用户发起域名请求时,根据域名应答DNS查询时,所有IP地址按照预先设置的权重进行返回不同的解析结果,将解析流量分配到不同的服务器上,从而达到负载均衡的目的。
实现效果
假设www域名解析地址中添加了三条记录,分别对应3台服务器(IP 地址分别为IP-1、IP-2、IP-3)
记录类型 | 主机记录 | 解析线路 | 记录值 |
A | www | 默认 | IP-1 |
A | www | 默认 | IP-2 |
A | www | 默认 | IP-3 |
- 未开启权重配置的效果
当Local DNS访问云解析DNS,云解析DNS将这3个解析记录全部返回给Local DNS,Local DNS再将所有的IP地址返回给网站访问者,网站访问者的浏览器会随机访问其中一个IP。在无DNS负载均衡的权威DNS中,这种方法能够在一定程度上减轻单台服务器的压力,但它不能区分服务器的差异,不能反映服务器的当前运行状态。
默认权重效果
权重配置未开启时默认配置的是1:1:1权重,云解析DNS会根据(默认权重1:1:1),轮询3个A记录,依次返回3个IP地址,以响应网站访问者的请求。DNS解析结果如下所示:
用户1 访问,返回 IP-1
用户2 访问,返回 IP-2
用户3 访问,返回 IP-3
用户4 访问,返回 IP-1
用户5 访问,返回 IP-2
用户6 访问,返回 IP-3
……
- 权重设置效果
权重配置开启后,进行权重设置,在DNS请求应答中,IP地址按照预先设置的权重进行返回,可以实现将解析流量按照权重进行分配。例如,将上述3条解析记录的权重比设置为2:1:1时,则DNS解析结果如下所示:
用户1 访问,返回 IP-1
用户2 访问,返回 IP-2
用户3 访问,返回 IP-3
用户4 访问,返回 IP-1
用户5 访问,返回 IP-1
用户6 访问,返回 IP-2
……
2. Nginx负载均衡
Nginx是日常开发中使用较多的服务器,可以通过不同的负载均衡算法来解决请求量过大情况下的服务器资源分配问题。较为常见的负载均衡算法有轮询、加权轮询、IP 哈希等等。可以用来处理前端请求,或者是代理后端服务接口,通常来说,一个正常的Nginx Linux 服务器可以达到10w次/秒的请求处理性能。
nginx的负载均衡策略配置很简单,在 nginx.conf 文件中配置好需要轮询的服务器,写在 http 中的 upstream 对象里:
upstream backserver{ ip_hash; server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载) server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大) server 127.0.0.1:6060; server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
}
3. 微服务网关负载均衡
网关是系统的唯一对外的入口,介于前端端和后端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能。承接上面的Nginx,正常微服务集群都有多个网关作为入口,这里可以用nginx做请求分发,将前端请求分发到不同的网关接口上,当请求到达网关并处理完成后,此时网关需要将具体的请求转发到具体微服务,以SpringCloud Gateway为例,spring提供了丰富的路由策略,可以解析到 HTTP层的数据。因此它可以根据请求的 Path 或 Domain 甚至是 Header 作为条件,再通过本地自定义的负载均衡策略,将请求转发到不同的微服务实例上。
具体代码实现过程中,可以从注册中心查询当前微服务注册的实例列表,并缓存到redis中间隔几秒进行更新,防止网关流量过大打垮注册中心,网关每次拿到实例列表后根据内部实现的负载均衡策略进行分发。
@Autowiredprivate LoadBalanceHandler loadBalance;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpResponse response = exchange.getResponse();//获取原来的请求路径String requestPath = exchange.getAttribute(FilterDict.SYSTEM_REQUEST_PATH);//自实现负载均衡策略String instanceInfo = loadBalance.randomSelectInstance();//如果没有服务,则直接返回报错if (StrUtil.isEmpty(instanceInfo)) {return response.writeWith(Mono.just(GateWayFilterUtils.writeData(exchange, RecoError.GEN_SERVER_BUSY)));}//用于测试负载均衡算法对IP分配是否均衡
// redisUtil.zIncrementScore("test:gateway:load:ip",instanceInfo,1);//分割地址中IP和端口String[] serviceAddress = instanceInfo.split(StrUtil.COLON);String requestSchema = exchange.getRequest().getURI().getScheme();//拼接URL的数据assert ObjectUtil.isNotNull(requestPath);URI uri = UriComponentsBuilder.newInstance().scheme(requestSchema).host(serviceAddress[0].trim()).port(Integer.parseInt(serviceAddress[1].trim())).path(requestPath).query(exchange.getRequest().getURI().getRawQuery()).build(true).toUri();//将拼接好的URL装入新的exchangeServerWebExchange mutateExchange = exchange.mutate().request(builder -> builder.uri(uri).build()).build();Optional<Route> route = Optional.of(exchange.getAttribute(GATEWAY_ROUTE_ATTR));Route newRoute = Route.async().asyncPredicate(route.get().getPredicate()).filters(route.get().getFilters()).id(route.get().getId()).order(route.get().getOrder()).uri(uri).build();mutateExchange.getAttributes().put(GATEWAY_ROUTE_ATTR, newRoute);mutateExchange.getAttributes().put(FilterDict.SYSTEM_APP_IP_ADDR, serviceAddress[0]);return chain.filter(mutateExchange);}
4. 微服务接口负载均衡
上面提到的网关负载是找到具体微服务来承接,不同于微服务之间接口调用的负载均衡,如SpringCloud feign中对Robbin进行了封装,在使用Feign时提供负载平衡的http客户端,如果需要配置自己的负载算法,可以自定义Ribbon的算法即可。
还有dubbo的接口中也提供了负载均衡功能,类似于官方文档中提供的使用方式,只需要调整 loadbalance 相应取值即可,每种负载均衡策略取值请参见文档负载均衡 | Apache Dubbo。
服务端服务级别
<dubbo:service interface="..." loadbalance="roundrobin" />
客户端服务级别
<dubbo:reference interface="..." loadbalance="roundrobin" />
服务端方法级别
<dubbo:service interface="..."><dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
客户端方法级别
<dubbo:reference interface="..."><dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
5. 总结
借用dubbo文档中对负载均衡的场景解释,负载均衡的好处有以下方面
- 高可用性:部署服务的多个实例以确保即使一个或多个实例失败服务保持可用,负载均衡功能可用于在这些实例之间分配传入的请求确保以负载均衡方式使用每个实例的方式,还能最大限度地降低服务停机的风险。
- 流量管理:限制指向特定服务实例的流量,以防止过载或确保公平的资源分配,负载均衡特性提供了 Round Robin、Weighted Round Robin、Random、Least Active Load Balancing 等多种负载均衡策略,可以用来实现流量控制。
- 服务划分:将一个服务划分成多个逻辑组件,每个逻辑组件可以部署在不同的实例上,使用负载平衡以确保每个分区平衡的方式在这些实例之间分配请求,同时在实例发生故障的情况下提供故障转移功能。
- 性能优化:负载平衡可用于优化服务的性能,通过跨多个实例分发请求可以利用可用的计算资源来缩短响应时间并减少延迟。
但有好处就有坏处,比起以往一条龙服务的形式,负载均衡的引入必然会增加系统复杂度,如果说微服务增加系统的宽度,那负载均衡无疑将这种宽度进一步放大,容易造成资源的浪费。
SLB负载均衡实践 - 云起实验室-在线实验-上云实践-阿里云开发者社区-阿里云官方实验平台-阿里云
相关文章:

梳理日常开发涉及的负载均衡
负载均衡是当前分布式微服务时代最能提及的词之一,出于对分层、解耦、弱依赖、可配置、可靠性等概念的解读,一对一的模式变得不再可信赖,千变万化的网络环境中,冗余和备份显得格外重要,稍大型的系统就会存在大量微服务…...

IEEE 754 浮点数运算
...
阿里巴巴Java开发手册学习记录
阿里巴巴Java开发手册学习记录 一、编程规约 1.命名风格 严禁使用英文 拼音混合使用 类名应所有单词的首字母大写,除了(UserDO,XxxDTO, XxxPo等) 常量的命名应该是大写 单词间用下划线连接 抽象类的应以Abstract/Base开头 …...

论文阅读---《Unsupervised T ransformer-Based Anomaly Detection in ECG Signals》
题目:基于Transformer的无监督心电图(ECG)信号异常检测 摘要 异常检测是数据处理中的一个基本问题,它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易,然而ÿ…...

收藏这8个好用的原型设计工具,轻松制作原型图
在设计工作中,原型设计是非常关键的一步,而原型设计工具又能帮助设计师更轻松地完成设计工作。今天本文将与大家分享8个好用的原型设计工具,一起来看看吧! 1、即时设计 即时设计是一个能在线协作的原型工具,也就是说…...

王道计网 第四章笔记
4.1 生活在网络层的“工人”是路由器,他负责各种异构网络的连接,但是因为他只生活在前三层所以从网络层之上的东西他不能管理,所以网路层之上的数据对于路由器来说必须是相同的、透明的。 常见的网络层协议有IP 和 ICMPTCP IP传输层协议FTP应用层协议一句话区分IP和MAC地址…...
C# Blazor 学习笔记(9):动态css/class绑定
文章目录 前言相关资料css和class绑定直接绑定间接绑定 前言 之前我们说到,我们组件化有三个目的。 不用写CSS不用写html不用写交互逻辑 为了解决第一个目的,我们需要动态css 相关资料 Blazor入手教程(二)css和class绑定 cs…...
vue3学习-Pinia状态管理
Pinia 定义一个Store import { defineStore } from pinia export const useStore defineStore(main, {})这个 name,也称为 id,是必要的,Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use… 是跨可组合项的约定࿰…...

TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用
TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用 TextBrewer是一个基于PyTorch的、为实现NLP中的知识蒸馏任务而设计的工具包, 融合并改进了NLP和CV中的多种知识蒸馏技术࿰…...

乍得ECTN(BESC)申请流程
根据TCHAD/CHAD乍得法令,自2013年4月1日起,所有运至乍得的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请,将被视为触犯乍得的条例,并在目的地受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称;…...

【100天精通python】Day28:文件与IO操作_JSON文件处理
目录 专栏导读 1. JSON数据格式简介 1.1 示例JSON数据 1.2 JSON文件的特点 2 json模块的常用操作 2.1 读写JSON文件的示例 2.2 解析JSON字符串 2.3 修改JSON数据 2.4 查询和操作嵌套数据 2.5 处理包含特殊字符的JSON文件 2.6 处理日期和时间 2.7 处理大型JSON文…...

配置两台数据库为主从数据库模式
一、主库配置 1、修改配置文件 /etc/my3306.cnf #mysql服务ID,保证整个集群环境中唯一,默认为1server-id1#是否只读,1代表只读,0代表读写read-only0#忽略的数据,指不需要同步的数据库#binlog-ignore-dbmysql#指定同步…...
linux允许root远程ssh登录
修改文件/etc/ssh/sshd_config # cat /etc/ssh/sshd_config ... #LoginGraceTime 2m #PermitRootLogin prohibit-password #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 ...将 #PermitRootLogin prohibit-password标注为: PermitRootLogin yes样例…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)
Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量(C) Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…...

Spring @Scheduled单线程单实例的坑
文章目录 前言背景验证解决方案 前言 在 Java Spring 项目中经常会用 Scheduled 来实现一些定时任务的场景,有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题,刷新了我的认知,分享给大家。 其他相关文章࿱…...
7-数据结构-(带头节点)单链表的增删改查
问题: 单链表带头结点的创建以及输出,以及带与不带头节点的区别 思路: 单链表,逻辑上是线性结构,由许多单链表结点,串成一串。其单链表结构体中,数据项由data数据域和结点指针域。带头节点是为…...

每天一道leetcode:剑指 Offer 53 - II. 0~n-1中缺失的数字(适合初学者二分查找)
今日份题目: 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例1 输入: [0,1,3] 输出: 2 示例2 …...

玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包
目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包,当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…...

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】——“cpolar内网穿透”
配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 创建一条固定数据隧道2. 找到“保留二级子域名”栏位3. 重新编辑之前建立的临时数据隧道4. 进入“在线隧道列表”页面5. 在其他浏览器访问…...

【枚举】CF1706 C
有人一道1400写了一个小时 Problem - C - Codeforces 题意: 思路: 首先先去观察样例: 很显然,对于n是奇数的情况,只有一种情况,直接操作偶数位就好了 主要是没搞清楚n是偶数的情况 其实有个小技巧&…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...