Skip to content

W-y-l-t/CurrencyApi

Repository files navigation

CurrencyApi

CurrencyApi — это pet-проект, реализующий систему для отслеживания курсов валют с использованием внешнего сервиса CurrencyApi.com.

Проект состоит из двух API-приложений (PublicApi и InternalApi), которые взаимодействуют через gRPC и REST-интерфейсы, используют PostgreSQL для хранения данных, имеют полноценное логирование через Audit.Net и поддерживают контейнеризацию с помощью Docker.

Основные функции

  • Получение текущего и исторического курса валют.
  • Управление избранными валютными парами.
  • Автоматическое кеширование запросов с использованием PostgreSQL.
  • Мониторинг количества доступных запросов к внешнему API.
  • Поддержка конфигурации и настройки приложения через файлы конфигурации.
  • Документирование API с помощью Swagger.
  • Реализация gRPC для межсервисного взаимодействия.
  • Обработка ошибок с использованием глобальных фильтров исключений.

Стек технологий

  • .NET 9 – платформа для разработки backend-приложений
  • ASP.NET Core – минималистичный и высокопроизводительный фреймворк для разработки веб-приложений
  • PostgreSQL – реляционная база данных для хранения и кеширования данных
  • Entity Framework Core – ORM для работы с базой данных
  • gRPC – высокопроизводительный RPC-фреймворк для взаимодействия сервисов
  • Swashbuckle (Swagger) – генерация документации для REST API
  • Serilog – логирование и аудит приложений
  • Audit.Net – детализированное логирование запросов и ответов HTTP и gRPC
  • Polly – обработка ошибок и повторные попытки при сбоях
  • FluentValidation – валидация входных данных
  • AutoMapper – автоматическое маппирование между объектами
  • Docker и Docker Compose – контейнеризация и управление сервисами

Запуск проекта

Предварительные требования

  • Docker и Docker Compose
  • Регистрация на CurrencyApi.com для получения API-ключа

Запуск через Docker Compose

Создайте и заполните файл .env, используя шаблон из репозитория, затем выполните следующую команду:

docker compose -p internship -f docker-compose.yml up --build -d

После запуска доступны следующие сервисы:

  • PublicApi REST на порту, указанном в .env
  • InternalApi REST и gRPC на соответствующих портах из .env

Конфигурация

Настройки приложения находятся в файлах конфигурации (appsettings.json, appsettings.Development.json). API-ключ от CurrencyApi.com хранится в appsettings.Development.json.

Документация

Swagger доступен после запуска приложения:

  • PublicApi: http://localhost:{PublicApiPort}/swagger
  • InternalApi: http://localhost:{InternalApiRestPort}/swagger

Проект имеет глобальный обработчик исключений, детальнее со всеми кодами возврата можно ознакомиться в сгенерированной документации.

Логирование

Используется библиотека Audit.Net для логирования запросов и ответов:

  • HTTP-запросы к внешнему API (логирование реализовано в middlewares).
  • Входящие запросы к PublicApi и InternalApi.
  • Запросы через gRPC (логирование реализовано в interceptors).

Организация кеширования:

Проект реализует продвинутую систему кеширования на основе PostgreSQL для минимизации вызовов внешнего API (ограничение 300 запросов/месяц):

Кеш хранится в таблицах БД и управляется сервисом, реализующим интерфейс ICachedCurrencyAPI.

Кеш актуальных курсов обновляется раз в 2 часа. Если запрос поступает раньше, данные берутся из БД.

Для исторических данных кеш формируется по дате, и последующие вызовы за ту же дату используют сохранённые данные.

Алгоритм пересчёта курсов валют:

Кеш всегда хранится относительно фиксированной базовой валюты (USD). Запрос курса любой пары валют пересчитывается по следующему алгоритму:

Запрос: RUB относительно EUR.
Кеш: базовая валюта USD.
Алгоритм:
  1. Берём курс RUB/USD из кеша.
  2. Если базовая валюта запроса не USD (в данном случае EUR), то дополнительно берём курс EUR/USD из кеша.
  3. Пересчитываем курс: RUB/EUR = (RUB/USD) ÷ (EUR/USD).

About

Api for getting currency rates

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published