2

我试图用丝带 + 假死 + 春季启动(1.5.1)创建一些服务(和我的服务发现是弹簧boot- 饲养员)和我不't使用Zuul。Spring Boot Cloud + Ribbon + Feign + Hystrix + Zookeeper:重试和失败是怎么回事?

我(幼稚)认为它应该在以下方式工作:

调用假死法(@FeignClient注解) - 它把它转换成这是负载在由丝带某种方式平衡一些HTTP请求,所以如果发送请求失败,它会尝试(根据功能区配置,即myservice.ribbon.MaxAutoRetriesNextServer=2)在相同类型/名称的下一个服务上重试,最后如果所有重试失败 - 则调用Hystrix回退方法。

所以我假死接口

@FeignClient(value = "myservice", fallbackFactory = HystrixMyServiceFallbackFactory.class) 
@RibbonClient(name = "myservice") 
public interface MyServiceClient { 
    @RequestMapping(value = "/foo", method = RequestMethod.POST) 
    Response foo(Object data); 
} 

定义猬FallbackFactory到

public class HystrixMyServiceFallbackFactory implements FallbackFactory<MyServiceClient > { 

    @Override 
    public MyServiceClient create(final Throwable throwable) { 
     return new MyServiceClient() { 

      @Override 
      public Response foo(Object data) { 
       return new Response(-1, "Failed"); 
      } 
     }; 
    } 
} 

某处返回一些默认的响应在我的代码我有下面几行:

@Autowired 
private MyServiceClient myServiceClient; 

public Response doSomething() { 
    return myServiceClient.foo(new Object()); 
} 

当所有的服务是(我有2个我的服务),功能区很好,但很好当我关闭其中一个MyService实例时,Ribbon继续使用Round Robbin,因此每次尝试都会收到Hystrix Fallback的结果,而不是预期的成功(功能区应该在其他服务上重试,不是吗?),直到功能区服务器列表已更新。

任何人都可以解释它是如何在一起工作的?

回答

1

这可能是你在找什么:https://stackoverflow.com/a/29171396/873590

如果您使用的色带,您可以设置类似 性能以下(替换为您服务ID“localapp”):

localapp.ribbon.MaxAutoRetries=5 
localapp.ribbon.MaxAutoRetriesNextServer=5 
localapp.ribbon.OkToRetryOnAllOperations=true 
0

有几件事情需要检查。

首先,检查你的maven/gradle文件是否具有spring-retry依赖关系。 Feign + Ribbon重试需要spring-retry,现在它是可选的依赖关系。因此,如果您的应用程序没有spring-retry,则不支持重试。

如果在应用spring-retry后没有发生重试,则需要检查原始异常消息。要做到这一点,请删除回退并检查信息。 如果消息有myservice timed-out,则表示发生了hystrix超时异常。

Hystrix timeout是默认的1000ms,有时如果您的读取/连接超时时间过长,则不足以重试http请求。如果是这样,请尝试像下面那样调整hystrix超时。

hystrix: 
    command: 
    default: 
     execution: 
     isolation: 
      thread: 
      timeoutInMilliseconds: 10000 

上述属性会将您的hystrix的所有默认超时更改为10秒,并且通常足够大。您需要使用正确的值设置此值,以便有足够的时间进行重试。

您还可以更改特定断路器的hystrix超时。在Feign的情况下,每种方法都会有自己的断路器,它的名称就像下面的例子。

MyServiceClient#foo(Object) 

所以你可以像下面那样改变你的断路器的超时时间。

hystrix: 
    command: 
    MyServiceClient#foo(Object): 
     execution: 
     isolation: 
      thread: 
      timeoutInMilliseconds: 10000 
+0

Thx,我找到了这个配置。但在我看来,它在微服务环境中可能会有点问题。如果我有5个“服务”,其中2个很慢,它不会解决我的问题:或者我将禁用所有“服务”组件(通过Hystrix)或禁用hystrix。经过一番思考,我决定解决它不同的问题:为了改善健康指标,所以“不好的服务”将被标记为不健康快速,并且将通过列表中的服务发现而被移除。我仍然遇到服务速度慢的“问题”,但也许我应该定义什么是缓慢的,并再次将其标记为“糟糕的”服务。 –

相关问题