1c/Ox
1
0
mirror of https://github.com/LazarenkoA/Ox.git synced 2025-11-23 21:33:13 +02:00
Files
Ox/worker/grpc/server.go

47 lines
1.4 KiB
Go
Raw Normal View History

2025-10-30 15:51:56 +03:00
package grpc
import (
"context"
"fmt"
grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery"
"google.golang.org/grpc"
2025-11-04 18:58:12 +03:00
"load_testing/worker/internal/utils"
2025-10-30 15:51:56 +03:00
"load_testing/worker/proto/gen"
2025-11-04 18:58:12 +03:00
"log/slog"
2025-10-30 15:51:56 +03:00
"net"
)
func NewGRPCServer(ctx context.Context, port int, worker gen.WorkerServer) error {
listener, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) // :0 для случайного порта
if err != nil {
return err
}
actualAddr := listener.Addr().String() // ip:port
2025-11-04 18:58:12 +03:00
logger := utils.Logger().With("name", "grpc")
srv := grpc.NewServer(grpc.ChainUnaryInterceptor(logInterceptor(logger)), grpc.ChainStreamInterceptor(grpc_recovery.StreamServerInterceptor()))
2025-10-30 15:51:56 +03:00
gen.RegisterWorkerServer(srv, worker)
go func() {
<-ctx.Done()
srv.Stop()
}()
2025-11-04 18:58:12 +03:00
logger.InfoContext(ctx, fmt.Sprintf("сервер запущен на %s", actualAddr))
2025-10-30 15:51:56 +03:00
return srv.Serve(listener)
}
2025-11-04 18:58:12 +03:00
func logInterceptor(logger *slog.Logger) func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
return func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
_, err = handler(ctx, req)
if err != nil {
logger.ErrorContext(ctx, "grpc error", "error", err)
} else {
logger.InfoContext(ctx, fmt.Sprintf("grpc method %s", info.FullMethod))
}
return
}
}