Статьи

Высокая доступность Drools Служба без сохранения состояния в Openshift Origin

Привет всем! В этом посте я хотел рассказать о простом примере, показывающем, как легко масштабировать наши сервисы Drools Stateless с помощью Openshift 3 (Docker и Kubernetes). Я покажу, как мы можем масштабировать наш сервис, предоставляя новые экземпляры по требованию и как эти экземпляры балансируются нагрузкой Kubernetes с помощью стратегии циклического перебора.

Наши слюни Служба без гражданства

Прежде всего, нам нужна сеанс Ки без статуса, чтобы поиграть с ним. В этом простом примере я создал службу рекомендаций по питанию, чтобы продемонстрировать, какие сценарии вы можете создать, используя этот подход. Весь исходный код можно найти в репозитории Drools Workshop, размещенном на github: https://github.com/Salaboy/drools-workshop/tree/master/drools-openshift-example

В этом проекте вы найдете 4 модуля:

  • Модель drools-food-model: наша бизнес-модель, включающая классы доменов, такие как Ingredient, Sandwich, Salad и т. д.
  • drools-food-kjar: наши деловые знания, здесь у нас есть наш набор правил, чтобы описать, как пищевые рекомендации будут выполнены.
  • drools-food-services: используя роя wildfly, я раскрываю специфичный для домена сервис, инкапсулирующий механизм правил. Здесь выставлен набор услуг отдыха, чтобы наши клиенты могли взаимодействовать.
  • drools-controller: с помощью Java API Kubernetes мы можем программно предоставлять новые экземпляры нашей службы рекомендаций по продуктам питания по требованию в среду Openshift.

Нашей единицей работы будет проект Drools-Food-Services, в котором конечные точки REST будут взаимодействовать с нашими сеансами без сохранения состояния.

Вы можете взглянуть на конечную точку службы, которая довольно проста: https://github.com/Salaboy/drools-workshop/blob/master/drools-openshift-example/drools-food-services/src/main/java/ орг / Drools / семинар / питание / конечная точка / API / FoodRecommendationService.java

Также обратите внимание, что есть еще одна служба, которая дает нам очень основную информацию о том, где работает наша служба: https://github.com/Salaboy/drools-workshop/blob/master/drools-openshift-example/drools-food-services/ SRC / главная / Java / орг / Drools / семинар / питание / конечная точка / API / NodeStatsService.java

Мы позвоним в эту службу, чтобы точно узнать, какой экземпляр службы отвечает нашим клиентам позже.

Правила для этого примера просты и не требуют особых усилий. Если вы хотите изучить Drools, я рекомендую вам создать более понятные полные правила и поделиться ими со мной, чтобы мы могли улучшить пример;) Вы можете взглянуть на правила здесь: https://github.com/Salaboy/drools-workshop/blob/master/drools-openshift-example/drools-food-kjar/src/main/resources/rules.drl

Как и следовало ожидать: бутерброды для мальчиков и салаты для девочек 🙂

Последнее, что важно знать о нашем сервисе, это то, как правила подбираются конечной точкой сервиса. Я использую расширение Drools CDI для @Inject a KieContainer, которое решается с помощью модуля KIE-CI, описанного в некоторых моих предыдущих постах.

Мы свяжем этот проект в образ Docker, который можно запустить столько раз, сколько мы захотим / нуждаемся. Если у вас установлен клиент Docker в вашей локальной среде, вы можете запустить эту службу рекомендаций по питанию, посмотрев образ salaboy / drools-food-services, который находится на hub.docker.com/salaboy.

Запустив образ Docker, даже не зная, что происходит внутри, мы сразу же заметим следующие преимущества:

  • Нам не нужно устанавливать Java или любой другой инструмент, кроме Docker
  • Нам не нужно ничего настраивать для запуска нашей службы отдыха
  • Нам даже не нужно ничего создавать локально, потому что изображение размещено на hub.docker.com
  • Мы можем работать поверх любой операционной системы

В то же время мы замечаем следующие недостатки:

  • Нам нужно знать, в каком IP и порте наш сервис выставлен Docker
  • Если мы запускаем более одного образа, нам необходимо отслеживать все IP-адреса и порты и уведомлять всех наших клиентов о них.
  • Не существует встроенного способа распределения нагрузки между различными экземплярами одного и того же экземпляра образа докера

Для решения этих недостатков Openshift, а конкретнее, Kubernetes нам в помощь!

Предоставление нашего Сервиса внутри Openshift

Как я уже упоминал ранее, если мы только начнем создавать новые экземпляры Docker Image нашего сервиса, мы скоро обнаружим, что нашим клиентам нужно будет знать, сколько экземпляров у нас запущено и как связаться с каждым из них. Это явно не хорошо, и по этой причине нам нужен промежуточный уровень для решения этой проблемы. Kubernetes предоставляет нам этот уровень абстракции и обеспечения, который позволяет нам создавать несколько экземпляров наших POD (абстракция поверх образа докера) и настраивать на него контроллеры и службы репликации .

Концепция Replication Controller позволяет определить, сколько экземпляров должно запускать наш сервис в данный момент времени. Контроллеры репликации отвечают за то, чтобы, если нам нужно хотя бы 3 запущенных экземпляра, эти экземпляры работали все время. Если один из этих экземпляров погиб, контроллер репликации автоматически создаст его для нас.

Службы в Kubernetes решают проблему знания всех деталей Docker. Услуги позволяют нам предоставлять Фасад для наших клиентов, чтобы взаимодействовать с нашими экземплярами наших Стручков. Уровень Service также позволяет нам определить стратегию (так называемую привязку сеанса), чтобы определить, как распределить нагрузку на наши экземпляры Pod за сервисом. Есть встроенные стратегии: ClientIP и Round Robin.

Итак, сейчас нам нужны вещи, нам нужна установка Openshift Origin (v3) и нашего проекта Drools Controller, который будет взаимодействовать с конечными точками REST Kubernetes для предоставления наших модулей, контроллеров и служб репликаторов.

Для установки Openshift я рекомендую вам выполнить шаги, описанные здесь: https://github.com/openshift/origin/blob/master/CONTRIBUTING.adoc

Здесь я использую опцию Vagrant (второй вариант), описанную в предыдущей ссылке.

Наконец, можно найти очень простой пример того, как использовать API Kubernetes для предоставления в этом случае наших drools-food-services в Openshift.

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

Вы можете взглянуть на проект drools-controller. который показывает, как мы можем создать контроллер репликации, который указывает на наш образ Docker и определяет 1 реплику (по умолчанию создается одна реплика).

Если вы войдете в консоль Openshift, вы сможете увидеть вновь созданную службу с контроллером репликации и только одну копию нашего модуля. Используя пользовательский интерфейс (или API, изменяя класс Main), мы можем предоставить столько реплик, сколько нам нужно. Служба Kubernetes обеспечит баланс нагрузки между различными экземплярами модуля.

Вуаля! Реплики наших услуг запущены и работают!

Вуаля! Реплики наших услуг запущены и работают!

Теперь, если вы получите доступ к сервису NodeStat, выполнив GET для сопоставленного порта сервиса Kubernetes, вы получите модуль, который отвечает на этот запрос. Если вы выполняете запрос несколько раз, вы должны увидеть, что стратегия Round Robin начинает действовать.

1
2
3
4
wget http://localhost:9999/api/node {"node":"drools-controller-8tmby","version":"version 1"}
wget http://localhost:9999/api/node {"node":"drools-controller-k9gym","version":"version 1"}
wget http://localhost:9999/api/node {"node":"drools-controller-pzqlu","version":"version 1"}
wget http://localhost:9999/api/node {"node":"drools-controller-8tmby","version":"version 1"}

Таким же образом вы можете взаимодействовать с сеансами Statless в каждом из этих 3-х модулей. В таком случае вам не нужно знать, какой Pod отвечает на ваш запрос, вам просто нужно выполнить работу любого из них.

Подводя итоги

Используя исходную инфраструктуру Openshift, нам удается упростить нашу архитектуру, не изобретая механизмы, уже существующие в таких инструментах, как Kubernetes & Docker. В следующих постах я буду писать о некоторых других приятных преимуществах использования этой инфраструктуры, таких как свертки для обновления версии наших сервисов, добавление безопасности и управления Api к смеси.

Если у вас есть вопросы по поводу этого подхода, пожалуйста, поделитесь своими мыслями.