2025-07-10 01:12:17 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:12:17 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:10:47 +07:00
2025-07-10 01:01:29 +07:00

Yobble Gateway (Go)

О проекте

Это высокопроизводительный API-шлюз, написанный на Go. Он служит единой точкой входа для всех клиентских запросов и направляет их в соответствующие микросервисы.

Основные возможности

  • Динамическая маршрутизация: Маршруты определяются в файле configs/routes.json и могут быть легко изменены без перезапуска шлюза.
  • Балансировка нагрузки: Простая балансировка нагрузки (в настоящее время случайный выбор) между несколькими экземплярами сервиса.
  • SSL/TLS Termination: Шлюз обрабатывает HTTPS-запросы, снимая нагрузку по шифрованию с внутренних сервисов.
  • Фильтрация по GeoIP: Возможность блокировать запросы из определенных стран.
  • Конфигурация через переменные окружения: Удобная настройка для различных сред (разработка, продакшн).
  • Логирование: Структурированное логирование с использованием slog.
  • Graceful Shutdown: Корректное завершение работы приложения, позволяющее завершить обработку текущих запросов.

Технологический стек

  • Go (Golang)
  • Gorilla Mux для маршрутизации
  • maxmind/geoip2-golang для GeoIP
  • YAML и JSON для конфигурации
  • Docker для контейнеризации

Структура проекта

.
├── cmd/gateway/main.go      # Точка входа в приложение
├── configs/                   # Файлы конфигурации
│   ├── config.yml             # Основной файл конфигурации
│   └── routes.json            # Файл с маршрутами
├── internal/                  # Внутренняя логика приложения
│   ├── config/                # Работа с конфигурацией
│   ├── logger/                # Логирование
│   ├── middleware/            # Промежуточное ПО (например, для получения Real IP)
│   ├── proxy/                 # Логика проксирования и маршрутизации
│   └── server/                # Настройка и запуск HTTP-сервера
├── pkg/                       # Пакеты, которые могут быть использованы в других проектах
│   └── geoip/                 # Работа с GeoIP
├── geodb/                     # База данных GeoIP
├── SSL/                       # SSL-сертификаты
├── .env.example               # Пример файла с переменными окружения
├── Dockerfile                 # Файл для сборки Docker-образа
└── go.mod                     # Зависимости проекта

Быстрый старт

1. Клонирование репозитория

git clone <URL репозитория>
cd yobbly-gateway-go

2. Конфигурация

Скопируйте файл с примером переменных окружения:

cp .env.example .env

Отредактируйте .env и configs/config.yml при необходимости.

3. Запуск с помощью Docker

Для сборки и запуска приложения в Docker-контейнере выполните:

docker-compose up --build

4. Локальный запуск (без Docker)

а) Установка зависимостей

go mod tidy

б) Запуск приложения

go run cmd/gateway/main.go --config=configs/config.yml

Конфигурация

Основная конфигурация (config.yml)

  • server: Настройки хоста и порта сервера.
  • gateway: Настройки шлюза, включая путь к файлу с маршрутами и базу GeoIP.
  • tls: Пути к SSL-сертификатам.
  • logging: Уровень и формат логирования.

Переменные окружения (.env)

Переменные окружения, определенные в .env, переопределяют значения по умолчанию в config.yml.

Маршрутизация (routes.json)

Файл routes.json определяет, как шлюз будет перенаправлять запросы.

Пример:

{
  "v1": {
    "/auth": [
      {
        "url": "https://auth-service:5201",
        "role": "master",
        "allow_self_signed": true
      }
    ]
  },
  "default": {
    "/docs": [
      {
        "url": "https://docs-service:5199",
        "role": "slave",
        "allow_self_signed": true
      }
    ]
  }
}
  • Ключи верхнего уровня (v1, default) - это версии API. Запросы, начинающиеся с /v1/..., будут сопоставляться с маршрутами в секции "v1". Если версия не указана, используется секция "default".
  • Ключи второго уровня (/auth, /docs) - это префиксы путей. Шлюз ищет наиболее длинное совпадение префикса.
  • url - URL внутреннего сервиса.
  • allow_self_signed - Разрешает использование самоподписанных сертификатов для внутреннего сервиса.

GeoIP Фильтрация

Шлюз может блокировать доступ для стран, перечисленных в blocked_countries в файле config.yml. Для работы этой функции необходима база данных GeoLite2-Country.mmdb от MaxMind.

Description
No description provided
Readme 4.6 MiB
Languages
Go 97.7%
Dockerfile 2.3%