Fingir es un cliente de servicio web declarativo. Facilita la escritura de clientes de servicios web. Para usar Fingir, cree una interfaz y anótela. Tiene soporte de anotación conectable que incluye anotaciones de Fingir y JAX-RS.
Spring Cloud agrega soporte para las anotaciones de Spring MVC y para usar los mismos HttpMessageConverters que se usan de forma predeterminada en Spring Web. Spring Cloud integra Ribbon y Eureka para proporcionar un cliente HTTP con equilibrio de carga cuando se usa Fingir. (https://cloud.spring.io)
Crear un cliente de Fingir en Spring Cloud es simple, todo lo que tiene que hacer es crear una interfaz y anotarla con @FeignClient .
Las solicitudes generadas por los clientes de Feign pueden tener configuraciones, por ejemplo, cómo codificar, decodificar e interceptar solicitudes.
Considere un cliente de Feign que debe usarse con diferentes configuraciones en diferentes lugares del código, o varios clientes de Feign que deben usarse con su propia configuración. Por ejemplo, el cliente A de Fingir debe configurarse con el decodificador A y el interceptor de solicitudes A y el cliente B de Fingir con el decodificador B y el interceptor B.
Un escenario posible es establecer diferentes enfoques de autenticación para diferentes clientes de Feign.
Supongamos que hay dos API Rest, una para obtener objetos "Bar" en el servidor Bar y otra para obtener objetos "Foo" en el servidor Foo. El problema es que esos servicios tienen diferentes enfoques de autenticación.
Tenemos dos clientes de Feign para dos servicios, FooClient y BarClient. Estos clientes de Fingir necesitan adoptar una configuración de autenticación diferente.
Aquí está la clase FooClient . El FeignClient tiene un fooContextId , un valor y una URL específica y está configurado en la clase FooConfig .
@FeignClient (contextId = "fooContextId" , value = "fooValue" , url = "http://foo-server.com/services" , configuration = FooConfig.class) public interface FooFeignClient { @GetMapping ( "{id}/foo" ) void getFoo (@PathVariable( "id" ) Long id) ; }
Y esta es la clase BarClient . Nuevamente, tiene su propio contextId , value , url y BarConfig específicos .
@FeignClient (contextId = "barContextId" , value = "barValue" , url = "http://bar-server.com/services" , configuration = BarConfig.class) public interface BarFeignClient { @GetMapping ( "{id}/bar" ) void getBar (@PathVariable( "id" ) Long id) ; }
BarConfig y FooConfig no deben anotarse con @Component ni con ninguna otra anotación de Spring Bean.
A continuación, debemos instanciar los beans BarRequestInterceptor y FooRequestInterceptor en estas clases de configuración.
public class BarConfig { @Bean public BarRequestInterceptor barRequestInterceptor () { return new BarRequestInterceptor(); } } public class FooConfig { @Bean public FooRequestInterceptor fooRequestInterceptor () { return new FooRequestInterceptor(); } }
Tanto las clases BarRequestInterceptor como FooRequestInterceptor implementan RequestInterceptor y deben anular el método apply para especificar sus propios enfoques de autenticación.
public class BarRequestInterceptor implements RequestInterceptor { private static final Logger LOGGER = LoggerFactory.getLogger(BarRequestInterceptor.class); @Override public void apply (RequestTemplate template) { template.header( "authorization" , "auth-bar" ); LOGGER.info( "bar authentication applied" ); } } public class FooRequestInterceptor implements RequestInterceptor { private static final Logger LOGGER = LoggerFactory.getLogger(FooRequestInterceptor.class); @Override public void apply (RequestTemplate template) { template.header( "authorization" , "auth-foo" ); LOGGER.info( "foo authentication applied" ); } }
Finalmente, cree un método para llamar a estos clientes de Fingir:
@RestController public class HomeController { private static final Logger LOGGER = LoggerFactory.getLogger(HomeController.class); @Autowired private FooFeignClient fooFeignClient; @Autowired private BarFeignClient barFeignClient; @GetMapping ( "test" ) public void home () { try { LOGGER.info( "calling getFoo" ); fooFeignClient.getFoo( 100L ); } catch (Exception e) { } try { LOGGER.info( "calling getBar" ); barFeignClient.getBar( 100L ); } catch (Exception e) { } } }
Si ejecutamos la aplicación y llamamos al controlador de inicio, primero se invocará el método "getFoo" de FooClient con FooConfiguration y luego el método "bar" de BarClient con BarConfiguration . Este es el registro de salida de esta solicitud:
2019 - 11 - 28 22 : 33 : 17.041 INFO 18208 --- [nio- 8080 -exec- 1 ] com.example.feignconfig.HomeController : calling getFoo 2019 - 11 - 28 22 : 33 : 17.046 INFO 18208 --- [nio- 8080 -exec- 1 ] ceffoo.FooRequestInterceptor : foo authentication applied 2019 - 11 - 28 22 : 33 : 17.472 INFO 18208 --- [nio- 8080 -exec- 1 ] com.example.feignconfig.HomeController : calling getBar 2019 - 11 - 28 22 : 33 : 17.473 INFO 18208 --- [nio- 8080 -exec- 1 ] cefbar.BarRequestInterceptor : bar authentication applied
Puede encontrar el código fuente de este tutorial en mi repositorio de GitHub:
https://github.com/shokri4971/multiple-feign-config