ELMA365 — это решение с микросервисной архитектурой. Оно состоит из небольших, слабо связанных и легко изменяемых модулей — микросервисов. Эти сервисы построены вокруг бизнес-потребностей и в большинстве случаев выполняют одну или несколько достаточно элементарных функций.
Сервисы разворачиваются независимо друг от друга, могут быть написаны на разных языках и использовать разные технологии хранения данных. Подробнее об этом читайте в статье «Архитектура».
Вы можете создать свой сервис и разместить его внутри оркестратора MicroK8S. Это позволит расширить функциональные возможности системы. Например, можно создать сервис для работы с файлами *.xlsx. Он будет считывать строки и сохранять их в приложения.
Создавать свой сервис нужно тогда, когда без него нельзя решить задачу. Например, вам нужно подключить внешнюю библиотеку. Для интеграции с внешними системами достаточно использования решениий.
Сервис может быть написан на любом языке программирования, для развёртывания его внутри ELMA365 требуется только Docker-образ.
Ниже приводится пример по созданию сервиса на .NET Core 5.
начало внимание
В статье приведены инструкции для устаревшей поставки ELMA365 in MicroK8s. Для поставок, установленных способами KIND и через Helm Chart, команды будут отличаться.
конец внимание
Создание сервиса на .NET
Откройте Visual Studio 2019. Создайте новый проект и задайте настройки, как показано на скриншотах ниже.
Так как система ELMA365 разворачивается на Ubuntu, укажите, что нужно включить Docker. Тип контейнера — Linux.
VS создаст проект по умолчанию. Можно запустить его в Docker, чтобы убедиться, что сервис работает и отвечает.
После проверки можно переходить к следующему шагу.
Подготовка проекта и выгрузка в Docker Hub
Чтобы система могла скачать Docker-образ, его нужно поместить в Docker-хранилище. В нашем примере мы будем использовать публичное хранилище https://hub.docker.com/. В нём необходимо зарегистрироваться.
- Выберите проект и нажмите на его название правой кнопкой мыши.
- Выберите Добавить — Поддержка Docker (в зависимости от целевой платформы). Дождитесь завершения настройки.
- Нажмите на название проекта правой кнопкой мыши.
- Выберите Добавить — Поддержка оркестратора контейнеров... (Docker Compose). Дождитесь завершения настройки.
- Нажмите на название проекта правой кнопкой мыши.
- Выберите Опубликовать — Реестр контейнеров Docker — Docker Hub.
- Укажите логин/пароль от Docker Hub и опубликуйте проект.
- После нажатия на кнопку Готово открывается окно. Перед публикацией в нём можно указать тег для образа. С его помощью можно версионировать сервис.
- Нажмите Опубликовать. VS соберет Docker-образ и отправит его в хранилище https://hub.docker.com/.
Мы использовали публичное хранилище только в качестве примера. Для своих сервисов используйте приватные хранилища или создайте свое собственное с помощью docker-registry.
Установка ELMA365
- Установите ELMA365. Подробная инструкция приводится в справке ELMA365, в статье «Установка ELMA365 в MicroK8s».
- После завершения установки необходимо проверить статусы сервисов. Для этого выполните команду:
sudo microk8s kubectl get pods
- Убедитесь, что все сервисы находятся в статусе Running.
Запуск собственного сервиса
Создайте деплоймент для управления подом. Под запускает контейнер на основе предоставленного Docker-образа.
Для этого выполните команду:
sudo elma365ctl add-service service_name --image=user094404/testservice:004
Где:
- service_name — название вашего сервиса;
- user094404/testservice:004 — адрес, где хранится образ (username/repository:tag).
Вы можете сделать под доступным для публичной сети интернет с помощью команды:
sudo elma365ctl expose-service service_name --port=80 --target-port=80
Проверка сервиса через консоль
- Убедитесь, что сервис появился в списке подов. Для этого выполните команду:
sudo microk8s kubectl get pods
Вы увидите список сервисов со статусами:
...
service_name-5655677c8d-rhswd 1/1 Running 0 4m21s
...
Добавленный вами сервис должен быть в статусе Running.
- Проверьте работу сервиса, запустив контейнер в Kubernetes-кластере:
kubectl -n default run -it --rm --image=curlimages/curl curl -- http://myservice:80/api/State
Если проверка прошла успешно и сервис отвечает, вы увидите следующее сообщение:
* Trying 10.152.183.51...
* TCP_NODELAY set
* Connected to service_name (10.152.183.51) port 80 (#0)
> GET /WeatherForecast HTTP/1.1
> Host: my-service
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Wed, 10 Mar 2021 08:19:53 GMT
< Content-Type: application/json; charset=utf-8
< Server: Kestrel
< Transfer-Encoding: chunked
<
* Connection #0 to host my-service left intact
{"type":"GET","version":"47.0.200.1129"} /
После завершения проверки можно перейти к следующему шагу.
Пример использования сервиса через виджет
Приведём пример использования сервиса.
Пишем клиентский код. При инициализации виджета будет выполнен серверный метод WeatherForecast()
.
Клиентский сценарий:
async function onInit(): Promise<void> {
await Server.rpc.WeatherForecast();
}
Также пишем серверный сценарий.
Серверный сценарий:
async function WeatherForecast(): Promise<void> {
Context.data.test = "debug";
try {
const res = await fetch(`http://service_name:80/WeatherForecast`);
if (!res.ok) {
Context.data.test = `request fail: ${res.statusText}`;
return;
}
Context.data.test = JSON.stringify(await res.json());
}
catch (error) {
Context.data.test = typeof(error) === 'object' ? `error: ${JSON.stringify(error)}` : `${error}`;
}
}
Добавим виджет на страницу и получим следующий результат.
Освобождение ресурсов
Для удаления сервиса выполните следующую команду:
sudo elma365ctl delete-service service_name