负载均衡使用

news/2024/7/9 23:59:08 标签: 负载均衡, 服务器, 数据库

1、概念

负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。

作用

高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。
伸缩性:添加或减少服务器数量,然后由负载均衡进行分发控制。这使得应用集群具备伸缩性。
高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。
安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防 DDos 攻击等。

2、策略算法

策略

方式

描述

轮询

一般为默认方式

每个请求按先后顺序逐一分派到不一样的后端网络服务器,假如后端开发网络服务器down掉,能全自动去除。

适合场景:各服务器处理能力相近,且每个事务工作量差异不大。如果存在较大差异,那么处理较慢的服务器就可能会积压请求,最终无法承担过大的负载。

weight

权重方式

特定轮询概率,weight和浏览比例成正比,用于后端开发网络服务器性能不匀的状况。

ip_hash

依据ip分配方式

每个请求按浏览ip的hash结果分派,这样每一个浏览量固定不动浏览一个后端开发网络服务器,能够处理session的难题。

适合场景:保证特定用户总是请求到相同的服务器,若服务器宕机,会话会丢失。

least_conn

最少连接方式

把请求转发给连接数较少的后端服务器

适合场景:适用于对系统负载较为敏感或请求连接时长相差较大的场景。

fair(第三方)

响应时间方式

按后端服务器的响应时间来分配请求,响应时间短的优先分配

url_hash(第三方)

依据URL分配方式

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。

随机

随机算法

算法将请求随机分发到候选服务器

适合场景:适合服务器硬件相同的场景。

3、主流负载方案

目前主流的负载方案分为以下两种:

  • 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。

大白话就是:服务端负载均衡就是客户端不知道服务提供方的地址,请求到了服务器后,再根据服务端配置的ip进行负载均衡。客户端负载均衡就是客户端要调用服务端,从注册中心获取到服务提供方的所有实例的ip地址,然后再进行负载均衡

3.1 客户端的负载均衡

例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。

3.2 服务端的负载均衡

例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。

4、LoadBalancer

在spring-cloud2020后eureka移除了ribbon。需要使用LoadBalance来设置自定义的负载均衡。eureka自带了LoadBalance依赖,所以只需加入eureka客户端依赖。和ribbon一样需要配置RestTemplate实现远程调用。

4.1 提供的负载均衡策略

LoadBalancer默认提供了两种负载均衡策略:

  • RandomLoadBalancer - 随机分配策略

  • (默认) RoundRobinLoadBalancer - 轮询分配策略

4.2 自定义负载均衡策略

现在我们希望修改默认的负载均衡策略,可以进行指定,比如我们现在希望用户服务采用随机分配策略,我们需要先创建随机分配策略的配置类(不用加@Configuration):

public class LoadBalancerConfig {
      //将官方提供的 RandomLoadBalancer 注册为Bean
    @Bean
    public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

接着我们需要为对应的服务指定负载均衡策略,直接使用注解即可:

@Configuration
@LoadBalancerClient(value = "userservice",      //指定为 userservice 服务,只要是调用此服务都会使用我们指定的策略
                    configuration = LoadBalancerConfig.class)   //指定我们刚刚定义好的配置类
public class BeanConfig {
    @Bean
    @LoadBalanced
    RestTemplate template(){
        return new RestTemplate();
    }
}

参考:

https://blog.csdn.net/wanghangzhen/article/details/118554304

https://www.jianshu.com/p/2d70a367f9d2

https://blog.csdn.net/qq_40182873/article/details/128210251

https://blog.csdn.net/Leon_Jinhai_Sun/article/details/126045371


http://www.niftyadmin.cn/n/149228.html

相关文章

并发事务对数据同步的影响

事故背景&#xff1a; 1.由于历史原因和业务需要&#xff0c;我们需要把A库的test表数据&#xff0c;同步到B库的test表中 2.因为A库是sqlserver&#xff0c;旧同步使用的timestamp版本字段&#xff0c;进行的新增、更新检测&#xff1b;后期我们都会迁移到mysql中&#xff0…

基于51单片机的智能计算器Protues仿真设计

目录 一、设计背景 二、实现功能 三、硬件设计 3.1 总体硬件设计 ​3.2 键盘电路的设计 3.3 显示电路的设计 四、仿真演示 五、源程序 一、设计背景 随着社会的发展&#xff0c;科学的进步&#xff0c;人们的生活水平在逐步的提高&#xff0c;尤其是微电子技术的发展&am…

Leetcode. 88合并两个有序数组

合并两个有序数组 文章目录归并思路二归并 核心思路&#xff1a; 依次比较&#xff0c;取较小值放入新数组中 i 遍历nums1 &#xff0c; j 遍历nums2 &#xff0c;取较小值放入nums3中 那如果nums[i] 和nums[j]中相等&#xff0c;随便放一个到nums3 那如果nums[i] 和nums[j]中相…

Docker 架构及工作原理

一、Docker 概述二、Client 客户端三、Docker 引擎四、Image 镜像五、Container 容器六、镜像分层可写的容器层七、Volume 数据卷八、Registry 注册中心九、总结一、Docker 概述 Docker 是一个开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分离&am…

基于stm32智能语音电梯消毒系统

这次来分享个最近做的项目&#xff0c;stm32智能语音电梯消毒系统功能说明&#xff1a;在电梯&#xff0c;房间&#xff0c;客道区域内&#xff0c;检测到人&#xff0c;则执行相关动作&#xff01;例如继电器开关灯&#xff0c;喷洒酒精等行为。手机app/微信小程序可以控制需要…

QT开发学习3(配置 Qt Creator Kits )

配置 Qt Creator Kits Kit 译作套件&#xff0c;也就是开发编译环境套件&#xff0c;我们可以搭建不同平台的套件&#xff0c;以不同的套件 编译出不同平台的应用程序&#xff0c;也验证了 Qt 跨平台的特性&#xff01; 这里我们需要在脚本里写入设置使能环境变量的指令&…

【最佳实践之性能篇】编码惯例与作用域意识

本文适用于任何编程语言&#xff0c;但从JavaScript角度来讲解。 编码习惯 1. 尊重对象所有权 尊重对象所有权就意味着不要修改不属于你的对象。简单来说就是&#xff0c;如果你不负责创建和维护某个对象及其构造函数或方法&#xff0c;就不应该对其进行任何修改。具体来说就…

深入vue2.0源码系列:手写代码模拟vue2.0组件化的实现

前言 在开始之前&#xff0c;我们先来了解一下Vue2.0的组件化开发模式。Vue2.0中的组件化开发模式主要包含以下几个方面&#xff1a; 组件注册&#xff1a;通过Vue.component()方法注册组件&#xff0c;让Vue2.0知道该组件的存在。组件数据&#xff1a;组件内部的数据应该被封…