我正在尝试 hystrix 后备方法。 在 localhost:8082 上,客户服务正在运行,它返回客户的名称。
如果客户服务中断,则应调用后备方法。但这并没有发生。
下面是代码片段。
请推荐。
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@RestController
public class DemoHystrixApplication {
@GetMapping("/")
public String name() {
String str = getCustomerName();
return str;
}
@HystrixCommand(fallbackMethod = "getFallbackCustomerName")
private String getCustomerName() {
RestTemplate restTemplate = new RestTemplate();
URI uri = URI.create("http://localhost:8082");
return restTemplate.getForObject(uri, String.class);
}
private String getFallbackCustomerName() {
System.out.println("coming inside fallback method");
return "Resillient Customer";
}
public static void main(String[] args) {
SpringApplication.run(DemoHystrixApplication.class, args);
}
}
这两个方法,即实际方法和后备方法都应该是公共的,并将这些方法移动到一个单独的类中,并用 @Component 进行注释。
尝试一下,希望这会有所帮助。
您的 @HystrixCommand 注解方法应该是公共的。 不确定后备方法,但我也会将其设置为公开。
这是因为AOP。
Spring 容器在注入 bean 时会注入切面感知 bean。
当应用户请求调用
name()
函数时,会调用切面感知 bean 的方法,因此注释起作用。
但是,在
this.getCustomerName()
中直接调用 name()
会在原始 bean 被包装在代理中之前调用 getCustomerName()
。它不知道方面。因此,注释不起作用。
如果您添加了 netflix-hystrix 的依赖项并让开发工具在执行服务时获取更改,您还可以尝试停止和启动服务。
后备方法应该从另一个 bean 调用。问题是您正在从 RestController 调用后备方法。
你可以尝试这个,因为 HystrixComman 是方面
@Bean
@Primary
@Order(value= Ordered.HIGHEST_PRECEDENCE)
public HystrixCommandAspect hystrixAspect() {
return new HystrixCommandAspect();
}
@HystrixCommand 注解的方法应该是公共的。回退方法可以是私有的,也可以工作。