1 功能


  1. 多个负载均衡规则,以及支持自定义负载均衡规则。
  2. 可以和服务注册中心集成。
  3. 默认支持云计算。
  4. 内置故障恢复能力
    1. 通过IPing接口判断服务存活状态。
    2. 基于断路器模式进行请求降级熔断。
  5. 支持多种REST客户端,以及支持自定义。
  6. 客户端配置功能

    利用Archaius提供了一种简单的方法,通过配置文件创建客户端工厂。

2 配置


2.1 客户端配置

  1. 客户端名称.ribbon.属性名称=属性值
  2. <clientName>.<nameSpace>.<propertyName>=<value>
  3. 可以配置的属性
  4. com.netflix.client.config.CommonClientConfigKey

2.2 全局配置

image.png
如果缺少客户端名称,则默认是全部客户端,


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

获得服务实例列表的方法
Ribbon源码-核心组件 - 图3

  • com.netflix.loadbalancer.ConfigurationBasedServerList 静态服务列表:从配置文件加载服务列表
  • com.alibaba.cloud.nacos.ribbon.NacosServerList 动态服务列表:丛服务注册中心获取服务列表(后续章节详细说明)

    3.2.2 ServerListFilter

    过滤不符合条件的服务实例的方法
    Ribbon源码-核心组件 - 图4

  • com.netflix.loadbalancer.ServerListSubsetFilter 根据负载均衡能力过滤服务实例。

  • org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter 主动选择本地区域过滤服务实例。

    3.2.3 ServerListUpdater

    服务列表更新
    Ribbon源码-核心组件 - 图5
    默认实现类:

  • 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 服务实例的方法,判断其是否存活

Ribbon源码-核心组件 - 图6

  • com.netflix.loadbalancer.DummyPing 假Ping,永远返回真

相信服务列表提供的服务实例。

    public boolean isAlive(Server server) {
        return true;
    }