Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
Казначей - система для хранения секретов, которые можно сжечь после прочтения
- Host: GitHub
- URL: https://github.com/vodolaz095/purser
- Owner: vodolaz095
- Created: 2023-10-07T08:53:10.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2023-10-19T21:10:45.000Z (about 1 year ago)
- Last Synced: 2024-06-19T23:09:08.902Z (5 months ago)
- Topics: clean-architecture, example, grpc-server, mysql, postgresql, redis, sql, swagger
- Language: Go
- Homepage:
- Size: 273 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
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`