Привыкайте писать вместе! Это 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, мы можем выбрать подходящий балансировщик нагрузки или настроить балансировщик нагрузки.