Add README.md

This commit is contained in:
AndreyIgorevich 2025-07-10 01:01:29 +07:00
parent ff24a023d4
commit ae52ecabe8

138
README.md Normal file
View File

@ -0,0 +1,138 @@
# 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. Клонирование репозитория
```bash
git clone <URL репозитория>
cd yobbly-gateway-go
```
### 2. Конфигурация
Скопируйте файл с примером переменных окружения:
```bash
cp .env.example .env
```
Отредактируйте `.env` и `configs/config.yml` при необходимости.
### 3. Запуск с помощью Docker
Для сборки и запуска приложения в Docker-контейнере выполните:
```bash
docker-compose up --build
```
### 4. Локальный запуск (без Docker)
#### а) Установка зависимостей
```bash
go mod tidy
```
#### б) Запуск приложения
```bash
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` определяет, как шлюз будет перенаправлять запросы.
**Пример:**
```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.