Сервис для создания и управления сокращёнными ссылками. Реализован на Go с поддержкой API для создания сокращённого URL и восстановления оригинальной ссылки. Также поддерживает работу через gRPC для улучшенной производительности. Поддерживает REST при помощи gRPC Gateway.
Данный сервис позволяет пользователям:
- Создавать сокращённые URL — отправляя оригинальную ссылку на сервер, сервис генерирует уникальную сокращённую ссылку.
- Получать оригинальные URL — по сокращённой ссылке можно запросить оригинальный URL.
Сервис использует PostgreSQL как основное хранилище данных, с возможностью выбора хранилища через параметр при запуске.
-
POST
/shorten
:- Принимает оригинальный URL и возвращает сокращённый.
- Пример полного запроса:
curl -v -X POST http://0.0.0.0:8080/shorten -d '"https://www.youtube.com/blablabla"'
- Пример ответа:
{"shortenedUrl":"NB6BK9BgKS"}
-
GET
/original/{shortenedURL}
:- Принимает сокращённую ссылку и возвращает оригинальный URL.
- Пример полного запроса:
curl -v -X GET http://0.0.0.0:8080/original/pPALr25NpY
- Пример ответа:
{"originalUrl":"https://finance.ozon.ru/blablabla"}
- Go — основной язык программирования.
- PostgreSQL — база данных для хранения оригинальных и сокращённых URL.
- gRPC (опционально) — для более производительного взаимодействия между сервисами.
- gRPC Gateway - для обработки REST-запросов
- Docker — для упаковки и распространения сервиса.
- Unit-тесты — покрытие тестами с использованием
Go testing
.
-
Клонируйте репозиторий:
git clone https://github.com/gremislaw/short_links_service.git cd short_links_service
-
Запустите:
make run
После этого сервис будет доступен по следующим портам:
- REST API — localhost:8080
- gRPC API — localhost:8081
- DB_HOST — хост для подключения к базе данных (по умолчанию
localhost
). - DB_PORT — порт для подключения к базе данных (по умолчанию
5432
). - DB_USER — имя пользователя для базы данных.
- DB_PASSWORD — пароль для базы данных.
- DB_NAME — имя базы данных.
- GRPC_ADDRESS — порт, по которому доступен gRPC API
- GATEWAY_ADDRESS — порт, по которому доступен REST API.
- STORAGE_TYPE — тип хранилища (по умолчанию
in_memory
, другой вариант -postgres
).
Docker Compose используется для поднятия всех сервисов:
docker-compose.yml
services:
postgres:
image: postgres:latest
restart: always
environment:
POSTGRES_USER: dazhy
POSTGRES_PASSWORD: dazhy
POSTGRES_DB: short_link
ports:
- "5432:5432"
volumes:
- db_data:/var/lib/postgresql/data
app:
build: .
container_name: short_links_service
restart: on-failure
depends_on:
- postgres
environment:
APP_IP: "0.0.0.0"
APP_PORT: "8081"
DB_HOST: "postgres"
DB_PORT: "5432"
DB_USER: "dazhy"
DB_PASSWORD: "dazhy"
DB_NAME: "short_link"
GRPC_ADDRESS: ":8081"
GATEWAY_ADDRESS: ":8080"
STORAGE_TYPE: "postgres"
ports:
- "8081:8081"
- "8080:8080"
volumes:
db_data:
Нагрузочный тест для этого сервиса: https://github.com/gremislaw/short_link_load_test/
Для тестирования сервиса используются unit-тесты. Чтобы запустить тесты, выполните:
go test ./...
Тесты покрывают следующие сценарии:
Создание уникальных сокращённых URL.
Разрешение сокращённых ссылок в оригинальные URL.
Работа с ошибками и валидность входных данных.
Проект состоит из слоев:
handler -> service -> repository
Репозиторий реализован по паттерну Стратегия
(in memory либо postgres)
Проект структурирован следующим образом:
├── api
│ └── grpc # Сгенерированный код
│ └── proto # Контракт сервиса (proto файл)
├── cmd
│ └── main.go # Главный файл
├── internal
│ ├── api # API
│ │ └── gateway # Реализация gRPC Gateway и запуск REST
│ │ └── server # Реализация gRPC сервера и запуск gRPC
│ ├── config # Работа с конфигурацией
│ ├── service # Логика сервиса
│ ├── repository # Работа с базой данных
│ └── util # Утилиты, включая генерацию коротких ссылок
│ └── db # Логика БД
│
├── Dockerfile
├── docker-compose.yml
├── README.md
└── go.mod
-
api — содержит все компоненты, связанные с gRPC:
- grpc — сгенерированный код для gRPC, который включает в себя все необходимые файлы для работы с gRPC-сервисами.
- proto — контракт сервиса, включая все
.proto
файлы, которые описывают структуру и методы gRPC-сервисов.
-
cmd — основная точка входа в приложение.
-
internal — основная логика приложения:
- api — компоненты, связанные с API сервиса:
- gateway — реализация gRPC Gateway, который предоставляет REST API поверх gRPC сервиса.
- server — реализация самого gRPC сервера, который обрабатывает запросы gRPC.
- config — обработка конфигурационных данных, включая чтение переменных окружения или конфигурационных файлов.
- service — логика сервиса, которая включает в себя создание и разрешение сокращённых ссылок.
- repository — взаимодействие с базой данных, включая логику работы с PostgreSQL.
- util — вспомогательные функции, такие как генерация уникальных коротких ссылок.
- db — работа с базой данных на уровне SQL запросов.
- api — компоненты, связанные с API сервиса:
Всё готово, чтобы сократить ваши URL! 🚀
Теперь вы можете наслаждаться сокращением ссылок, как профессионал. Сервис продуман до мелочей, настроен на отказоустойчивость и масштабируемость — так что даже если ваши ссылки станут очень длинными, сервис всегда будет с вами. 😎
И помните: "В мире нет ненужных ссылок, есть только слишком длинные URL". ✨
Как сказал бы любимый Ozon — "Скоро всё будет у вас в корзине". 🛒 Так что теперь все ссылки будут у вас в корзине, но только в более компактном виде! 😏
Желаю удачи в тестировании! 🚀