Тестовое задание для собеседования в Renta Team
- Подготовка проекта
- Поднимите PostgreSQL
Например в докере:
docker run --name postgres -d -p 5432:5432 -e POSTGRES_PASSWORD=<password> --restart=always postgres:alpine
- Создайте
config.yaml
в корневой папке проекта по примеруconfig.example.yaml
!
- Миграции
go run main.go migrate
- Сервер
go run main.go run
- Создать новый пост: [POST]
http://localhost:3010/api/v1/posts
Пример тела запроса:
{
"header": "First post in my blog",
"body": "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet",
"tags": ["interviews", "golang"]
}
- Получить список постов: [GET]
http://localhost:3010/api/v1/posts
- Создать новый пост:
api.ApiService.CreatePost
- Получить список постов:
api.ApiService.ListPosts
Название | Описание | Путь |
---|---|---|
Config | Модуль с Viper конфигом | modules/config |
Logger | Модуль с логгером, основан на Logrus | modules/logger |
Database | Модуль для работы с PostgreSQL | modules/database |
GRPC | Модуль с gRPC сервером | modules/server/grpc |
HTTP | Модуль с HTTP сервером | modules/server/http |
Controllers | Контроллеры для GRPC сервера | modules/server/grpc/controllers |
- protoc-gen-gorm - генерация gORM структур на основании прото-структур;
- protoc-gen-validate - генерация валидаторов на основании параметров полей, указанных в прото;
- grpc-gateway - генерация gRPC сервера и клиента на основании прото структур, реализация http -> grpc прокси;
- uber/prototool - удобная обертка на protoc для генерации из прото файликов с конфигами в yaml формате (по ссылке мой форк с маленькими изменениями для поддержки arm64 архитектуры процессоров для работы на Маках с m1)
- uber-go/fx - удобная библиотека для реализации dependency injection;
- logrus - логирование;
- viper - конфиг системы (сам конфиг в
config.yaml
); - gORM - ORM для SQL БД;
- cobra - создание cli
- Сильно хотелось показать, как можно быстро написать одновременно и grpc и http api, однако в этом способе есть минус - своего рода проксирование. В GRPC-Gateway создается http сервер, под капотом которого grpc клиент, то есть получается такой локальный запрос на grpc сервер. Отсюда следует бóльшая задержка и меньшая производительность;
- Второй минус, вытекающий отсюда, статус коды после проксирования. Правильно на успешный post запрос возвращать 201 Created, но по дефолту grpc-gateway мапит все grpc.OK на 200;
- По коду - в идеале все покрыть тестами, в т.ч. мокать базу данных и тестировать методы обращения к ней, для модульных тестов можно было бы очень удобно использовать fxtest;
- Можно было бы подумать над уровнем изоляции в транзакции при создании постов с тегами, возможно, есть смысл настроить что-то помимо дефолтного
Read committed
;