Ecosyste.ms: Awesome

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

Awesome Lists | Featured Topics | Projects

https://github.com/vodolaz095/purser

Казначей - система для хранения секретов, которые можно сжечь после прочтения
https://github.com/vodolaz095/purser

clean-architecture example grpc-server mysql postgresql redis sql swagger

Last synced: about 4 hours ago
JSON representation

Казначей - система для хранения секретов, которые можно сжечь после прочтения

Awesome Lists containing this project

README

        

# purser
Казначей - система для хранения секретов, которые можно сжечь после прочтения.
Практической пользы не несёт, но на её основе можно объяснить,
как компоновать микросервис систему на Go.

Постановка задачи
=============================

1. Создать микросервис, который реализует 3 метода
- Создать некую запись в базе данных
- Получить запись по первичному ключу
- Удалить запись по первичному ключу
2. Использовать чистую архитектуру
3. Для сохранения данных используется паттерн репозитория и несколько реализаций (sql, nosql и т.д.)
4. На транспортном уровне использовать HTTP и GRPC (использовать кодогенерацию по готовым описаниям сервиса)
5. Реализовать логгирование
6. Реализовать трейсинг с использованием OpenTelemetry
7. Всё можно запустить локально с помощью docker compose

Структура проекта
==============================
Бизнес логика реализована в `internal/service`.
Есть 2 сервиса - CRUD для секретов и счётчики для метрик.
CRUD для секретов работает с репозиторием секретов (`internal/service/repository/`), который абстрагирует
все взаимодействия с базой данных внутри. Есть несколько реализаций репозитория - `memory`,`redis`,`mysql`,`postgresql`.
Все репозитории должны реализовывать интерфейс `internal/service/repository/SecretRepo`.
И интерфейс `internal/service/repository/SecretRepo` используется сервисом `internal/service/SecretService` в работе.
На транспортном уровне в `internal/transport` реализованы несколько транспортов, дёргающих методы сервиса.
Это [grpc](internal%2Ftransport%2Fgrpc), [http](internal%2Ftransport%2Fhttp),
[prune](internal%2Ftransport%2Fprune) (очистка старых записей по таймеру),
[watchdog](internal%2Ftransport%2Fwatchdog) (проверка работоспособности сервиса с помощью systemd watchdog).
Транспортный уровень вызывает методы сервиса, а сервис сделан так, чтобы его методы можно было вызвать из разных контекстов,
и при этом оно сохраняло бы работоспособность.

Как запустить?
==============================

1. Сделать файл `.env` по аналогии с `env.example` - название ключей окружения можно посмотреть в файле `config/config.go`
2. Выбрать нужную базу данных - mysql, redis, postgresql.
3. Запустить сервис с помощью `docker compose up`
4. На http://localhost:3000/ будет слушать HTTP сервер
5. На http://localhost:3001/ будет слушать GRPC сервер
6. Запустите клиенты для генерации секретов

```shell

make cli_curl
make cli_grpc
make cli_http_client

```

7. JWT токен можно сгенерировать тут - https://jwt.io/. Алгоритм - HS512, "sub" - любая строка, секрет по умолчанию -
`super_secret_for_purser`