- Создать .env файл в ./internal/config (ниже пример)
- Запуск контейнеров postgres и самого приложения
docker compose --env-file ./internal/config/.env up -d
- При первом запуске подключить миграции: migrate -path ./schema -database "postgres://yks:yksadm@localhost:5432/postgres?sslmode=disable" up
Для комфортной работы со всеми методами API можно воспользоваться моей коллекцией запросов в Postman
- Создание кошелька
curl --location --request POST 'http://localhost:8080/api/v1/wallet'
- Проверка баланса
curl --location 'http://localhost:8080/api/v1/wallet/91d13152-84ff-41e8-bca7-e842285a7b1b'
- Перевод на другой кошелёк
curl --location 'http://localhost:8080/api/v1/wallet/91d13152-84ff-41e8-bca7-e842285a7b1b/send' \
--header 'Content-Type: application/json' \
--data '{
"to": "5874f384-4e1f-456c-8d61-6ecaa7e929e0",
"amount": 150
}'
- История переводов
curl --location 'http://localhost:8080/api/v1/wallet/91d13152-84ff-41e8-bca7-e842285a7b1b/history'
Данный сервис обрабатывает поступающие транзакции на ранее созданные кошельки.
- Создание кошелька
- Получение баланса по id
- Перевод средств с кошелька на другой кошелёк
- Получение истории переводов
Для безопасного обращения к базе данных вставка аргументов в SQL запросы происходит путём внедрения специальных символов $1, $2 и тд. Это позволяет с помощью внутренних алгоритмов SQLX уберечь данные от SQL-инъекций
Для того, чтоб не терялись данные при перезапуске сервера, реализован процесс Graceful Shutdown или же Плавное выключение. Когда сервер принимает сигнал от OS о его выключении, сервер сразу не перестает работать а выключается по такому алгоритму:
- Прекращается получение входящих http запросов
- Обработка всех полученных ранее запросов
- После отработки последнего запроса закрытие всех подключений к базе данных
- Выключение сервера
Для запуска всего сервера в контейнерах был описан Dockerfile для описания образа в Docker.
С помощью docker-compose файла был описан основной ряд контейнеров, которые нужно запустить.
Интересная деталь: для решения проблемы, когда сервер запускается, не дождиаясь инициализации PostgreSQL,
я реализовал запуск контейнера с сервером с условием: во время запуска с определенным интервалом проверяется, когда начинает работать база данных.
Только после успешного запуска БД запустится контейнер с сервером.
За время разработки сервиса я активно использовал Git для отслеживания изменений в проекте.
Также по завершении работы проект был выложен на GitHub
- Golang 1.21
- PostgreSQL
- Docker
- Postman
- Golang-migrate
- Viper
- Gorilla/mux
- SQLX
Файл .env находится в директории .internal\config\
PORT=8080
POSTGRES_USER=yks
POSTGRES_PASSWORD=yksadm
POSTGRES_PORT=5432
POSTGRES_DBNAME=postgres
POSTGRES_DSN="host=postgres_db port=5432 user=yks password=yksadm dbname=postgres sslmode=disable connect_timeout=5"