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
Languages
Go
97.7%
Dockerfile
2.3%