An open API service indexing awesome lists of open source software.

https://github.com/govorov1705/go-commerce

Интернет-магазин, реализованный с использованием микросервисной архитектуры на языке Go.
https://github.com/govorov1705/go-commerce

docker-compose go kafka microservices postgresql

Last synced: about 2 months ago
JSON representation

Интернет-магазин, реализованный с использованием микросервисной архитектуры на языке Go.

Awesome Lists containing this project

README

          

# 🛒 Go-commerce

Go-commerce - это интернет-магазин, реализованный с использованием микросервисной архитектуры на языке Go.

В проекте использовались многие из лучших практик разработки микросервисов:

- Слоистая архитектура
- Отдельная база данных под каждый микросервис
- Безопасные распределенные транзакции с помощью SAGA
- Основная коммуникация между микросервисами происходит с помощью gRPC
- Для асинхронной коммуникации используется Apache Kafka
- Настроен client-side gRPC балансировщик нагрузки для будущего использования с несколькими инстансами каждого микросервиса
- Использование интерфейсов для тестируемости и легкой замены зависимостей (хранилище, платежный провайдер)

В сумме, данные решения помогают ориентировать систему на масштабируемость, удобство разработки и высокие нагрузки.

## 🚀 Функционал

- Создание пользователя и получение JWT
- Просмотр доступных товаров (списком или конкретных)
- Добавление товаров в корзину
- Удаление товаров из корзины
- Просмотр информации по корзине
- Создание заказа
- Оплата заказа через платежного провайдера (ЮKassa)
- Просмотр информации по заказу
- Возможность добавления новых товаров (только для пользователей с ролью "admin")

## 🛠️ Технологии

- **Язык программирования**: Go 1.24.0
- **API**: gRPC + REST (через Gateway)
- **Хранение данных**: PostgreSQL 17.2
- **Оркестрация**: Docker Compose
- **События**: Apache Kafka
- **Аутентификация**: JWT
- **Документация**: Swagger

## 📖 Инструкция по запуску проекта

Склонируйте проект:

```sh
$ git clone https://github.com/Govorov1705/go-commerce.git
```

Перейдите в папку с проектом:

```sh
$ cd go-commerce
```

Для запуска проекта необходимо зарегистрироваться в системе провайдера платежей ЮKassa (данный провайдер используется в проекте). Для регистрации, перейдите по данной ссылке и следуйте указаниям: https://yookassa.ru/joinups?createTestShop=true

На данном этапе необходимо выбрать опцию "**К тестированию платежей**":

![Screenshot](images/1.png)

Когда откроется страница личного кабинета, скопируйте ID вашего тестового магазина:

![Screenshot](images/2.png)

Данный ID необходимо вставить в переменную _YOOKASSA_STORE_ID_ в файле _.env_, который находится по пути _./payments/.env_ относительно корня проекта.

Далее вам нужно вернуться в личный кабинет провайдера платежей, открыть вкладку "**Интеграция**" и перейти на страницу "**Ключи API**":

![Screenshot](images/3.png)

На открытой странице вам необходимо скопировать ваш "**Секретный ключ**":

![Screenshot](images/4.png)

Скопированный ключ необходимо вставить в переменную _YOOKASSA_SECRET_KEY_, из того же файла _.env_, который находится по пути _./payments/.env_ относительно корня проекта.

Для того, чтобы работал webhook от провайдера платежей (он отвечает за обработку обновления статусов платежей - платеж прошел / отменен), необходимо, чтобы сервер, на котором находился обработчик этого webhook'а работал по протоколу HTTPS. В локальной среде достичь этого можно с использованием [Ngrok](https://ngrok.com/). К сожалению, для доступа к данному сервису необходимо иметь VPN.

После регистрации в **Ngrok**, заходите в dashboard, выбирайте пункт "**Setup & Installation**":

![Screenshot](images/5.png)

Сверху страницы выбираете вашу платформу, а затем просто следуете инструкциям из пункта "**Connect**" до команды с запуском утилиты:

![Screenshot](images/6.png)

Теперь вы можете запустить утилиту следующим образом (порт 8087 выбран не случайно - такой порт выбран в docker-compose-файле проекта для сервера, который будет обрабатывать webhook платежного провайдера):

```sh
$ ngrok http http://localhost:8087
```

После запуска утилиты, в терминале вы увидите URL, который будет доступен извне вашей локальной сети:

![Screenshot](images/7.png)

Данный URL необходимо скопировать, вернуться в личный кабинет платежного провайдера, перейти во вкладку "**Интеграция**", на страницу "**HTTP-уведомления**":

![Screenshot](images/8.png)

На открывшейся странице нужно нажать кнопку "**Изменить настройки**", вставить скопированный из предыдущего шага URL в поле "**Ссылка**", добавив в конце строки "/webhook":

![Screenshot](images/9.png)

Также в меню "**Выбранные события**" нужно оставить галочки только на пунктах "**payment.succeeded**" и "**payment.canceled**" - остальные события мой проект не обрабатывает:

![Screenshot](images/10.png)

После выполненных действий можно нажать "**Сохранить**"

На данном этапе проект полностью готов к запуску. Находясь в корневой папке проекта, выполните следующую команду для запуска:

```sh
$ docker compose up
```

После того, как все микросервисы успешно запустятся, вам будет доступна интерактивная веб-документация [тут](http://localhost:8080/api/swagger/index.html#/)

## 🧑‍💻 Работа с проектом

Все client-side endpoint'ы доступны в интерактивной документации.

Для доступа к endpoint'ам, требующим аутентификацию, необходимо получить JWT.

Чтобы получить JWT, необходимо отправить запрос на _/api/auth_ с данными в виде имени пользователя и пароля. Если такого аккаунта еще не было создано - он создастся, а вы получите уникальный JWT, который нужно скопировать.

Чтобы прикрепить данный токен к вашей сессии, необходимо нажать зеленую кнопку "**Authorize**" в правом верхнем углу экрана, и ввести в поле "**Value**" строку в следующем формате: Bearer \<ваш JWT>, а после чего, снова нажать "**Authorize**".

С данного момента вы можете полноценно пользоваться всеми функциями проекта, кроме создания новых продуктов (admin-only).