zl程序教程

您现在的位置是:首页 >  其他

当前栏目

负载均衡使用

2023-04-18 14:27:48 时间

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)。

  • 客户端根据自己的请求情况做负载均衡,Ribbon、LoadBalancer 就属于客户端自己做负载均衡。

大白话就是:服务端负载均衡就是客户端不知道服务提供方的地址,请求到了服务器后,再根据服务端配置的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