Поговорите о получении списка услуг ленты и стратегии балансировки нагрузки.

Привыкайте писать вместе! Это 15-й день моего участия в «Новом ежедневном плане Nuggets · Апрельское задание по обновлению», нажмите, чтобы просмотреть подробности мероприятия .

Поговорите о получении списка услуг ленты и стратегии балансировки нагрузки.

При использовании балансировщика нагрузки для выбора сервисов он получается из всех списков сервисов, так откуда же берется список сервисов?

Балансировщик нагрузки ZoneAwareLoadBalancer определяется в RibbonClientConfiguration и использует объект ServerList.

Рассмотрим метод построения балансировщика нагрузки ZoneAwareLoadBalancer, его метод построения напрямую вызывает метод построения родительского класса DynamicServerListLoadBalancer, в методе построения есть метод restOfInit():

Два важных шага:

enableAndInitLearnNewServersFeature();
updateListOfServers();
复制代码

Давайте взглянем на метод enableAndInitLearnNewServersFeature() DynamicServerListLoadBalancer.

serverListUpdater.start(updateAction);
复制代码

Давайте посмотрим на определение обхода члена updateAction:

protected final ServerListUpdater.UpdateAction updateAction = new ServerListUpdater.UpdateAction() {
        @Override
        public void doUpdate() {
            updateListOfServers();
        }
    };
复制代码

Временный поток определен в start(), а updateAction.doUpdate() вызывается через регулярные промежутки времени для чтения списка сервисов из Eureka или Nacos и сохранения его в локальном кэше ленты.

scheduledFuture = getRefreshExecutor().scheduleWithFixedDelay(
                    wrapperRunnable,
                    initialDelayMs,
                    refreshIntervalMs,
                    TimeUnit.MILLISECONDS
            );
复制代码

Итак суть получить список сервисов через updateListOfServers

После завершения сбора этого списка сервисов мы рассмотрим два часто используемых балансировщика нагрузки: RoundRobinRule и RandomRule.

Класс RoundRobinRule переопределяет метод Choose():

RoundRobinRule по умолчанию опрашивает пустую службу более 10 раз и возвращает пустое значение.

RandomRule random Если выбор пуст, он будет повторяться до тех пор, пока не будет выбран доступный сервис.

Random rand;

   public RandomRule() {
       rand = new Random();
   }
   
 
 public Server choose(ILoadBalancer lb, Object key) {
     ....
     int index = rand.nextInt(serverCount);
     server = upList.get(index);
     .....
 }         
复制代码

Используйте случайное число для выбора значения индекса, затем выберите услугу из списка услуг.

ZoneAvoidanceRule не нуждается в особом введении, это стратегия по умолчанию, она наследует класс PredicateBasedRule, опрашивает и отфильтровывает узлы, не соответствующие Zone.

Стратегия повтора RetryRule, если выбор пуст или недоступен, он будет повторять попытку в течение 5000 мс.

AvailabilityFilteringRule — это доступная политика фильтрации.Она сначала опрашивает, чтобы выбрать одну из них, а затем оценивает, истекло ли время ожидания и превышает ли количество подключений предел, и возвращается после того, как проблем нет.

BestAvailableRule Стратегия минимального количества подключений, то есть выбрать сервис с наименьшим количеством подключений, информация о количестве подключений сохраняется в LoadBalancerStats

Подведем итог

В этой статье в основном рассказывается о том, как лента получает список служб и каковы стратегии балансировки нагрузки.Суть получения списка служб заключается в получении информации о списке с удаленного устройства через равные промежутки времени через синхронизированный поток и сохранении ее в собственном кеше ленты. , У балансировщика нагрузки много, по умолчанию ZoneAvoidanceRule, мы можем выбрать подходящий балансировщик нагрузки или настроить балансировщик нагрузки.

рекомендация

отjuejin.im/post/7086665529318080549
рекомендация