Add README.md
This commit is contained in:
parent
ff24a023d4
commit
ae52ecabe8
138
README.md
Normal file
138
README.md
Normal 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.
|
Loading…
x
Reference in New Issue
Block a user