Comments 2
А как обеспечивается апгрейд сервисов? То есть я хочу выкатить новую версию сервиса (пофикшен баг, добавлен метод), как сделать это, не прерывая работу всей системы?
Если qualified name класса сервиса не менялось и интерфейс сервиса также не менялся обратно несовместимым способом, можно будет обновить код и последовательно перезапустить все сервисные узлы.
Пример: https://github.com/artem-gg/habr-microservices-example1
Для более сложных случаев, когда разные версии сервисов, работающие на одном кластере и до полного перехода дающие разные результаты — неприемлимо, необходимо будет применять более комплексные подходы, например, с версионированием сервисов.
Пример: https://github.com/artem-gg/habr-microservices-example1
- Если запустить 2 узла ServiceNode (используют ServiceImpl implements Service) и 1 — ServiceUser, можно видеть по логам, что нагрузка балансируется между 2 сервисными узлами и они дают одинаковый результат
- Если затем попробовать добавить узел ServiceAltNode (использует ServiceAltImpl implements Service), будет ошибка при запуске из-за несоответствия класса сервиса развернутому на других узлах классу
- Если, тем не менее, поменять код в ServiceImpl, в том числе добавить новые поля и методы, и перезапустить один из узлов ServiceNode, перезапущенный узел подхватит новый код и начнет возвращать новый результат, если клиент настроен как не-sticky, можно видеть, что клиент получает то один результат, то другой
- Перезапустив затем второй узел мы получим ситуацию, когда все узлы работают с новым кодом
Для более сложных случаев, когда разные версии сервисов, работающие на одном кластере и до полного перехода дающие разные результаты — неприемлимо, необходимо будет применять более комплексные подходы, например, с версионированием сервисов.
Sign up to leave a comment.
Почему Apache Ignite — хорошая платформа для микросервисов