我正在构建一个API网关,它将HTTP流量代理到Grpc服务。所有传入的HTTP请求都可以在Authorization头中包含JWT。我需要在每次请求时将此JWT转码为Grpc元数据,并将其与Grpc请求一起发送。我正在使用grpc-kotlin库,其中包含grpc代码生成器,用于客户端存根的kotlin挂起函数。我编写了此WebFilter,以便将头放入ReactorContext:
@Component
class UserMetadataWebFilter : WebFilter {
override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
exchange.request.headers[HttpHeaders.AUTHORIZATION]?.firstOrNull()?.let { authorizationHeader ->
return chain.filter(exchange).contextWrite { Context.of("myHeader", authorizationHeader) }
}
return chain.filter(exchange)
}
}
它可以用在如下控制器方法中:
identityProviderClient.createUser(protobufRequest,
coroutineContext[ReactorContext]?.context?.get("myHeader") ?: Metadata())
我想创建Grpc客户端拦截器或其他东西来自动设置Grpc元数据从协程上下文。我有很多Grpc客户端调用,我认为这是写这个代码为每个调用是不好的做法。我知道envoy代理,但我需要应用特定的逻辑到我的请求,这就是为什么envoy代理不是我的选择。我应该如何转换Http头(s)到grpc客户端调用元数据?谢谢。
1条答案
按热度按时间aurhwmvo1#
ClientInterceptor似乎合适.拦截通道,请参阅实用程序函数:https://grpc.github.io/grpc-java/javadoc/io/grpc/ClientInterceptors.html#intercept-io.grpc.Channel-io.grpc.ClientInterceptor...-