Разработка решений на платформе ELMA365 / Создание собственного микросервиса

Создание собственного микросервиса

ELMA365 — это решение с микросервисной архитектурой. Оно состоит из небольших, слабо связанных и легко изменяемых модулей — микросервисов. Эти сервисы построены вокруг бизнес-потребностей и в большинстве случаев выполняют одну или несколько достаточно элементарных функций.

Сервисы разворачиваются независимо друг от друга, могут быть написаны на разных языках и использовать разные технологии хранения данных. Подробнее об этом читайте в статье «Архитектура».

Вы можете создать свой сервис и разместить его внутри оркестратора MicroK8S. Это позволит расширить функциональные возможности системы. Например, можно создать сервис для работы с файлами *.xlsx. Он будет считывать строки и сохранять их в приложения.

Создавать свой сервис нужно тогда, когда без него нельзя решить задачу. Например, вам нужно подключить внешнюю библиотеку. Для интеграции с внешними системами достаточно использования расширения.

Сервис может быть написан на любом языке программирования, для развёртывания его внутри ELMA365 требуется только Docker-образ.

Ниже приводится пример по созданию сервиса на .NET Core 5.

Создание сервиса на .NET

Откройте Visual Studio 2019. Создайте новый проект и задайте настройки, как показано на скриншотах ниже.

Так как система ELMA365 разворачивается на Ubuntu, укажите, что нужно включить Docker. Тип контейнера — Linux.

service1

service2

service3

VS создаст проект по умолчанию. Можно запустить его в Docker, чтобы убедиться, что сервис работает и отвечает.

После проверки можно переходить к следующему шагу.

Подготовка проекта и выгрузка в Docker Hub

Чтобы система могла скачать Docker-образ, его нужно поместить в Docker-хранилище. В нашем примере мы будем использовать публичное хранилище https://hub.docker.com/. В нём необходимо зарегистрироваться.

  1. Выберите проект и нажмите на его название правой кнопкой мыши.
  2. Выберите ДобавитьПоддержка Docker (в зависимости от целевой платформы). Дождитесь завершения настройки.
  3. Нажмите на название проекта правой кнопкой мыши.
  4. Выберите ДобавитьПоддержка оркестратора контейнеров... (Docker Compose). Дождитесь завершения настройки.
  5. Нажмите на название проекта правой кнопкой мыши.
  6. Выберите ОпубликоватьРеестр контейнеров DockerDocker Hub.

service5

service6

  1. Укажите логин/пароль от Docker Hub и опубликуйте проект.

service7

  1. После нажатия на кнопку Готово открывается окно. Перед публикацией в нём можно указать тег для образа. С его помощью можно версионировать сервис.

service8

  1. Нажмите Опубликовать. VS соберет Docker-образ и отправит его в хранилище https://hub.docker.com/.

Мы использовали публичное хранилище только в качестве примера. Для своих сервисов используйте приватные хранилища или создайте свое собственное с помощью docker-registry.

Установка ELMA365

  1. Установите ELMA365. Подробная инструкция приводится в справке ELMA365, в статье «Установка ELMA365 в MicroK8s»‎.
  2. После завершения установки необходимо проверить статусы сервисов. Для этого выполните команду:

sudo microk8s kubectl get pods

  1. Убедитесь, что все сервисы находятся в статусе 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

Проверка сервиса через консоль

  1. Убедитесь, что сервис появился в списке подов. Для этого выполните команду:

sudo microk8s kubectl get pods

Вы увидите список сервисов со статусами:

...
service_name-5655677c8d-rhswd   1/1     Running   0          4m21s
...

Добавленный вами сервис должен быть в статусе Running.

  1. Проверьте работу сервиса, запустив контейнер в 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}`;
    }
}

Добавим виджет на страницу и получим следующий результат.

service4

Освобождение ресурсов

Для удаления сервиса выполните следующую команду:

sudo elma365ctl delete-service service_name