Skip to content

API по созданию сокращённых ссылок на Golang

Notifications You must be signed in to change notification settings

gremislaw/short_links_service

Repository files navigation

Short Links Service

Сервис для создания и управления сокращёнными ссылками. Реализован на Go с поддержкой API для создания сокращённого URL и восстановления оригинальной ссылки. Также поддерживает работу через gRPC для улучшенной производительности. Поддерживает REST при помощи gRPC Gateway.

Описание

Данный сервис позволяет пользователям:

  1. Создавать сокращённые URL — отправляя оригинальную ссылку на сервер, сервис генерирует уникальную сокращённую ссылку.
  2. Получать оригинальные 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.

Установка и запуск

Локальный запуск

  1. Клонируйте репозиторий:

    git clone https://github.com/gremislaw/short_links_service.git
    cd short_links_service
    
  2. Запустите:

    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

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 запросов.

Заключение

Всё готово, чтобы сократить ваши URL! 🚀

Теперь вы можете наслаждаться сокращением ссылок, как профессионал. Сервис продуман до мелочей, настроен на отказоустойчивость и масштабируемость — так что даже если ваши ссылки станут очень длинными, сервис всегда будет с вами. 😎

И помните: "В мире нет ненужных ссылок, есть только слишком длинные URL". ✨

Как сказал бы любимый Ozon — "Скоро всё будет у вас в корзине". 🛒 Так что теперь все ссылки будут у вас в корзине, но только в более компактном виде! 😏

Желаю удачи в тестировании! 🚀

About

API по созданию сокращённых ссылок на Golang

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published