Источник: Nuances of Programming
Предварительные условия
Вы знаете основные принципы, методы и стандарты COBOL. В этом руководстве мы используем GnuCOBOL — бесплатный компилятор COBOL, реализующий значительную часть стандартов COBOL 85, COBOL 2002, COBOL 2014 и X/Open COBOL, а также многие расширения, включённые в другие компиляторы COBOL.
Вы знакомы с протоколом HTTP — форматами запросов и ответов.
У вас установлены:
- Docker — инструмент виртуализации, работающий из командной строки.
- NPM — менеджер пакетов для JavaScript.
- Git — клиент с открытым исходным кодом для управления версиями.
У вас есть аккаунт на GitHub для публикации микросервисов.
Вы можете использовать любой удобный текстовый редактор, но я рекомендую Visual Studio Code (или его версию с открытым исходным кодом VSCodium) с установленным расширением синтаксиса COBOL bitlang.cobol.
TLDR
Полный исходный код этого руководства на GitHub.
Спецификации
Одна из сильных сторон COBOL — это десятичные вычисления. В этом руководстве мы создадим высокоточный микросервис обмена валют, обрабатывающий HTTP API и возвращающий сумму в евро в формате JSON.
Скажем, микросервис ожидает HTTP запрос GET /<currency>/<amount> по порту 8000 и отвечает JSON {"amount": <amount>}, где:
- <currency> — это трёхбуквенный ISO код валюты, например, USD;
- <amount> — это числовое значение, разделённое точкой, например, 999.999
Любые несоответствующие запросы, неподдерживаемые валюты и ошибки вычисления приведут к ответу 404 Not Found.
Обменные курсы — это курсы евро, опубликованные Европейским центральным банком. Ежедневные обновления курса и поддержка многопоточности выходят за рамки этого руководства.
Структура
Нам нужно 3 каталога — src для основной программы, tests для тестовой и resources для статических файлов. Пожалуйста, скачайте CSV (.zip) с ECB и разархивируйте в каталог resources. Файл содержит обменные курсы евро к 32 валютам. Как указано в спецификации, курсы остаются неизменными.
$ ls
resources src tests
$ ls resources
eurofxref.csv
Наконец, создадим пустые файлы microservice.cbl и microservice-test.cbl в каталогах src и tests соответственно. Они понадобятся нам позже.
Зависимости
Наш микросервис зависит от:
- HTTP-сервера для обработки запросов;
- парсера ECB для CSV;
Все эти компоненты доступны в реестре пакетов COBOL — cobolget.com. Мы с лёгкостью можем интегрировать эти зависимости с помощью инструмента управления пакетами COBOL с открытым исходным кодом cobolget. Вот полный листинг:
В последней команде используется Team Token, поскольку core-network является закрытым пакетом, принадлежащим Cobolget,но свободно распространяемым в сообществе. Вы увидите длинный процесс загрузки, заканчивающийся строкой:
Copybook modules.cpy updated
Этот файл, уже известный как COBOL Copybook, включает в себя все прямые и унаследованные зависимости для микросервиса. Мы используем его внутри нашей программы на следующем этапе.
Программа
По сути наша программа должна:
- читать CSV-файл;
- преобразовывать CSV-текст в список пар валюта-курс;
- запускать локальный TCP/IP сервер на 8000 порту с помощью реализации обратного вызова, который обрабатывает HTTP запросы.
Программа receive-tcp — это сервер, который принимает входящие соединения, считывает содержимое запроса в буфер и делится буфером с программой обратного вызова. Обратный вызов парсит содержимое и заменяет буфер ответом. Сервер отправляет ответ обратно клиенту. Полный листинг программы на GitHub.
Давайте установим среду выполнения GnuCOBOL Docker:
В этом руководстве мы используем GnuCOBOL 2.2, единственный стабильный GnuCOBOL компилятор, доступный в настоящее время в бинарных дистрибутивах. Вы так же можете найти его и установить в исходном формате на свой компьютер.
Тест
Наш микросервис будет следовать практике непрерывной интеграции, когда разработчики интегрируют исходный код в общий репозиторий, где каждая интеграция тестируется автоматически. Для тестирования воспользуемся простой тестовой средой GCBLUnit, уже установленной ранее как зависимость для отладки.
Давайте создадим Dockerfile микросервиса:
Мы открываем 8000 порт и выполняем работу microservice-test при каждой сборке образа. Последний элемент всей картины — это тест-файл microservice-test.cbl:
Для целей тестирования я подготовил минимальное CSV содержимое только с одной валютой — USD. Как видно из определения буфера, тест запрашивает конвертацию 1 USD. Мы ожидаем ненулевые HTTP-заголовки, а также обменную сумму с высокой точностью 0.8750437521876093. Последняя строка включает в себя основную тестируемую программу.
Контейнер
Создадим образ Docker:
Прекрасно! Наш образ Docker успешно прошёл тест, рассчитав 4 выражения, и готов к запуску:
$ docker run -d -i --name microservice -p 8000:8000 microservice
$ docker exec -i microservice cobc -j -x src/microservice.cbl
TCP server started on localhost:08000. Hit Ctrl+C to stop.
Откроем http://localhost:8000/USD/99.99 и http://localhost:8000/ABC/1 в браузере и посмотрим, что произойдёт. Чтобы остановить и удалить контейнер, запустим:
$ docker rm --force microservice
GitHub
Наконец, опубликуем микросервис, применяя GitHub Actions, где каждый запрос на включение внесённых изменений или пуш в репозиторий запускают выполнение microservice-test. Всё, что вам нужно, — это файл docker-image.yml в каталоге .github/workflows:
Заключение
Мы реализовали микросервис с помощью библиотеки Git, менеджера пакетов, модульного тестирования и виртуализации в рамках подхода непрерывной интеграции. COBOL, которому уже 60 лет, подходит для современной разработки программного обеспечения!
Читайте также:
Перевод статьи Oleg Kunitsyn: Modern COBOL: Microservice Tutorial