Сервис для хранения информации о товарах и управления их доступностью по gRPC.
- gRPC API: CRUD для товаров (Product).
- PostgreSQL +
pgxpoolс автоконфигурацией пула. - Chainable SQL builder (
internal/repo/builder) с плейсхолдерами$n. - Генерация protobuf: скрипт
./proto/make_proto.sh. - Логирование:
zap(консоль по умолчанию).
- Go 1.21+
- PostgreSQL
- protoc + плагины
protoc-gen-go,protoc-gen-go-grpc(для Regeneration protobuf) - Опционально:
grpcurl/evansдля ручного вызова gRPC
| Переменная | Описание | Обязательна | Пример |
|---|---|---|---|
DB_URL |
DSN PostgreSQL | да | postgres://user:pass@localhost:5432/inventory?sslmode=disable |
GRPC_ADDR |
Адрес gRPC-сервера | да | :50051 |
Пул соединений (pgxpool):
MaxConns=20,MinConns=2MaxConnLifetime=30m,HealthCheckPeriod=1m
go mod download
DB_URL=... GRPC_ADDR=:50051 go run ./cmd/servergo test ./...Файл: proto/inventory.proto
Сервис InventoryService:
ListProducts(ListRequest) returns (ListResponse)GetProduct(GetRequest) returns (GetResponse)CreateProduct(CreateRequest) returns (CreateResponse)UpdateProduct(UpdateRequest) returns (UpdateResponse)— частичное обновление черезFieldMaskDeleteProduct(DeleteRequest) returns (DeleteResponse)
Структура Product:
id, name, description, price, quantity, tags[], available, created_at, updated_at
# Health-check отсутствует; используем любой метод
grpcurl -plaintext -d '{}' localhost:50051 inventory.InventoryService.ListProducts
grpcurl -plaintext -d '{
"product": {
"name": "Ноутбук",
"description": "14\"",
"price": 79990,
"quantity": 10,
"tags": ["electronics", "laptop"],
"available": true
}
}' localhost:50051 inventory.InventoryService.CreateProductListRequest.filter: строка, используется в условииtags @> ARRAY[?]::text[]ListRequest.order_by: поддерживаютсяprice,price DESC|ASC,created_at,created_at DESC|ASC- Пагинация:
prev_size(offset),page_size(limit)
cmd/server/main.go # входная точка, gRPC server, init logger + DB
internal/logger # zap-конфиг с ротацией (опционально)
internal/repo/builder # SQL builder (SELECT/INSERT/UPDATE/DELETE)
internal/repo # доступ к БД (products)
internal/services # бизнес-логика (ProductService)
internal/rpc # gRPC handlers
proto/ # protobuf схемы и сгенерированные go-файлы
Сгенерировать заново (из корня проекта):
chmod +x proto/make_proto.sh
./proto/make_proto.sh- Используйте
?в where/set, билдер сам пронумерует как$1, $2, .... - Документация и примеры:
internal/repo/builder/README.md.
По умолчанию: уровень debug, формат console, вывод в stdout (cmd/server/main.go). При необходимости настройте internal/logger.Config (JSON, ротация, файлы).
- [] Добавить health-check endpoint/метод.
- [] Добавить пример docker-compose и миграций под PostgreSQL.
- [] Описать схемы БД (DDL) и реальный фильтр по тегам.
- [] Добавить секцию об авторизации/ACL (если потребуется).
- [] Добавить тесты.