Как собрать микросервис и не сойти с ума от несовместимых протоколов
Представьте ситуацию: вы пишете проект на Spring Boot, но фронтенд-команда просит gRPC для скорости, мобильное приложение требует REST, а старый легаси-модуль в подвале всё еще общается через Apache Thrift. Обычно это превращается в зоопарк из разных библиотек, конфигов и головной боли при попытке заставить всё это работать вместе.
Я наткнулся на Armeria — проект от инженеров LINE Corporation. Его создал Тхэджин Хан, тот самый человек, который подарил нам Netty. И это чувствуется сразу. Armeria — это не просто очередной фреймворк, а скорее швейцарский нож для асинхронных микросервисов, который умеет "дружить" самые разные технологии в одном приложении.
Что за зверь такой
Если коротко, Armeria — это реактивный микросервисный фреймворк, построенный на базе Netty. Его главная фишка в том, что он позволяет запускать HTTP/2, gRPC, Thrift и обычные REST-сервисы на одном и том же порту.
Авторы продвигают идею "build at your pace" (строй в своем темпе). Это значит, что вам не нужно переписывать всё приложение, чтобы внедрить gRPC или перейти на реактивные стримы. Armeria мягко встраивается в текущий стек, будь то Spring Boot или Dropwizard.
Чем Armeria может облегчить жизнь
Главное преимущество — это всеядность. Вместо того чтобы городить огород из разных серверов, вы используете один ServerBuilder.
Один порт для всего
Вы можете повесить на 8080 порт gRPC-сервис, статику (HTML/JS) и какой-нибудь JSON API. Armeria сама разберется, какой протокол пришел по проводу, и направит запрос куда нужно. Это дико удобно при отладке и настройке инфраструктуры в Kubernetes.
Встроенная документация (DocService)
Это, пожалуй, моя любимая фича. Если вы добавите DocService, Armeria автоматически создаст веб-интерфейс, где можно посмотреть все ваши gRPC или Thrift методы. Там же их можно протестировать прямо из браузера, как в Swagger, но для бинарных протоколов. Для gRPC, где всегда была проблема "как это по-быстрому дернуть без Postman", это спасение.
Реактивность из коробки
Фреймворк полностью асинхронный. Он поддерживает Java 8+, Kotlin и отлично дружит с Reactive Streams. Если вы работаете с высоконагруженными системами, где важна каждая миллисекунда и эффективное использование потоков, Armeria даст фору многим тяжеловесным решениям.
Клиентская часть
Armeria — это не только сервер. У неё мощный клиент, который умеет в автоматические ретраи, балансировку нагрузки на стороне клиента и работу с Service Discovery (например, через ZooKeeper или DNS).
Как это выглядит в коде
Давайте посмотрим, как быстро поднять сервер. Код на Java выглядит лаконично:
Server sb = Server.builder()
.http(8080)
.service("/", (ctx, res) -> HttpResponse.of("Hello, Armeria!"))
// Добавляем gRPC сервис
.service(GrpcService.builder()
.addService(new MyHelloService())
.build())
// Включаем ту самую чудо-документацию
.serviceUnder("/docs", new DocService())
.build();
sb.start().join();
Всего несколько строк, и у нас готов сервер, который понимает и HTTP/1.1, и HTTP/2, и gRPC, да еще и документацию сам рисует.
Технический бэкграунд
Проект живет в LINE — это огромный мессенджер, популярный в Азии. Там крутятся колоссальные нагрузки, так что Armeria проверена в настоящем "бою". В основе лежит Netty, но Armeria скрывает всю его низкоуровневую сложность за приятным API.
Интересно, что разработчики не пытаются запереть вас в своей экосистеме. Если вам нравится Spring Boot, есть готовая интеграция armeria-spring-boot-starter. Она позволяет использовать Armeria в качестве основного веб-сервера вместо Tomcat или Jetty, сохраняя все привычные аннотации @RestController.
Стоит ли пробовать
Проект точно подойдет тем, кто:
- Переходит на gRPC, но не хочет отказываться от REST.
- Ищет легкую альтернативу Spring WebFlux.
- Устал настраивать прокси-серверы для объединения разных типов трафика.
Из минусов: документация на официальном сайте иногда кажется суховатой, а сообщество в России пока не такое большое, как у того же Spring. Но за проектом стоят серьезные ребята, коммиты идут ежедневно, а список контрибьюторов внушает уважение.
Если вы планируете новый микросервис или хотите навести порядок в текущем API, Armeria — отличный кандидат на "попробовать". Она дает ту гибкость, которой часто не хватает большим фреймворкам.
