2022-08-08 12:30:15
Весной я писал про инструмент мониторинга 1С под названием Алькир и упомянул, что немного участвую в проекте в качестве разработчика.
Настало время открыть один из компонентов этой системы под названием rahc - Remote Administration HTTP Client
https://github.com/DigiLabsru/alkir-rahc
Вы могли натыкаться на ИТС на Программный Java-интерфейс для административного сервера (сокращенно ibis), позволяющий дергать RAS (который remote administration server из состава платформы) из джавы/jvm-языков, минуя консольный запуск RAC (remote administration client), на базе которого построено большинство опенсорсных инструментов. В рамках разработки Алькира понадобился некий http-сервис для оперирования RAS, консольный запуск RAC не подходил по ряду причин, поэтому было решено попробовать напилить микросервис поверх ibis.
В качестве фреймворка для разработки был выбран Spring Boot, с которым у меня сложились теплые отношения за время работы над BSL Language Server.
Что могу отметить из ништяков и особенностей...
Во-первых, сам Spring Boot прекрасен. Работающий прототип с rest-интерфейсом для пары сущностей был написан за буквально 2.5 часа. Дальше уже пошли хотелки и улучшалки. Добавление новых методов в сервисы или сервисная обвязка делается в пару строчек шелковистого и душистого кода.
Во-вторых, поддерживается два интерфейса доступа - собственно rest с его get/put/delete/post и JSON-RPC версии 2.0.
В-третьих, есть как возможность настроить один инстанс rahc на один ras (используя переменные среды и API версии v1), так и использовать rahc как ультра-тонкий клиент взаимодействия с RAS, передавая параметры авторизации RAS в качестве параметров http-запроса.
В-четвертых, Spring Boot подарил легкую генерацию Swagger UI (как под rest, так и под json-rpc варианты вызова), так и подключение Spring Boot Admin (в проект включен и клиент и сервер) на пару с Spring Boot Actuator
И в-пятых, и наверное, это было самое сложное - решена проблема зависания ibis. Я не совсем понимаю, зачем ibis была написана именно так, но в ней есть ненулевая вероятность, что запрос, отправленный в RAS, никогда не получит ответ. И для сервиса, который в системе мониторинга дергается по многу раз в минуту, такое зависание и распухание http-сессий недопустимо. Потому что привет OutOfMemoryException или закончившиеся tcp-порты :(
В rahc вшит очень жестокий, но работающий способ обрыва таких зависших сеансов и повторный вызов сервиса.
Из особенностей:
1) Наружу торчат не все сущности и методы, доступные в ibis. Торчит то, что реально используется в Алькире. Но доработать это добро довольно просто. ЖВПР, как говорится.
2) Для сборки нужно руками подложить ibis в нужную папочку и выполнить магическую команду. Планирую упростить сей шаг с помощью автоматической таски в gradle, но пока так.
P.S. Перед началом работы над rahc я видел и ripreal/admin1c, и hirac. Но они по ряду причин не подходили. Но хорошо, что есть выбор, да? Можно попробовать все и найти подходящее. Или сделать своё :)
1.7K viewsedited 09:30