spring-boot - dzone - que es feign
Reenviar un encabezado de solicitud con un cliente de Feign RequestInterceptor (1)
Me gustaría reenviar un encabezado de solicitud con un cliente de solicitud de RequestInterceptor pero, dentro de RequestInterceptor.apply
, RequestContextHolder.getRequestAttributes()
es null
, también lo es SecurityContextHolder.getContext().getAuthentication()
(donde también podría eventualmente obtener el valor de mi encabezamiento).
Esto solía funcionar antes de actualizar a Spring-Cloud Brixton, donde los comandos de hystrix ahora probablemente se deben ejecutar en un subproceso separado, ya que al cambiar al siguiente parámetro se resuelve el problema:
hystrix.command.default.execution.isolation.strategy: SEMAPHORE
Ahora, no estoy muy interesado en cambiar este tipo de valores predeterminados si no es necesario, ¿hay alguna otra manera recomendada de reenviar encabezados ahora?
Gracias
OK, hay una manera de hacer esto ... muchas gracias a Spring Cloud Sleuth por la inspiración.
"Todo" lo que tienes que hacer es implementar una HystrixConcurrencyStrategy
que pase la información a lo largo de cada vez que haya un cambio de hilo. La clase que hace algo muy similar en Sleuth está aquí .
Para mi caso específico, yo:
-
Callable
elCallable
enwrapCallable
con, por ejemplo, una claseCallableWithAuthentication
que contendría la autenticación actual cuandoCallableWithAuthentication
construida - El método de
call
CallableWithAuthentication
restaurará primero laAuthentication
previamente guardada, luego llamará a la acción original y luego limpiará laAuthentication
actual, et voilà.
Una vez que su HystrixConcurrencyStrategy
su solicitud, el interceptor volverá a funcionar, incluso con el aislamiento de subprocesos.
Observe que en el resto del proyecto hay muchas otras cosas interesantes para instrumentos (para RxJava, por ejemplo).