0

我正在我的本地机器上试用spring-cloud-samples,我开发了一个简单的 REST 服务,支持 eureka 和 hystrix。

我有一个前端应用程序,它通过 hystrix 命令方法(@HystrixCommand 注释方法)连接到服务,其中包含对 Feign 客户端的引用。

假装客户端

@FeignClient("product-service")
public interface ProductClient {

    @RequestMapping(value = "product-service/{id}", method = RequestMethod.GET)
    Product getProduct(@PathVariable("id") int id);

}

Hystrix 包装器

@Service
public class ProductHystrixClient {

    private final ProductClient productClient;

    @Autowired
    public ProductHystrixClient(ProductClient productClient) {
        this.productClient = productClient;
    }

    @HystrixCommand(groupKey = "product-service", commandKey = "getProduct", fallbackMethod = "getProductFallback")
    public Product getProduct(int id) {
        return productClient.getProduct(id);
    }

    public Product getProductFallback(int id) {
        return null;
    }

}

我已经启动了 Spring MVC ProductService 的两个实例。第一个按预期交付基于给定标识符的产品信息。另一方面,第二个总是抛出 RuntimeException 以模拟系统依赖失败:

  if (1==1) throw new IllegalArgumentException("system dependency failure");

在前端,我使用 hystrix 客户端获取产品信息,并且 ProductService 实例将以循环方式(由于功能区)方式调用。由于 ProductService 实例之一总是传递异常,在前端连续多次调用后,ProductService 电路将打开(即使 ProductService 实例之一可以成功处理请求)。

如何仅从 eureka 中删除有问题的 ProductService 实例,并保持其正常运行,以避免 ProductService 的 hystrix 断路?我认为需要更改 ProductService 的健康指标资源“/health”的功能,以便对系统依赖失败执行额外检查。

我偶然发现使用spring-boot-starter-actuator可以执行自定义健康检查,但这似乎无助于从 eureka 中取出服务实例。

4

0 回答 0