ワンクリックで
zenrpc
Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
API Health — проверка здоровья JSON-RPC сервиса через SMD. Используй когда нужно убедиться что RPC-endpoint жив, собрать тайминги методов или диагностировать недоступность API.
Appkit — библиотека vmkteam/appkit: метрики, pprof, HTTP client, service metadata, X-Request-ID. Используй при подключении метрик/pprof в сервис, работе с HTTP-клиентом appkit или добавлении корреляционных ID.
CI/CD — GitLab CI + Nomad deploy для Go-сервисов vmkteam. Используй при редактировании .gitlab-ci.yml, *.nomad.hcl, настройке пайплайна или дебаге деплоя.
Colgen — генератор коллекций для Go-структур. Используй при работе с collection.go и конвертерами между слоями.
Commit message — краткое сообщение коммита на английском из git diff. Используй перед `git commit`, после /solve, или при явной просьбе 'сгенерируй commit message'.
Cron — менеджер cron-задач с UI, middleware и Prometheus-метриками. Используй при добавлении/правке cron-задачи, подключении пакета vmkteam/cron или настройке CronConfig.
| name | zenrpc |
| description | Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов. |
zm)go generate (не reflection), SMD + OpenRPCecho.WrapHandler(rpc)), WebSocket, NATS (brokersrv)//go:generate go tool zenrpc
go.mod содержит tool github.com/vmkteam/zenrpc/v2/zenrpc. make generate — обязательно после любых изменений в API/моделях/аннотациях. Файлы *_zenrpc.go не редактировать.
Встраивание zenrpc.Service; VT-сервисы дополнительно встраивают embedlog.Logger:
type ReviewService struct {
rm *reviewer.ReviewManager
zenrpc.Service
}
type ProjectService struct {
zenrpc.Service
embedlog.Logger
projectRepo db.ProjectRepo
}
Сигнатура метода: func (Service) Method([ctx,] [args]) (<value>, <error>) — любой return опционален, value может быть pointer, error = error | *zenrpc.Error.
// GetByID returns review details.
//
//zenrpc:reviewId Review ID
//zenrpc:return Review
//zenrpc:500 Internal Error
//zenrpc:404 Not Found
func (s ReviewService) GetByID(ctx context.Context, reviewId int) (*Review, error) {
//zenrpc:<param> Description — описание параметра//zenrpc:<param>=<default> Description — default value//zenrpc:<httpCode> Description — код ошибки//zenrpc:return Description — описание возвратаRPC-слой использует zenrpc.NewStringError, для wrap — zenrpc.NewError:
var (
ErrInternal = zenrpc.NewStringError(http.StatusInternalServerError, "internal error")
ErrNotFound = zenrpc.NewStringError(http.StatusNotFound, "not found")
ErrBadRequest = zenrpc.NewStringError(http.StatusBadRequest, "bad request")
)
func newInternalError(err error) *zenrpc.Error {
return zenrpc.NewError(http.StatusInternalServerError, err)
}
VT-слой: хелпер httpAsRPCError(code int) *zenrpc.Error → ErrUnauthorized/Forbidden/NotFound/Internal.
//go:generate go tool zenrpc
func New(dbo db.DB, logger embedlog.Logger, isDevel bool) *zenrpc.Server {
rpc := zenrpc.NewServer(zenrpc.Options{ExposeSMD: true, AllowCORS: true})
rpc.Use(
zm.WithDevel(isDevel),
zm.WithHeaders(),
zm.WithSentry(zm.DefaultServerName),
zm.WithNoCancelContext(),
zm.WithMetrics(zm.DefaultServerName),
zm.WithTiming(isDevel, allowDebugFn()),
zm.WithSQLLogger(dbo.DB, isDevel, allowDebugFn(), allowDebugFn()),
zm.WithSLog(logger.Print, zm.DefaultServerName, nil),
zm.WithErrorSLog(logger.Error, zm.DefaultServerName, nil),
)
rpc.RegisterAll(map[string]zenrpc.Invoker{
"review": NewReviewService(dbo),
})
return rpc
}
zm)| MW | Назначение / gotcha |
|---|---|
WithDevel(isDevel) | dev-флаг в ctx |
WithHeaders() | UA(2048)/Platform(64)/Version(64)/X-Country(16) в ctx |
WithSentry(serverName) | scope: params, duration, IP, platform, version, method |
WithNoCancelContext() | обязателен для go-pg: подавляет ctx.Cancel |
WithMetrics(serverName) | app_rpc_error_requests_total, app_rpc_responses_duration_seconds — labels: method, code, platform, version, server |
WithTiming(isDevel, allowFn) | DurationLocal в response extensions (ms) |
WithSQLLogger(db, isDevel, allow1, allow2) | SQL/DurationSQL в extensions |
WithSLog(logger.Print, name, nil) | slog.InfoContext |
WithErrorSLog(logger.Error, name, nil) | code==500 или <0 → лог + Sentry |
WithAPILogger(printFn, name) | legacy Printf-style |
func authMiddleware(commonRepo *db.CommonRepo, logger embedlog.Logger) zenrpc.MiddlewareFunc {
return func(h zenrpc.InvokeFunc) zenrpc.InvokeFunc {
return func(ctx context.Context, method string, params json.RawMessage) zenrpc.Response {
ns := zenrpc.NamespaceFromContext(ctx)
if ns == NSAuth && method == RPC.AuthService.Login {
return h(ctx, method, params)
}
// проверка auth header...
return h(context.WithValue(ctx, userKey, dbu), method, params)
}
}
}
req, ok := zenrpc.RequestFromContext(ctx) // *http.Request
ns := zenrpc.NamespaceFromContext(ctx) // namespace
id := zenrpc.IDFromContext(ctx) // request id
*_zenrpc.go: Invoke() (роутинг), SMD, константы RPC.ServiceName.MethodName, парсинг params. Не редактировать вручную.
Стандартный набор на сущность: Count, Get, GetByID, Add, Update, Delete, Validate. Приватные хелперы: byID, dbSort, isValid.
Три типа моделей: Entity (полная), EntitySearch (фильтры + ToDB()), EntitySummary (для списков).
ViewOps{Page, PageSize (max 500), SortColumn, SortDesc} — пагинация/сортировка.
Валидация (только VT): Validator{fields []FieldError; err error}; теги validate:"required,max=255,status,alias".
Новый метод: аннотации → модели → make generate.
Новый CRUD VT-сервис: namespace-константа → модели (Entity/Search/Summary) → конвертеры (NewEntity, NewEntitySummary) → сервис (Count/Get/GetByID/Add/Update/Delete/Validate) → регистрация в server.go → make generate.