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