1. Al usar Feign para hacer llamadas de servicio, use métodos hereditarios para llamar al servicio. Al unirse a la configuración de retroceso de procesamiento del interruptor de circuito de Hystrix, se informará y se resolvió un error. 2. Use la configuración predeterminada de Feign, el interruptor de circuito no surta efecto y se ha resuelto.
Recientemente, estaba aprendiendo sobre microservicios y descubrí que al usar Feign para hacer llamadas de servicio, utilicé la herencia para llamar al servicio. Al agregar la configuración de retroceso de procesamiento del disyuntor de Hystrix, se informará un error. El código es el siguiente:
@RequestMapping ("/demo/api") interfaz pública helloapi {@getmapping ("user/{id}") user getUserByid (@pathvariable ("id") largo id); @GetMapping ("Hello") String echo (@RequestParam ("Nombre") Nombre de cadena);} @FeignClient (value = "MS-Server", Fallback = ConsumerFeignServiceFallback.Class) Interfaz pública ConsumerFeignService extiende HelloApi {} @ComponentPublic Class ConsumerFeignServiceFallback implementa ConsumerFeignService {@Override Public User GetUserById (Long ID) {return New User (); } @Override public String echo (nombre de cadena) {return "Echo Error:" + nombre; }}El error se informa de la siguiente manera:
Causado por: java.lang.illegalstateException: mapeo ambiguo. No se puede mapear 'com.thoughtworks.demo.consumer.service.consumerfeignservice'
Public Abstrum java.lang.string com.thoughtworks.demo.api.helloapi.echo (java.lang.string)
a {[/demo/api/hello], métodos = [get]}: ya está el método de bean 'ConsumeFeignServiceFallback'
Public java.lang.string com.thoughtworks.demo.consumer.service.consumerfeignservicefallback.echo (java.lang.string) mapeado.
en org.springframework.web.servlet.handler.abstractthandlermethodmapping $ mappingregistry.assertuniquemethodmapping (abstractthandlermethodmapping.java:576) ~ [spring-webmvc-4.3.14.reelease.jar: 4.3.14.relase]
en org.springframework.web.servlet.handler.abstractthandlermethodmapping $ mappingRegistry.Register (Abstractthandlermethodmapping.java:540) ~ [Spring-Webmvc-4.3.14.elease.JAR: 4.3.14.Release]
en org.springframework.web.servlet.handler.abstractthandlermethodmapping.RegisterHandlermethod (AbstractThandlermethodMapping.java:264) ~ [Spring-Webmvc-4.3.14.elease.jar: 4.3.14.Lelease]
en org.springframework.web.servlet.handler.abstractthandlermethodmapping.detectthandlermethods (Abstractthandlermethodmapping.java:250) ~ [Spring-Webmvc-4.3.14.Release.JAR: 4.3.14.Lelease]
en org.springframework.web.servlet.handler.abstractthandlermethodmapping.inithandlermethods (Abstractthandlermethodmapping.java:214) ~ [Spring-Webmvc-4.3.14.elease.JAR: 4.3.14.Release]
en org.springframework.web.servlet.handler.abstractthandlermethodmapping.afterPropertiesSet (AbstractThandlermethodMapping.java:184) ~ [Spring-Webmvc-4.3.14.elease.JAR: 4.3.14.Release]
en org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlermapping.AfterPropertiesSet (requestmappingHandlermapping.java:127) ~ [Spring-Webmvc-4.3.14.Release.jar: 4.3.14.Release]
en org.springframework.beans.factory.support.AbstractAUTOWECapableBeanFactory.InvokeInitmethods (abstractAutowiCapableBeanFactory.Java:1687) ~ [Spring-Beans-4.3.14.Release.JAR: 4.3.14.Release]
en org.springframework.beans.factory.support.AbstractAutoweRecapableBeanFactory.initializeBean (abstractAutowIrecapableBeanfactory.Java:1624) ~ [Spring-Beans-4.3.14.Release.JAR: 4.3.14.Release]
... 21 marcos comunes omitidos
La razón del error es que la clase de interfaz heredada aquí es una interfaz controladora, que heredará de la clase principal al heredar.
@RequestMapping ("/demo/API")Cuando SpringMVC estaba haciendo mapeo, se descubrió que se repitió el mapeo entre ConsumerfeignService y Consumerfeignservicefallback, por lo que se lanzó una excepción. ¿Cómo resolverlo?
Hay 2 soluciones:
Primero, cambie la configuración de mapeo de ConsumerFeignServiceFallback, el código es el siguiente:
@Componente @requestMapping ("Fallback/Demo/API") Public Class ConsumerFeignServiceFallback implementa ConsumerFeignService {@Override Public User GetUserById (ID Long) {return New User (); } @Override public String echo (nombre de cadena) {return "Echo Error:" + nombre; }}El segundo es usar FallbackFactory, el código es el siguiente:
@ComponentPublic Class ConsumerFeignServiceFallback implementa FallbackFactory <ConsumerFeignService> {@Override public ConsumerFeignService Create (Causa de lanzamiento) {return New ConsumerFeignService () {@Override Public User GetUserByID (ID de larga ID) {return New User ();; } @Override public String echo (nombre de cadena) {return "Echo Error:" + nombre; }}; }}Después de correr, apagué el proveedor de servicios y descubrí que el fusible no entró en vigencia. No entré en el método de retroceso como usar @HystrixCommand solo. Verifiqué muchos métodos y descubrí que el interruptor de configuración de Hystix, que originalmente estaba fingido, no estaba encendido.
Solución: Agregue la configuración en Application.yml de la siguiente manera:
Feign: Hystrix: habilitado: verdadero
No hay un mensaje para esta configuración en la idea IntelliJ, y también se informa una advertencia. No sé si se considera un error. La versión que uso aquí es
SpringBootversion = '1.5.10.Elease'SpringCloudVersion =' edgware.sr3 '
Los anteriores son algunas pequeñas trampas que encontré al usar Feign. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.