1 功能
- 多个负载均衡规则,以及支持自定义负载均衡规则。
- 可以和服务注册中心集成。
- 默认支持云计算。
- 内置故障恢复能力
- 通过
IPing
接口判断服务存活状态。 - 基于断路器模式进行请求降级熔断。
- 通过
- 支持多种
REST
客户端,以及支持自定义。 - 客户端配置功能
利用Archaius提供了一种简单的方法,通过配置文件创建客户端工厂。
2 配置
2.1 客户端配置
客户端名称.ribbon.属性名称=属性值
<clientName>.<nameSpace>.<propertyName>=<value>
可以配置的属性
com.netflix.client.config.CommonClientConfigKey
2.2 全局配置
如果缺少客户端名称,则默认是全部客户端,
3 负载均衡
3.1 概念
客户端负载均衡:
需要确保服务列表,服务节点的正确性,及时剔除宕机的节点,尽可能保证节点的请求负载都不是很高。
Ribbon对于动态服务,具体步骤如下:
动态刷新服务列表—->获取服务列表—->过滤服务列表—->执行Ping策略—->根据路由规则选取一个实例。
3.2 组件
指定特定的组件属性配置方法。
clientNam.ribbon.NFLoadBalancerClassName=负载均衡实现类
clientNam.ribbon.NFLoadBalancerRuleClassName=路由规则实现类
clientNam.ribbon.NFLoadBalancerPingClassName=服务Ping实现类
clientNam.ribbon.NIWSServerListClassName=获取服务列表实现类
clientNam.ribbon.NIWSServerListFilterClassName=过滤服务列表实现类
3.2.1 ServerList
获得服务实例列表的方法
- com.netflix.loadbalancer.ConfigurationBasedServerList 静态服务列表:从配置文件加载服务列表
com.alibaba.cloud.nacos.ribbon.NacosServerList 动态服务列表:丛服务注册中心获取服务列表(后续章节详细说明)
3.2.2 ServerListFilter
过滤不符合条件的服务实例的方法
com.netflix.loadbalancer.ServerListSubsetFilter 根据负载均衡能力过滤服务实例。
org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter 主动选择本地区域过滤服务实例。
3.2.3 ServerListUpdater
服务列表更新
默认实现类:com.netflix.loadbalancer.PollingServerListUpdater
启动一个定时任务,定时重新获取刷新最新的服务实例列表。
默认30秒执行一次。
public synchronized void start(final UpdateAction updateAction) {
if (isActive.compareAndSet(false, true)) {
final Runnable wrapperRunnable = new Runnable() {
@Override
public void run() {
try {
updateAction.doUpdate();
lastUpdated = System.currentTimeMillis();
}
}
};
// 动态刷新
scheduledFuture = getRefreshExecutor().scheduleWithFixedDelay(
wrapperRunnable,
initialDelayMs,
refreshIntervalMs,
TimeUnit.MILLISECONDS
);
}
}
具体更新的类:
- com.netflix.loadbalancer.DynamicServerListLoadBalancer
@VisibleForTesting public void updateListOfServers() { List<T> servers = new ArrayList(); if (this.serverListImpl != null) { // 根据具体ServerList的实现类获取更新的服务列表 servers = this.serverListImpl.getUpdatedListOfServers(); LOGGER.debug("List of Servers for {} obtained from Discovery client: {}", this.getIdentifier(), servers); if (this.filter != null) { // 根据ServerListFilter的实现类获取符合条件的服务列表 servers = this.filter.getFilteredListOfServers((List)servers); LOGGER.debug("Filtered List of Servers for {} obtained from Discovery client: {}", this.getIdentifier(), servers); } } this.updateAllServerList((List)servers); } protected void updateAllServerList(List<T> ls) { if (this.serverListUpdateInProgress.compareAndSet(false, true)) { try { Iterator var2 = ls.iterator(); while(var2.hasNext()) { T s = (Server)var2.next(); s.setAlive(true); } this.setServersList(ls); // 执行IPing策略 super.forceQuickPing(); } finally { this.serverListUpdateInProgress.set(false); } } }
3.2.4 IPing
主动 ping 服务实例的方法,判断其是否存活
- com.netflix.loadbalancer.DummyPing 假Ping,永远返回真
相信服务列表提供的服务实例。
public boolean isAlive(Server server) {
return true;
}
com.netflix.loadbalancer.PingUrl 根据URL地址判断服务状态
public boolean isAlive(Server server) { String urlStr = ""; if (isSecure){ urlStr = "https://"; }else{ urlStr = "http://"; } urlStr += server.getId(); urlStr += getPingAppendString(); boolean isAlive = false; HttpClient httpClient = new DefaultHttpClient(); HttpUriRequest getRequest = new HttpGet(urlStr); String content=null; try { HttpResponse response = httpClient.execute(getRequest); content = EntityUtils.toString(response.getEntity()); isAlive = (response.getStatusLine().getStatusCode() == 200); } return isAlive; }
3.2.5 IRule
负载均衡规则接口,定义了从服务中选择一个实例的方法
com.netflix.loadbalancer.RoundRobinRule 循环按顺序一个节点一个几点分配
- com.netflix.loadbalancer.WeightedResponseTimeRule 根据每个服务器的平均响应时间为其赋予权重。响应时间越长,得到的权重就越小。
- com.netflix.loadbalancer.RandomRule 随机选择一个节点
- com.netflix.loadbalancer.AvailabilityFilteringRule 可用性过滤,动态跳过或者熔断不可用节点。
3.2.6 ILoadBalancer
参考资料
https://blog.csdn.net/luanlouis/article/details/83060310
https://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/
https://www.cnblogs.com/trust-freedom/p/11216280.html
https://blog.51cto.com/u_8958931/2817488
https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html
https://juejin.cn/post/6910560916111769614