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. Fingir 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. Ensuciémonos las manos: 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 . El tiene un , un y una específica y está configurado en la clase . FooClient FeignClient fooContextId valor URL FooConfig (contextId = , value = , url = , configuration = FooConfig.class) { ( ) ; } @FeignClient "fooContextId" "fooValue" "http://foo-server.com/services" public interface FooFeignClient @GetMapping "{id}/foo" Long id) void getFoo (@PathVariable( ) "id" Y esta es la clase . Nuevamente, tiene su propio , , y . BarClient contextId value url BarConfig específicos (contextId = , value = , url = , configuration = BarConfig.class) { ( ) ; } @FeignClient "barContextId" "barValue" "http://bar-server.com/services" public interface BarFeignClient @GetMapping "{id}/bar" Long id) void getBar (@PathVariable( ) "id" y no deben anotarse con ni con ninguna otra anotación de Spring Bean. BarConfig FooConfig @Component A continuación, debemos instanciar y en estas clases de configuración. los beans BarRequestInterceptor FooRequestInterceptor { { BarRequestInterceptor(); } } { { FooRequestInterceptor(); } } public class BarConfig @Bean BarRequestInterceptor public barRequestInterceptor () return new public class FooConfig @Bean FooRequestInterceptor public fooRequestInterceptor () return new Tanto las clases como implementan y deben anular el método apply para especificar sus propios enfoques de autenticación. BarRequestInterceptor FooRequestInterceptor RequestInterceptor { Logger LOGGER = LoggerFactory.getLogger(BarRequestInterceptor.class); { template.header( , ); LOGGER.info( ); } } { Logger LOGGER = LoggerFactory.getLogger(FooRequestInterceptor.class); { template.header( , ); LOGGER.info( ); } } public class BarRequestInterceptor implements RequestInterceptor private static final @Override public void apply (RequestTemplate template) "authorization" "auth-bar" "bar authentication applied" public class FooRequestInterceptor implements RequestInterceptor private static final @Override public void apply (RequestTemplate template) "authorization" "auth-foo" "foo authentication applied" Finalmente, cree un método para llamar a estos clientes de Fingir: { Logger LOGGER = LoggerFactory.getLogger(HomeController.class); FooFeignClient fooFeignClient; BarFeignClient barFeignClient; ( ) { { LOGGER.info( ); fooFeignClient.getFoo( ); } (Exception e) { } { LOGGER.info( ); barFeignClient.getBar( ); } (Exception e) { } } } @RestController public class HomeController private static final @Autowired private @Autowired private @GetMapping "test" public void home () try "calling getFoo" 100L catch try "calling getBar" 100L catch Si ejecutamos la aplicación y llamamos al controlador de inicio, primero se invocará el método "getFoo" de con y luego el método "bar" de con . Este es el registro de salida de esta solicitud: FooClient FooConfiguration BarClient BarConfiguration - - : : INFO --- [nio- -exec- ] com.example.feignconfig.HomeController : calling getFoo - - : : INFO --- [nio- -exec- ] ceffoo.FooRequestInterceptor : foo authentication applied - - : : INFO --- [nio- -exec- ] com.example.feignconfig.HomeController : calling getBar - - : : INFO --- [nio- -exec- ] cefbar.BarRequestInterceptor : bar authentication applied 2019 11 28 22 33 17.041 18208 8080 1 2019 11 28 22 33 17.046 18208 8080 1 2019 11 28 22 33 17.472 18208 8080 1 2019 11 28 22 33 17.473 18208 8080 1 Puede encontrar el código fuente de este tutorial en mi repositorio de GitHub: https://github.com/shokri4971/multiple-feign-config