1. Ao usar o Feign para fazer chamadas de serviço, use métodos herdados para ligar para o serviço. Ao ingressar na configuração de fallback do disjuntor do Hystrix, um erro será relatado e foi resolvido. 2. Use a configuração padrão do Feign, o disjuntor não entra em vigor e foi resolvido.
Recentemente, eu estava aprendendo sobre microsserviços e descobri que, ao usar o Feign para fazer chamadas de serviço, usei a herança para ligar para o serviço. Ao adicionar a configuração de fallback do disjuntor da Hystrix, será relatado um erro. O código é o seguinte:
@RequestMapping ("/Demo/API") interface pública helloapi {@getMapping ("user/{id}") user getUserById (@pathvariable ("id") longo id); @GetMapping ("Hello") String echo (@RequestParam ("Nome") Nome da string);} @FeignClient (Value = "MS-Server", Fallback = ConsumerFeignServiceFallback.Class) Interface pública ConsumerFeignService estende Helloapi {} @ComPonentPublic Class ConsumerFeignServiceFallback implementa o ConsumerFeIGNService {@Override Public User GetUserById (Long Id) {return user (); } @Override public String echo (nome da string) {return "ECHO ERROR:" + NOME; }}O erro é relatado da seguinte maneira:
Causado por: java.lang.illegalstateException: mapeamento ambíguo. Não é possível mapear 'com.thoughtworks.demo.consumer.service.consumerFeignService' Método
Resumo público java.lang.string com.thoughtworks.demo.api.helloapi.echo (java.lang.string)
Para {[/Demo/API/Hello], Methods = [Get]}: já existe o método de bean 'ConsumerFeigServiceFallbackback'
public java.lang.string com.thoughtworks.demo.consumer.service.consumerFeignServiceFallback.echo (java.lang.string) mapeado.
em org.springframework.web.servlet.handler.abstracthandlermethodmapp $ mappingregistry.assertunikeMethodMapping (abstrandlermethodmapping.java:576) ~ [spring-webmvc -4.3.14.Release.Jar: 4.3.3.14)
em org.springframework.web.servlet.handler.abstracthandlermethodmapp $ mappingregistry.register (abstracthandlermethodmapping.java:540) ~ [spring-webmvc -4.3.14.release.Jar: 4.3.14.Rease]
em org.springframework.web.servlet.handler.abstracthandlermethodmapping.registerhandlermethod (abstracthandlermethodmapping.java:264) ~ [spring-webmvc -4.3.14.release.Jar: 4.3.14.Release]
em org.springframework.web.servlet.handler.abstracthandlermethodmapping.detecthandlermethods (abstracthandlermethodmapping.java:250) ~ [spring-webmvc -4.3.14.release.Jar: 4.14.14.Rease]
em org.springframework.web.servlet.handler.abstracthandlermethodmapping.inithandlermethods (abstracthandlermethodmapping.java:214) ~ [spring-webmvc -4.3.14.release.Jar: 4.3.14.Rease]
em org.springframework.web.servlet.handler.abstracthandlermethodmapping.afterpropertiesset (abstracthandlermethodmapping.java:184) ~ [spring-webmvc -4.3.14.release.Jar: 4.3.14.Rease]
em org.springframework.web.servlet.mvc.method.annotation.requestMappingHandlerMapping.afterPropertiesset (requestmapphandlerMapping.java:127) ~ [spring-webmvc -4.3.14.release.Jar: 4.3.14.Rease]
em org.springframework.beans.factory.support.abstractraToTowirecAcleBeanFactory.invokeInitMethods (abstractaUTowirecAcleBeanFactory.java:1687) ~ [Spring-beans -4.14.release.Jar: 4.14.Rease]
em org.springframework.beans.factory.support.abstractraToTowirecAcleBeanFactory.initializeBean (abstrateaUTowirecabableBeanFactory.Java:1624) ~ [Spring-beans -4.3.14.release.Jar: 4.3.14.Release]
... 21 quadros comuns omitidos
O motivo do erro é que a classe de interface herdada aqui é uma interface do controlador, que herdará da classe pai ao herdar.
@RequestMapping ("/Demo/API")Quando a SpringMVC estava fazendo mapeamento, verificou -se que o mapeamento entre o ConsumerFeignService e o ConsumerFeignServiceFallback foi repetido, então uma exceção foi lançada. Como resolvê -lo?
Existem 2 soluções:
Primeiro, altere a configuração de mapeamento do ConsumerFeigServiceFallback, o código é o seguinte:
@Componente @requestmapping ("Fallback/Demo/API") Classe pública ConsumerFeignServiceFallback implementa o ConsumerFeigService {@Override Public User GetUserById (Long Id) {return new User (); } @Override public String echo (nome da string) {return "ECHO ERROR:" + NOME; }}O segundo é usar o FallbackFactory, o código é o seguinte:
@ComponentPublic Class ConsumerFeignServiceFallback implementa o FallbackFactory <ComerFeIGNService> {@Override public ConsumerFeIGNService Create (Trowable Causa) {Return New ConsumerFeignService () {@Override Public User GetUserbyId (Long Id) {Return user (); } @Override public String echo (nome da string) {return "ECHO ERROR:" + NOME; }}; }}Após a corrida, desliguei o provedor de serviços e descobri que o fusível não entrou em vigor. Não entrei no método de fallback como usar @hystrixCommand sozinho. Eu verifiquei muitos métodos e descobri que a mudança de configuração do Hystix, que foi originalmente feita, não estava ligada.
Solução: Adicione a configuração no Application.yml da seguinte forma:
Feign: Hystrix: Ativado: true
Não há prompt para essa configuração no Intellij Idea, e também é relatado um aviso. Não sei se é considerado um bug. A versão que eu uso aqui é
SpringBootversion = '1.5.10.Release'sPringCloudversion =' Edgware.sr3 '
Os acima são algumas pequenas armadilhas que encontrei ao usar o Feign. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.