Архитектура
go-like состоит из плоских, независимо публикуемых пакетов, а не из одного контейнера «на все случаи жизни». @go-like/core собирает приложение и жизненные циклы Server, @go-like/context переносит отмену, сроки, причины и значения, а остальные SPI описывают по одной области. Реализации находятся в отдельных пакетах провайдеров.
Систему удобно разделить на плоскости. Application plane отвечает за запуск, допуск, hooks и конечное состояние. Core параллельно вызывает stop(ctx) у каждого sibling Server, ждёт terminal result каждого и затем объединяет lifecycle failures; обратный порядок объявления не гарантируется. Компоненты, которым нужна упорядоченная очистка, должны сами скомпоновать этот порядок внутри одного Server. Call plane объединяет discovery, selection, Client, проекцию Server и Transport. Event plane содержит Broker и typed codec. Operations plane включает Config, Store, health, метрики, трассировку и логи. Внешний Web-край принимает Fetch handlers и не смешивается с внутренним transport.
Зависимости направлены к переносимым контрактам. Провайдер может использовать официальный SDK или runtime host, но SPI не зависит от конкретной реализации. Поэтому одна композиция подходит для Bun, Node.js и других серверных сред со стандартными Web API.
Глобального service locator нет. Приложение само создаёт зависимости и передаёт их конструкторам. Несколько строк явной сборки стоят того: владельцы connections, watchers, listeners и процедур остановки сразу видны.
NOTE
Это локализованный краткий обзор. Полный lifecycle DAG, карта ownership и ограничения отдельных providers находятся на канонической английской странице; краткий текст не обещает универсальную parity между runtime.
Карта request и lifecycle
application composition root
-> Context: отмена / deadline / values
-> Core App: admission / hooks / результат stop
-> Web Handler -> runtime host -> listener
-> внутренний Client -> Discovery -> Selector -> Transport -> Server
App.stop()
-> deregister принятого экземпляра
-> отмена runtime Server
-> параллельные вызовы Server.stop
-> terminal joins -> один результатНи Server.start(ctx), ни сам afterStart не доказывают readiness. Внутри hook дождитесь endpoint(ctx) или сигнала допуска ресурса, прежде чем объявлять готовность. Core останавливает соседние Servers параллельно; если важен порядок, объедините ресурсы под одним владельцем.