2

Hystrix 主要用于使用 Spring Cloud 构建的应用程序。话虽如此,一个应用程序可能有多个服务层。

例如亚马逊(亚马逊网站必须有多种服务,如登录、产品、购物车、订单、支付等)

客户端(例如 Web 用户)-> Web 应用程序 X -> 服务 A(它使用数据源 A)-> 服务 B(数据源 B)-> 服务 C(数据源 C)-> 服务 D(数据源 D)- > 服务 E(数据源 E)

在这种情况下,当服务 E 出现问题时,如何将其导航回客户端?Hystrix 在这里如何有助于了解服务 E 中的一项特定功能不可用?

如果该示例是错误的,那么 Hystrix 范围是否仅限于一个服务中的多个进程,而不是一个应用程序中使用的多个服务?话虽如此,上面的例子可以调整如下

客户端(例如 Web 用户)-> Web 应用程序 X -> 服务 A -> 内部服务 A 假设有进程 1 -> 进程 2 -> 进程 3 -> 进程 4-> 进程 5 并且进程 5 中的任何操作都失败了被导航回进程 1,然后返回客户端。

我的问题更多是关于在这里维护线程状态。

使用 try-catch 线程范围受限于每个服务(如果错误,请纠正我)。

Hystrix 如何在整个事务中维护线程状态?

4

1 回答 1

2

Hystrix 主要用于使用 Spring Cloud 构建的应用程序

不完全是。Hystrix 通常用于启用断路器功能。它可以在任何地方使用。即使是简单的方法调用例如

class A {

    B b;

    public void methodA() {
               b.methodB();
    }
}


class A {

    DatabaseConnectionPool object;


    @HystrixCommand(fallbackMethod = "abcd")
    public void methodB() {
               // Get db object from pool. 
               // call db and fetch something.
    }
}

即使是简单的方法调用,也可以使用。包裹在 Hystrix 周围的代码中正在做什么并不重要。但通常我们在代码片段周围使用 Hystrix,这些代码会因未知原因引发异常(尤其是在调用不同的应用程序时)

在这种情况下,当服务 E 出现问题时,如何将其导航回客户端?Hystrix 在这里如何有助于了解服务 E 中的一项特定功能不可用?

如果您包装每个方法调用,即来自服务 A --> 服务 B 和服务 B --> 服务 C 并进一步使用 Hystrix,那么每个调用都被视为一个电路,您可以使用 Hystrix-dashboard 进行可视化,状态是什么(每个电路的闭合、开路、半开)。假设来自 Service B --> Service C 的调用失败(抛出异常),那么 Hystrix 会将原始异常包装在 Hystrix Exception 中并将其抛出。如果你有一个回退方法,那么它会转到服务 B 中的回退方法并返回回退中指定的值。如果你没有回退,那么它会在链的上层抛出异常。同样的事情在链条的更高处重复。

Hystrix 如何在整个事务中维护线程状态?

对于使用 Hystrix 包装的每个调用,Hystrix 都会维护一个线程池,您可以完全配置它。

如果我已经拥有使用 try-catch 的现有 Java 功能,为什么有人会明确地使用 Hystrix?

Hystrix 提供了更多的功能。您甚至无法将其与 try catch 进行比较。我建议您阅读断路器模式。

于 2018-01-31T17:58:05.830 回答