GRPC Java将数据从服务器拦截器传递到rpc服务调用

特雷德

我们将Java GRPC用于内部服务之一,并且有一个服务器端拦截器,可用于从标头中获取信息并将其设置在内部使用ThreadLocal的日志记录上下文中。

因此,在拦截器中,我们执行以下操作:

LogMessageBuilder.setServiceName("some-service");

    final String someHeaderWeWant = headers.get(HEADER_KEY);

    final LoggerContext.Builder loggingContextBuilder = new LoggerContext.Builder()
        .someFieldFromHeaders(someHeaderWeWant);
LoggerContext.setContext(loggingContextBuilder.build());

然后,在我们的服务电话中,我们将像这样访问它:

LoggingContext loggingContext = LoggingContext.getCurrent()

但是,当前上下文有时会为空。

然后,我们尝试使用GRPC Context类,如下所示:

LogMessageBuilder.setServiceName("some-service");

        final String someHeaderWeWant = headers.get(HEADER_KEY);

        final LoggerContext.Builder loggingContextBuilder = new LoggerContext.Builder()
            .someFieldFromHeaders(someHeaderWeWant);
    Context.current().withValue(LOGGING_CONTEXT_KEY, loggingContextBuilder.build()).attach()

然后像在服务调用中那样访问它:

LoggingContext context = LOGGING_CONTEXT_KEY.get(Context.current())

但是有时也为空,并且如果我打印出内存地址,则无论我是否附加在拦截器中,上下文的早期似乎总是ROOT上下文,但是在几次调用之后,上下文是正确的,并且记录器数据在那里这应该。

因此,如果有人有任何想法或更好的方法将数据从拦截器传播到服务呼叫,我将很乐意听到它。

埃里克·安德森

可以在不同的线程上调用每个回调,因此必须为每个回调设置线程本地。看来您可能不小心将上下文用于其他RPC。

grpc-java 0.12.0应该在本周发布。上下文已部分集成到0.12.0中,并且我们还添加Contexts.interceptCall()了正是您所需要的内容:它为每个回调附加和分离上下文。

在0.12.0中,您现在应该看到为每个服务器调用(而不是ROOT)创建了新的上下文,以及从客户端调用传播到StreamObserver回调的上下文

另一个要注意的是,不同于ThreadLocal Context打算被严格限制:之后attach(),通常应该尝试到detach()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将数据从grpc rpc调用传递到Java中的服务器拦截器

如何将数据从gRPC拦截器传递到服务方法调用?

使用GRPC服务器拦截器验证请求

grpc状态未从服务器拦截器发送到客户端

飞镖Grpc的拦截器

Java gRPC服务器未启动

Java gRPC服务器流模型

可重试的 grpc-web 服务器流 rpc

拦截服务器和客户端中的gRPC C ++调用

将Java gRPC服务器绑定到Unix域套接字

grpc:服务器无法编码响应:rpc错误:代码=内部desc = grpc:编组时出错:原型:元帅以nil调用

异步拦截器(gRPC dart)

Python gRPC服务器未启动

gRPC cpp异步服务器与同步服务器

是否可以使用 grpc-java 编写服务器并使用 grpc-web 从浏览器调用它?

在Python服务器中读取gRPC元数据

GRPC 与 Ruby:如何从 GRPC 服务器调用应用程序中的 Ruby 方法?

带有 setReuseAddress(true) 的 gRPC Java 服务器?

JAVA中的GRPC服务器,支持海量请求

Google Cloud ESP将无效的压缩格式发布到gRPC服务器

我们可以可靠地将每个gRPC调用的结果记录到grpc-java服务器吗?

grpc服务器显示“未实现的服务错误”

cpp异步服务器中的gRPC多个服务

如何在gRPC拦截器中访问消息请求?

Python:在拦截器中读取grpc proto请求

C#中的Grpc中间件或拦截器

grpc-web 打字稿中的绑定拦截器

gRPC 中数据如何从客户端发送到(多服务)服务器

gRPC服务器如何通知客户端已取消服务器端流调用?