我已经为Zuul配置了到其他微服务的静态路由。有没有办法在呼叫其他服务时启用CircuitBreaker?
答案 0 :(得分:1)
正如您所说,Zuul将自动包裹Ribbon
和Hystrix
内的所有路线。但是,在微服务之间集成Ribbon
和Hystrix
也很容易。您还可以使用Feign
来处理REST调用。
想象一下,您有两项服务serviceA
和serviceB
,并希望serviceA
使用serviceB
和Ribbon
来呼叫Hystrix
。假设您在Eureka
和默认端口(localhost
)上运行8761
服务器
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceAapplication{
public static void main(String[] args) {
SpringApplication.run(ServiceAapplication.class, args);
}
}
@RestController()
@RequestMapping("/rest")
class DummyRestController{
@RequestMapping(method = RequestMethod.GET, path = "/hello")
String hello(){
return "Hello World!";
}
}
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@EnableFeignClients
public class ServiceBapplication{
public static void main(String[] args) {
SpringApplication.run(ServiceBapplication.class, args);
}
}
@FeignClient(value = "serviceA") //must be same name as the service name in Eureka
@RibbonClient(name = "serviceA") //must be same name as the service name in Eureka
interface ServiceAClient {
@RequestMapping(method = RequestMethod.GET, value = "/rest/hello")
String helloFromServiceA();
}
@RestController()
@RequestMapping("/foo")
class DummyRestController{
private final ServiceAclient client;
@Autowired
DummyRestController(ServiceAclient client){
this.client = client;
}
@RequestMapping(method = RequestMethod.GET, path = "/bar")
String hello(){
return client.helloFromServiceA();
}
}
现在,如果你使用foo/bar
对serviceB进行GET,它将使用:
serviceA
serviceA
Hystrix
命令由于@EnableCircuitBreaker
注释,您的serviceB
会公开Hystrix
流。如果您运行HystrixDashboard
服务器,则可以连接到此流,您将在仪表板上看到helloFromServiceA
命令。
您可以在常规配置文件中配置Ribbon
和Hystrix
,也可以在@FeignClient
和@RibbonClient
注释中使用单独的配置类。您可以找到更多信息here
重要:如果您希望Ribbon
在超时期间重试其他实例,请确保Hystrix
超时超过Ribbon
超时。见this answer