返回

让“云上”无处躲藏!Spring Cloud如何解决首次请求失败的问题?

见解分享

Feign/Ribbon首次请求失败问题

Feign和Ribbon都是Spring Cloud中常用的服务间通信框架。使用Feign/Ribbon进行服务间通信时,我们常常会遇到首次请求失败的问题。

出现此问题的原因是Hystrix默认的超时时间为1秒,而首次请求往往会比较慢(因为Spring的懒加载机制,需要实例化一些类)。这个响应时间可能就大于1秒了,从而进入fallback代码。

解决方案

要解决这个问题,有以下几种解决方案:

  • 方法一:增加超时时间

我们可以通过增加Hystrix的超时时间来解决这个问题。

@FeignClient(value = "user-service")
public interface UserService {

    @HystrixCommand(fallbackMethod = "fallback", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
    })
    String getUser();

    default String fallback() {
        return "fallback";
    }
}

这样,Hystrix的超时时间就从默认的1秒增加到了2秒,可以解决首次请求失败的问题。

  • 方法二:关闭Hystrix

如果我们不需要Hystrix的熔断功能,也可以通过关闭Hystrix来解决这个问题。

@FeignClient(value = "user-service", configuration = FeignConfiguration.class)
public interface UserService {

    String getUser();

}

public class FeignConfiguration {

    @Bean
    public feign.hystrix.HystrixFeign.Builder feignHystrixBuilder() {
        return feign.hystrix.HystrixFeign.builder().熔断启用(false);
    }
}

这样,Hystrix的熔断功能就被关闭了,自然也就不会出现首次请求失败的问题。

  • 方法三:使用异步调用

我们也可以使用异步调用来解决这个问题。

@FeignClient(value = "user-service")
public interface UserService {

    @RequestMapping(value = "/user", method = RequestMethod.GET)
    CompletableFuture<String> getUser();
}

这样,就可以使用异步调用来获取用户信息,而不会受到Hystrix超时时间的限制。

总结

Spring Cloud Feign/Ribbon首次请求失败问题,是由于Hystrix默认的超时时间为1秒,而首次请求往往会比较慢,超出了这个超时时间,就会进入fallback代码。

解决这个问题的方法有三种:增加Hystrix的超时时间、关闭Hystrix、使用异步调用。

在实际生产环境中,我们应该根据具体情况选择合适的解决方案。