Spring Boot 为每个请求将HTTP标头转码为Grpc元数据

jm81lzqq  于 2022-11-05  发布在  Spring
关注(0)|答案(1)|浏览(295)

我正在构建一个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客户端调用元数据?谢谢。

aurhwmvo

aurhwmvo1#

ClientInterceptor似乎合适.拦截通道,请参阅实用程序函数:https://grpc.github.io/grpc-java/javadoc/io/grpc/ClientInterceptors.html#intercept-io.grpc.Channel-io.grpc.ClientInterceptor...-

相关问题