我已经为Zuul配置了到其他微服务的静态路由。 调出其他服务时,是否有办法启用CircuitBreaker?

===============>>#1 票数:1

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

假设您有两个服务serviceAserviceB ,并且您希望serviceA使用RibbonHystrix调用serviceB 假设您有在localhost和默认端口( 8761 )上运行的Eureka服务器

服务A

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

服务B

@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命令。

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

重要说明 :如果希望Ribbon在超时期间重试其他实例,请确保Hystrix超时高于Ribbon超时。 看到这个答案

  ask by blindstack translate from so

未解决问题?本站智能推荐: