前面章节介绍了 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 随机负载均衡算法。当然,你也可以试试下面被注释的其他负载均衡算法。
springcloud广告位
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 进行集成。