Spring Облако: Канарские развертывания с Зуулом

Я начинаю с Spring Cloud, используя Eureka и Zuul, и у меня возникли вопросы о структурировании синих/зеленых и Canary-развертываний. Пока у меня есть основы, и у вас есть Eureka, Zuul и конфигурационный сервер, работающие как ожидалось. Я пытаюсь выполнить настройку службы с двумя версиями, например 1.0 и 1.1. Для подмножества конкретных пользователей я хочу перенаправить их в версию 1.1, и все остальные должны перейти к версии 1.0.

API фильтра Zuul немного освещен документацией, и я немного борюсь с некоторыми концепциями, поэтому я подумал, что задал здесь несколько вопросов. У меня также есть несколько базовых фильтров, которые не делают много в тот момент, кроме получения идентификатора принципала и службы, которую они запрашивают. Где я нахожусь на стене, это понимание того, как выставлять две разные версии той же услуги для Эврика и Зууля. Несколько вещей, которые мне интересны:

  • Между документацией, сообщениями и другим переполнением стека термин "служба" и "кластер", похоже, используются взаимозаменяемо. Правильно ли это?
  • С учетом сказанного, если у меня есть служба с именем /simpleservice, я могу разоблачить два разных идентификатора службы (т.е. simpleservice и simpleservice-1.1)? И если я это сделаю, когда один из целевых пользователей запросит /simpleservice, у меня будет Zuul отправить их на /simpleservice-1.1
  • Или вы добавляете еще один node к существующему идентификатору службы и добавляете дополнительные метаданные для каждого node, чтобы Zuul отличался версиями 1.0 и 1.1?
  • Правильный ответ "все вышеперечисленное"?:)

Ответы

Ответ 1

Предполагая, что вы используете ленту, я бы оставил идентификаторы служб такими, какие они есть. Вместо этого я бы посмотрел на com.netflix.loadbalancer. Развертывание каналов - это, по сути, балансировка нагрузки с очень специфическими ограничениями. Вы можете реализовать свой собственный AbstractLoadBalancerRule, который выбирает серверы на основе какого-либо свойства, на которое вы хотели бы настроить маршрутизацию. Затем добавьте это правило в конфигурацию вашего экземпляра Zuul.

@Configuration
public class CanaryConfiguration {
    @Bean public IRule canaryDeploymentRule(IClientConfig config) {
      CanaryDeploymentRule rule = new CanaryDeploymentRule ();
      rule.initWithNiwsConfig(config);
      return rule;
    }
}

Если вы позволяете своим службам регистрироваться в Eureka с разными идентификаторами обслуживания ( "simpleservice" и "simpleservice-x.y" ), я полагаю, что вещи неизбежно осложняются. Вам нужно будет расширить клиент обнаружения, чтобы игнорировать часть версии ( "-xy", сохраняя при этом возможность работать с "foo-service" ) при получении списка доступных серверов из Eureka, а затем выполнить некоторый процесс выбора, чтобы выбрать в любом случае. Поэтому я думаю, что все будет просто усложняться.

Все это основано на лучших догадках, я на самом деле не реализовал это. Я понимаю, что этот вопрос составляет почти 4 месяца. Так что если вы нашли какое-то другое решение тем временем, было бы здорово, если бы вы могли поделиться им в ответ на свой собственный вопрос.