Pull to refresh

Comments 2

А как обеспечивается апгрейд сервисов? То есть я хочу выкатить новую версию сервиса (пофикшен баг, добавлен метод), как сделать это, не прерывая работу всей системы?

Если qualified name класса сервиса не менялось и интерфейс сервиса также не менялся обратно несовместимым способом, можно будет обновить код и последовательно перезапустить все сервисные узлы.

Пример: https://github.com/artem-gg/habr-microservices-example1

  1. Если запустить 2 узла ServiceNode (используют ServiceImpl implements Service) и 1 — ServiceUser, можно видеть по логам, что нагрузка балансируется между 2 сервисными узлами и они дают одинаковый результат
  2. Если затем попробовать добавить узел ServiceAltNode (использует ServiceAltImpl implements Service), будет ошибка при запуске из-за несоответствия класса сервиса развернутому на других узлах классу
  3. Если, тем не менее, поменять код в ServiceImpl, в том числе добавить новые поля и методы, и перезапустить один из узлов ServiceNode, перезапущенный узел подхватит новый код и начнет возвращать новый результат, если клиент настроен как не-sticky, можно видеть, что клиент получает то один результат, то другой
  4. Перезапустив затем второй узел мы получим ситуацию, когда все узлы работают с новым кодом

Для более сложных случаев, когда разные версии сервисов, работающие на одном кластере и до полного перехода дающие разные результаты — неприемлимо, необходимо будет применять более комплексные подходы, например, с версионированием сервисов.
Sign up to leave a comment.