弹簧云zuul静态路线与断路器

时间:2016-05-24 18:10:56

标签: spring-cloud netflix-zuul circuit-breaker

我已经为Zuul配置了到其他微服务的静态路由。有没有办法在呼叫其他服务时启用CircuitBreaker?

1 个答案:

答案 0 :(得分:1)

正如您所说,Zuul将自动包裹RibbonHystrix内的所有路线。但是,在微服务之间集成RibbonHystrix也很容易。您还可以使用Feign来处理REST调用。

想象一下,您有两项服务serviceAserviceB,并希望serviceA使用serviceBRibbon来呼叫Hystrix。假设您在Eureka和默认端口(localhost)上运行8761服务器

serviceA

@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!";
    }
}

ServiceB

@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,它将使用:

  • Eureka找到serviceA
  • 的主机和端口
  • 功能区,用于在serviceA
  • 的多个实例之间进行负载平衡
  • 整个事情都包含在Hystrix命令

由于@EnableCircuitBreaker注释,您的serviceB会公开Hystrix流。如果您运行HystrixDashboard服务器,则可以连接到此流,您将在仪表板上看到helloFromServiceA命令。

您可以在常规配置文件中配置RibbonHystrix,也可以在@FeignClient@RibbonClient注释中使用单独的配置类。您可以找到更多信息here

重要:如果您希望Ribbon在超时期间重试其他实例,请确保Hystrix超时超过Ribbon超时。见this answer