Резервный метод Hystrix не вызывается, если Feign Client создается вручную с помощью Feign.Builder. - PullRequest
1 голос
/ 23 июня 2019

Я пытаюсь создать клиент Feign, у которого есть запасной метод на случай сбоя.

На следующих примерах я создал простой клиент Feign:

@Component
@FeignClient(value = "authenticationClient", fallback = AuthenticationClientFallback.class)
public interface AuthenticationClient
{
@RequestMapping(method = RequestMethod.GET, value = "/auth/userinfo")
UserInfoResource getUserInfo(@RequestHeader("Authorization") String token);

@RequestMapping(method = RequestMethod.GET, value = "/auth/token")
TokenResource getToken(@RequestHeader("Authorization") String basicAuth);

}

Класс AuthenticaionClientFallback выглядит следующим образом:

 @Component
    public class AuthenticationClientFallback implements AuthenticationClient
    {
        public static final String NO_TOKEN = "No Token";

        @Override
        public UserInfoResource getUserInfo(String token)
        {
            return null;
        }

        @Override
        public TokenResource getToken(String basicAuth)
        {
            return new TokenResource(NO_TOKEN);
        } 
}

Когда я использую свой клиент с аннотацией @Autowire, срабатывает откат.Но мне нужно создать свой собственный симулированный экземпляр клиента, чтобы я мог динамически устанавливать URL.

Инициализация AuthenticationClient:

public AuthenticationClient getAuthenticationClient()
    {
        return HystrixFeign.builder().contract(new SpringMvcContract())
                 .encoder(new JacksonEncoder())
                 .decoder(new JacksonDecoder())
                 .client(new OkHttpClient())
                 .logger(new Slf4jLogger(AuthenticationClient.class))
                 .logLevel(Logger.Level.FULL).target(AuthenticationClient.class, getTargetURL());
    }

И теперь мои резервные методы никогда не вызывают, простоFeignException генерируется с сообщением, что возвращается код состояния 401.

PS Я установил feign.hystrix.enabled=true в файле .yml и @EnableCircuitBreaker на уровне приложения.

...