Перейти к содержанию

Архитектура

Этот раздел описывает архитектуру сгенерированных проектов Go Project Starter.

Архитектура генератора

Если вас интересует внутреннее устройство самого генератора, см. раздел Разработка генератора.

Содержание раздела

Архитектура генератора

Описание внутреннего устройства генератора находится в разделе Разработка генератора.

Обзор

Go Project Starter — это генератор кода, а не фреймворк или библиотека. Он читает YAML-конфигурацию и создаёт полностью готовый к запуску Go-проект с использованием встроенных шаблонов.

graph LR
    A[YAML Config] --> B[Go Project Starter]
    B --> C[Production-Ready Project]
    C --> D[REST APIs]
    C --> E[gRPC Services]
    C --> F[Workers]
    C --> G[Infrastructure]

Ключевые концепции

Application

Application — атомарная единица горизонтального масштабирования (контейнер).

  • Один бинарь/контейнер может включать несколько компонентов
  • HTTP серверы, gRPC серверы, воркеры инициализируются параллельно
  • Каждый application масштабируется независимо
applications:
  # API Gateway с REST и gRPC
  - name: gateway
    transport: [rest_api, grpc_users]

  # Выделенный worker instance
  - name: workers
    workers: [telegram_bot, kafka_consumer]

Transport

Transport — слой доставки запросов к сервису.

Транспорт Протокол Жизненный цикл
REST HTTP/JSON Слушает порт → обрабатывает запросы
gRPC HTTP2/protobuf Слушает порт → обрабатывает запросы
CLI stdin/stdout Получает команду → выполняет → завершается
Kafka Kafka protocol Слушает топики → обрабатывает события

Driver

Driver — адаптер между бизнес-логикой и внешним API (Telegram, S3, и т.д.)

Все драйверы реализуют интерфейс Runnable:

type Runnable interface {
    Init(ctx context.Context) error
    Run(ctx context.Context) error
    Shutdown(ctx context.Context) error
    GracefulShutdown(ctx context.Context) error
}
  • Активные драйверы (Telegram) — имеют фоновые процессы
  • Пассивные драйверы (S3) — no-op в методе Run

Disclaimer-маркеры

Уникальная особенность генератора — сохранение пользовательского кода при регенерации:

// ==========================================
// GENERATED CODE - DO NOT EDIT ABOVE THIS LINE
// ==========================================

func (h *Handler) CreateUser(ctx context.Context, req *CreateUserRequest) (*User, error) {
    // Ваш код здесь - переживёт регенерацию!
}

Следующие шаги