常见的负载均衡策略分析

往期回顾

前面我们已经介绍了Nacos 的安装与配置,以及Spring Cloud 集成Nacos 作为服务的注册中心,集成Nacos 实现服务的负载均衡

Nacos的安装与配置

Spring Cloud集成Nacos作为注册中心

LoadBalacer集成Nacos实现负载均衡

接下来,我们接着上一讲,我们来简单的介绍介绍负载均衡策略

常见的负载均衡策略

轮询(Round Robin)

轮询的实现方式比较简单,就是将请求以此分发到后端服务器中,将所有的请求均匀分配,均匀分配的坏处是通常后台服务器性能有差异,有时候希望性能较好的服务器可以多承担些请求,该策略无法满足需求。这个不适合对长连接和命中率有要求的场景。

加强轮询(Weighted Round Robin)

这种策略是对轮询策略的优化,对每个后端服务器设置一个权重值,根据权重值决定请求的分配比例,这种做法解决了轮询策略的不足,但是该权限值需要手动配置,没有办法自动动态调节,同样不适合对长连接和命中率有要求的场景。

hash算法

通过ip、url等信息计算hash值,然后对服务器的数量取模,相同的请求会请求到同一个后端服务器中。该算法无法解决热点请求,会把某个时间段的热点请求路由到某个单机上,造成雪崩效应,同时在扩中和节点宕机时发生命中率急剧降低的问题(hash算法导致),该策略适合维护长连接和提高命中率。

随机Random

根据随机算法,将请求随机分配到后端服务器中,请求的均匀请求依赖于随机算法,该实现方式较为简单,常常可以配合处理一些极端的请求,例如热点请求情况。不适合对命中率有要求的场景。

一致性hash算法

对hash 算法的优化,可以有效的解决宕机和扩充造成的命中率急剧降低的问题。

最小连接数 Least Connection

通过活动来估计后端服务器的负载,把请求分配给活动连接数最小的后端服务器,算法比较智能,但是需要额外的资源维护后端服务器的连接列表。

加权最小连接数 Weighted Least Connection

对Least Connection策略的优化,通过加权的方式优化Least Connection的性能,对性能较好的后端服务器设置较高的权重,承担更多的链接负载。

最短响应时间 Least Response Time

该策略的意思就是将请求分配给平均响应时间最短的后端服务器,平均时间可以通过ping或者正常的响应时间来获取 。

LoadBalacer的负载均衡策略

RandomLoadBalancer

随机轮询,没啥好说的,客户端随机选取服务端进行访问

/**
 * 注意不要加@Configuration
 *
 * @author Pymjl
 * @version 1.0
 * @date 2022/8/26 13:05
 **/
public class MyLoadBalancerConfig {
    
    

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
    
    
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
//         随机轮询
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

RoundRobinLoadBalancer

轮询,RoundRobinLoadBalancer是默认情况下使用的ReactiveLoadBalancer的实现类。可以自定义LoadBalancer的配置来切换不同的ReactiveLoadBalancer实现

轮询就是指客户端的每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

/**
 * 注意不要加@Configuration
 *
 * @author Pymjl
 * @version 1.0
 * @date 2022/8/26 13:05
 **/
public class MyLoadBalancerConfig {
    
    

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
    
    
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        // 轮询
        return new RoundRobinLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

Nacos权重轮询

当我们集成Nacos 的时候还可以使用NacosLoadBalancer 对各个服务设置权重,客户端根据权重选择服务调用,另外,权重轮询不代表客户端会严格按照对应的比例发起请求,只保证在一定的时间后(请求次数足够多)保证分发的请求是符合权重比例分配的

/**
 * 注意不要加@Configuration
 *
 * @author Pymjl
 * @version 1.0
 * @date 2022/8/26 13:05
 **/
public class MyLoadBalancerConfig {
    
    
    @Resource
    NacosDiscoveryProperties nacosDiscoveryProperties;

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
    
    
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        // Nacos权重轮询
        return new NacosLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties);
    }
}

选用此方法后你可以选择去Nacos 编辑对应服务的权限值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2gkMJnQ-1662117497066)(https://pymjl.oss-cn-shanghai.aliyuncs.com/picgo/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-08-26%20172648.png)]

也可以在yml里面配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 
        weight: #默认1,注意配置范围是0~1

自定义策略

也可以在yml里面配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 
        weight: #默认1,注意配置范围是0~1

自定义策略

我们除了使用上面LoadBalacer 自带的负载均衡策略以外,我们还可以自己实现,如何实现可以参考这篇文章我就不再赘述

猜你喜欢

转载自blog.csdn.net/apple_52109766/article/details/126669188