前面章节介绍了 Netflix Ribbon 负载均衡的基础用法,默认情况下 Ribbon 采用轮询算法。本章将介绍怎样配置特定均衡算法,覆盖默认轮询算法。本章节还是延续上章节的 User 服务,如下:
参考“Netflix Ribbon 简单实例”章节提供的 User 服务,这里将不再赘述。
创建客户端之前,我们先看看项目结构,如下图:
该配置文件用来配置 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 随机负载均衡算法。当然,你也可以试试下面被注释的其他负载均衡算法。
我们将演示直接使用 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 进行集成。