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-ключа
Создайте и заполните файл .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).