﻿# Пользовательские микросервисы

> [HTML Version](custom_services.html)

Для решения специфичных и сложных технических задач вам может понадобиться разработка отдельного сервиса. Например, для решения задач обработки данных или для задач, связанных с интенсивным использованием ресурсов сервера (процессор, память, видеокарты).

Платформа ELMA365 полностью готова к тому, чтобы соединить в единый ландшафт множество существующих систем и сервисов. Для этого выделяется два потока обмена информацией.

## Сторонний сервис вызывает платформу ELMA365

Для этого используются готовые [Web API](https://api.elma365.com/ru/public-api/guides/IntroWebAPI/) платформы, а также [методы API](extention-api.md), которые пользователь может разработать самостоятельно в модуле. Типовыми сценариями взаимодействия в данном случае считаются:

- получение элементов приложения для хранения и обработки;

- обновление значений в элементах по результатам событий во внешней системе;

- запуск процесса или создание элемента приложения по событию внешней системы;

- хранение и обработка файлов и документов.

Благодаря возможностям [скриптов и TypeScript SDK](type-script.md) пользователь может создавать свои собственные методы API в модулях, которые будут исполнять значительную часть логики внутри платформы. Это позволяет сократить количество вызовов из внешней системы до минимума.

## Процессы и виджеты вызывают сторонний сервис

Для интеграции в этом направлении в процессах и виджетах можно использовать скрипты на TypeScript, которые будут выполняться в платформе и вызывать внешний сервис. Для вызова сервиса по HTTP‑протоколу в TS SDK есть метод [fetch()](https://tssdk.elma365.com/ru/latest/pages/quick-start/intro_fetch.html). Используя этот метод, можно быстро вызвать любой внешний сервис и тут же прочитать ответ. 

Например, можно написать такой скрипт для получения курса доллара с сайта ЦБ РФ:



````
const res = await fetch("https://www.cbr-xml-daily.ru/daily\_json.js");  
 if (res.ok) \{  
    const cbrData = await res.json();  
    const usdPrice = cbrData\["Valute"\]\["USD"\]\["Value"\] as number;  
    data.items.push(\{name: 'USD', price: usdPrice.toString()\});  
\}

````
Метод `fetch()` также поддерживает параметры, если требуется выполнить более сложный запрос:

````
const res = await fetch("https://my.server.name/api/products", \{  
    method: "POST",  
    headers: \{  
        "Authorization": 'Bearer SOME-TOKEN-HERE',  
    \},  
    body: JSON.stringify(\{  
        name: "New product",  
        cost: 13.20,  
    \})  
\});  
   
if (\!res.ok) \{  
    // Обработка ошибок  
\}  
   
const resData = res.json();

````


Таким образом, взаимодействие с вашим сервисом может быть выполнено в самых разных скриптах:

- при создании элемента приложения;

- в рамках [выполнения процесса](360027203731.md);

- в [скриптах виджета или страницы](client_server_scripts.md);

- при обработке системных событий в модуле.

В редакции On‑Premises для интеграции с внешними сервисами дополнительно существуют следующие возможности:

- [делегированное действие](delegated-activities.md) в бизнес-процессе;

- делегированный обработчик событий в модуле.

## Развертывание и поддержка сервиса

Следует учитывать, что платформа и вендор никак не регламентируют способы разработки, размещения, поддержки и обеспечения безопасности для вашего собственного сервиса. Однако, мы можем дать некоторые рекомендации по размещению и изоляции сервисов в локальном кластере, исходя из собственной практики.

- разрабатывайте сервис с использованием [Docker контейнеров](https://www.docker.com/). Этот подход позволит создавать повторяемые и обновляемые сервисы. Такие сервисы очень просто установить в кластер Kubernetes, который является основным оркестратором для системы;

- оставляйте свой сервис внутри [закрытой сетевой зоны](https://ru.wikipedia.org/wiki/DMZ_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8)). Не прокидывайте в общий доступ любые порты и точки доступа до сервиса без крайней необходимости. Соблюдайте [правила безопасной разработки сервисов](https://ru.wikipedia.org/wiki/OWASP);

- по возможности, изучите рекомендации разработки облачных приложений в статье [«Двенадцать факторов»](https://12factor.net/ru/).

Кроме того, ознакомьтесь со статьей [«Создание собственного микросервиса»](create-service.md), где приведен пример создания и установки простого микросервиса в кластер ELMA365 On‑Premises.