我正在我的本地机器上试用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 中取出服务实例。