2

我正在尝试使用Ribbon + Feign + Hystrix使用spring-boot(1.5.1)创建一些服务(并且我的服务发现是 spring -boot- zookeeper)并且我不使用 Zuul。

我(天真)认为它应该以下列方式工作:

调用 Feign 方法(@FeignClientmyservice.ribbon.MaxAutoRetriesNextServer=2名称,最后如果所有重试都失败 - 它调用 Hystrix 后备方法。

所以我的 Feign 界面

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

定义 Hystrix 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,但是当我关闭一个 MyService 实例时,Ribbon 继续使用 Round Robbin,所以每第二次尝试,我都会收到 Hystrix Fallback 的结果,而不是预期成功(功能区应该在其他服务上重试,不是吗?),直到功能区服务器列表更新。

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

4

2 回答 2

1

这可能是您正在寻找的:https ://stackoverflow.com/a/29171396/873590

如果您使用的是功能区,您可以设置类似于以下内容的属性(将“localapp”替换为您的 serviceid):

localapp.ribbon.MaxAutoRetries=5
localapp.ribbon.MaxAutoRetriesNextServer=5
localapp.ribbon.OkToRetryOnAllOperations=true
于 2017-05-26T04:04:14.687 回答
0

您需要检查几件事。

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

如果申请后没有重试spring-retry,则需要检查原始异常消息。为此,请删除回退并检查消息。如果 message 有myservice timed-out,则表示发生了 hystrix 超时异常。

Hystrix 超时默认为 1,000 毫秒,如果您有较大的读取/连接超时,有时重试 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
于 2017-05-26T08:05:41.367 回答