如果通过Feign.Builder手动创建Feign Client,则不会调用Hystrix后备方法

问题描述 投票:2回答:1

我尝试创建一个Feign客户端,该客户端在发生故障时具有后备方法。

通过以下示例,我创建了一个简单的Feign Client:

@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我已在应用级将.yml文件和@EnableCircuitBreaker设置为feign.hystrix.enabled=true

spring spring-cloud hystrix spring-cloud-feign feign
1个回答
1
投票

我认为您混合了两种假客户端初始化方法;声明式和手动初始化。您需要坚持一种方法。

如果使用声明式初始化;您可以将@FeignClient批注与回退结合使用,如下所示;

@FeignClient(value = "authenticationClient", url = "${feign.url}", fallback = AuthenticationClientFallback.class)
public interface AuthenticationClient

并且您可以像这样将虚拟客户端自动连接到组件中。

@Autowired
AuthenticationClient client;

如果您正在使用伪装客户端的手动初始化并进行一些自定义;那么您不必在AuthenticationClient类上使用@FeignClient批注。您可以按如下方式创建自定义的伪装客户;

@Autowired
AuthenticationClientFallback fallbackClient;

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(), fallbackClient);
    }

请注意,fallbackClient对象作为参数传递给.target()。

有关更多详细信息,请参见Spring cloud feign documentation

© www.soinside.com 2019 - 2024. All rights reserved.