【问题标题】:How to make a variable available to all gRPC request handlers on a gRPC server?如何使变量可用于 gRPC 服务器上的所有 gRPC 请求处理程序?
【发布时间】:2023-03-12 03:45:01
【问题描述】:

我正在像这样启动我的 gRPC 服务器:

func Run(...) ... {
    // this is variable I want to add to all my request handler's context
    foo := "bar"

    grpcServer := grpc.NewServer()
    grpc_health_v1.RegisterHealthServer(grpcServer, health.NewServer())
    pb.RegisterMyServer(grpcServer, newServer())
    signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT)

    go func() {
        if err := grpcServer.Serve(lis); err != nil {
            errChan <- err
        }
    }()

    return grpcServer, nil
}

以下是“ping”请求的处理程序示例:

func (s *myServer) Ping(
    ctx context.Context,
    pingRequest *pb.PingRequest,
) (*pb.PingResponse, error) {
    return &pb.PingResponse{}, nil
}

您可以在Run() 中看到我有一个变量foo,我希望我的所有请求处理程序都可以使用它。这个变量不依赖于客户端的请求,它只需要在请求处理程序中可用。

实现这一目标的最佳方法是什么?

  • 使用单例
  • 使用全局
  • 以某种方式将其添加到 gRPC 请求上下文中?

【问题讨论】:

  • 将其用作 myServer 中的属性字段
  • @nipuna 你能分享一个例子吗?在这种情况下,MyServer 是由 protoc 生成的,所以不确定我将如何在 .proto 中定义它

标签: go grpc


【解决方案1】:

将您的自定义实现用于 GRPC 服务器。

type GrpcServer struct {
    Foo string
}

func (g *GrpcServer) Ping(ctx context.Context, pingRequest *pb.PingRequest, ) (*pb.PingResponse, error) {
    fmt.Println(g.Foo)
    return &pb.PingResponse{}, nil
}

并注册您自定义的 grpc 服务器实现。

func Run() {
    
    foo := "bar"

    grpcServer := grpc.NewServer()
    grpc_health_v1.RegisterHealthServer(grpcServer, health.NewServer())
    pb.RegisterMyServer(grpcServer, &GrpcServer{Foo: foo})
    signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT)

    go func() {
        if err := grpcServer.Serve(lis); err != nil {
            errChan <- err
        }
    }()

    return grpcServer, nil
}

【讨论】:

  • 那么MyServer 结构呢?不是需要吗?我还将MyServer 嵌入到GrcpServer
  • 不需要。实现这个并测试代码以确保
  • 不,我的意思是他向我们展示的代码不是真正的实现。如果在处理请求时需要来自MyServer 的某些字段怎么办?
  • 然后也注入它。我不知道你的newServer 函数。所以做必要的事情
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 2018-01-09
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多