Блоги

WSO2 Ballerina - программируемая интеграция

Компания WSO2 на протяжении уже нескольких лет ведёт разработку своего языка для программирования интеграционных взаимодействий. Идея появилась примерно в 2015 году и за это время от первых обсуждений всё эволюционировало в полноценное решение - https://ballerina.io/. Осенью прошлого года состоялся полноценный релиз первой версии языка. Давайте немного расскажем для чего же нужен этот новый язык и отдельно остановимся на процессе сборки исполняемого артефакта.

В программировании интеграционных решений традиционным лидером сейчас считается Apache Camel - давно развиваемый проект сообщества успешно используется в нескольких продуктах для описания и выополнения маршрутов интеграции. Описание маршрута в Apache Camel можно вести либо в Java, либо в xml представлении. Сборку проектов Apache Camel делают при помощи Maven или Gradle.

Ballerina - это попытка спрятать как можно больше деталей не связанных с непосредственной реализацией маршрутов от программиста. В большинстве случаев вам не надо будет создавать инфраструктуру проектов, следить за зависимостями сборки и выполнения - всё это платформа сделает за вас. Достаточно скачать установщик под нужную ОС, всё установить и можно творить.

В качестве примера на сайте даётся следующее:

  • Создайте файл с расширением .bal
import ballerina/http;

import ballerina/io;

# A service representing a network-accessible API

# bound to port `9090`.

service hello on new http:Listener(9090) {

    # A resource respresenting an invokable API method

    # accessible at `/hello/sayHello`.

    #

    # + caller - the client invoking this resource

    # + request - the inbound request

    resource function sayHello(http:Caller caller, http:Request request) {

        // Sends a response back to the caller.

        error? result = caller->respond("Hello Ballerina!");

        if (result is error) {

            io:println("Error in responding: ", result);

        }

    }

}
  • Запустите команду
$ ballerina run hello_world.bal
  • В консоли появится следующее:
[ballerina/http] started HTTP/WS listener 0.0.0.0:9090
  • Ваш сервис стартовал и можно обратиться к нему следующей командой:
$ curl http://localhost:9090/hello/sayHello
  • Результатом вызова будет:
Hello Ballerina!

Идея создания подобного языка является вполне обоснованной - это попытка заполнить нишу интеграционных продуктов, где разработчик сконцентрирован только на реализации и не задумывается обо всём остальном.

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

Собирать и запускать можно как одиночные файлы с расширением .bal так и целые проекты. Просто собрать можно запустив команду:

$ ballerina build hello_world.bal

При этом будет происходить следующее:

1. CleanTargetDirTask - очистка папки target
2. CreateTargetDirTask - создание target и структуры директорий
3. CompileTask - компиляция bal в bir (Ballerina Intermediate Representation (BIR)) и запись в контекст - всё сохраняется внутри объекта BuildContext (есть SourceContext, CompileContext)
4. CreateLockFileTask - создание защиты от записи
5. CreateBaloTask - не используется в версии > 1.1
6. CreateBirTask - Ballerina Intermediate Representation (BIR) - это объектное представление bal файла(ов), которое в рамках этой задачи записывается в виде байтового потока в файловую систему. BirFileWriter.writeBIRToProjectCache.
7. CopyNativeLibTask - копирование библиотек, которые импортируются в модуль bal
8. CreateJarTask - создание jar файла с компилированными классами. Всё делается в классе BootstrapRunner при помощи java.lang.ProcessBuilder - добавляя в переменные окружения classpath и отдавая массив строковых команд в виде аргумента.
9. CopyModuleJarTask - Добавление списка библиотек, используемых в модуле в контекст выполнения.
10. CreateExecutableTask - записывает созданный на шаге 8 jar файл в папку bin. Добавляет в этот jar все нужные зависимости для автономности.
11. CopyExecutableTask - копирует jar из временных папок типа /var/folders/_8/383734tx4mx773y0nxtvt1h40000gn/T/ballerina-build-7658672360128857005707734734825/bin/test5.jar в папку, где лежит начальный bal файл
12. PrintExecutablePathTask - выводит в консоль название созданного jar 
13. RunCompilerPluginTask - вызов дополнительных плагинов компиляции. Например, org.ballerinax.docker.DockerPlugin - https://github.com/ballerinax/docker/tree/master/samples.
14. CleanTargetDirTask - удаление временных папок.

Итогом сборки является исполняемый jar файл, который можно запускать как самостоятельно, так и в контейнерных окружениях в виде микросервиса.

Огромное количество готовых примеров можно найти по ссылке - https://ballerina.io/v1-1/learn/by-example/

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

26.02.2020