Netflix Ribbon 负载均衡算法

前面章节介绍了 Netflix Ribbon 负载均衡的基础用法,默认情况下 Ribbon 采用轮询算法。本章将介绍怎样配置特定均衡算法,覆盖默认轮询算法。本章节还是延续上章节的 User 服务,如下:

提供 User 服务

参考“Netflix Ribbon 简单实例”章节提供的 User 服务,这里将不再赘述。

实现客户端

创建客户端之前,我们先看看项目结构,如下图:

application.properties

该配置文件用来配置 Netflix Ribbon,我们可以通过 *.ribbon.NFLoadBalancerRuleClassName 配置项指定负载均衡算法。配置文件内容如下:

# Max number of retries
user.ribbon.MaxAutoRetries=1

# Max number of next servers to retry (excluding the first server)
user.ribbon.MaxAutoRetriesNextServer=1

# Whether all operations can be retried for this client
user.ribbon.OkToRetryOnAllOperations=true

# Interval to refresh the server list from the source
user.ribbon.ServerListRefreshInterval=2000

# Connect timeout used by Apache HttpClient
user.ribbon.ConnectTimeout=3000

# Read timeout used by Apache HttpClient
user.ribbon.ReadTimeout=3000

# Initial list of servers, can be changed via Archaius dynamic property at runtime
user.ribbon.listOfServers=localhost:7001,localhost:7002,localhost:7003
user.ribbon.EnablePrimeConnections=true

# 自定义轮询策略
# 基于配置文件形式的 针对单个服务的 Ribbon 负载均衡策略
# 随机策略:随机选择 Server
user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

# 轮训策略:按顺序循环选择 Server
#user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule

# 重试策略:在一个配置时问段内当选择 Server 不成功,则一直尝试选择一个可用的 Server
#user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RetryRule

# 最低并发策略:逐个考察 Server,如果 Server 断路器打开,则忽略,再选择其中并发连接最低的 Server
#user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.BestAvailableRule

# 可用过滤策略:过滤掉一直连接失败并被标记为 circuit tripped 的 Server,
# 过滤掉那些高并发连接的 Server(active connections 超过配置的网值)
#user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.AvailabilityFilteringRule

# 响应时间加权策略:根据 Server 的响应时间分配权重。响应时间越长,权重越低,
# 被选择到的概率就越低;响应时间越短,权重越高,被选择到的概率就越高。
# 这个策略很贴切,综合了各种因素,如:网络、磁盘、IO等,这些因素直接影响着响应时间
#user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.ResponseTimeWeightedRule

# 区域权衡策略:综合判断 Server 所在区域的性能和 Server 的可用性轮询选择 Server,
# 并且判定一个 AWS Zone 的运行性能是否可用,剔除不可用的 Zone 中的所有 Server
#user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.ZoneAvoidanceRule

上面配置文件将采用 com.netflix.loadbalancer.RandomRule 随机负载均衡算法。当然,你也可以试试下面被注释的其他负载均衡算法。

Demo1.java

我们将演示直接使用 Netflix Ribbon 的 API 进行负载均衡调用,代码如下:

package com.hxstrive.springcloud.ribbon_demo1;

import com.netflix.client.ClientFactory;
import com.netflix.client.http.HttpRequest;
import com.netflix.client.http.HttpResponse;
import com.netflix.config.ConfigurationManager;
import com.netflix.niws.client.http.RestClient;

/**
 * 目的:
 * 验证 Ribbon 配置随机轮询策略
 *
 * 结论:
 * 我们可以通过 *.ribbon.NFLoadBalancerRuleClassName 项进行配置,如下:
 * user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
 *
 * @author Administrator
 * @date 2021/3/26 17:43
 */
public class Demo1 {

    public static void main(String[] args) throws Exception{
        // 1.加载配置信息
        ConfigurationManager.loadPropertiesFromResources("application.properties");
        System.out.println(ConfigurationManager.getConfigInstance().getProperty("user.ribbon.listOfServers"));

        // 2.返回名称为 user 的 RestClient 客户端
        // 注意:这里的名称是在 application.properties 文件中配置 ribbon 时的前缀
        //       user.ribbon.listOfServers=localhost:7001,localhost:7002,localhost:7003
        //       上面配置中的 user 就是客户端名称
        RestClient client = (RestClient) ClientFactory.getNamedClient("user");

        // 3.构建指定 URL 的 HTTP 请求
        HttpRequest request = HttpRequest.newBuilder().uri("/info").build();
        for (int i = 0; i < 30; i++)  {
            // 4.使用负载均衡算法发起 HTTP 请求
            HttpResponse response = client.executeWithLoadBalancer(request);
            // 打印调用状态和结果
            System.out.println("Status code for " + response.getRequestedURI() + "  status:"
                    + response.getStatus() + " entity: " + response.getEntity(String.class));
        }
    }

}

客户端运行结果如下:

[localhost:7001, localhost:7002, localhost:7003]
Status code for http://localhost:7001/info  status:200 entity: From user1 - Fri Apr 09 22:58:57 CST 2021
Status code for http://localhost:7002/info  status:200 entity: From user2 - Fri Apr 09 22:58:58 CST 2021
Status code for http://localhost:7003/info  status:200 entity: From user3 - Fri Apr 09 22:58:58 CST 2021
Status code for http://localhost:7001/info  status:200 entity: From user1 - Fri Apr 09 22:58:58 CST 2021
Status code for http://localhost:7002/info  status:200 entity: From user2 - Fri Apr 09 22:58:58 CST 2021
Status code for http://localhost:7003/info  status:200 entity: From user3 - Fri Apr 09 22:58:59 CST 2021
Status code for http://localhost:7001/info  status:200 entity: From user1 - Fri Apr 09 22:58:59 CST 2021
...

在后续章节将介绍怎样将 Netflix Ribbon 与 Spring Cloud 进行集成。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号