spring-cloud-hystrix熔斷


依賴pom

<dependencyManagement>
  <dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-netflix</artifactId>
        <version>1.0.7RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
  </dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependencies>

源代碼

@RestController
@SpringBootApplication
@EnableCircuitBreaker
public class Application extends SpringBootServletInitializer{
  @AutoWired
  FooService fooService;

  @RequestMapping("/foo")
  public String foo(){
    return fooService.getFoo();
  }

  public static void main(String[] args){
    SpringApplication.run(Application.class,args);
  }
}

模擬服務失敗的情況

@Component
public FooService{
  @HystrixCommand(fallbackMethod="defaultFoo")
  public static String getFoo() throws Exception {
    throw new Exception();
  }

  public static String defaultFoo(){
    return "defaultFoo";
  }

}

瀏覽器調用 foo
展示 defaultFoo

熔斷器是一種異常的處理機制

進一步嘗試,模擬服務有時成功 有時失敗的情況

@Component
public FooService{

  static int count=0;
  @HystrixCommand(fallbackMethod="defaultFoo")
  public static String getFoo() throws Exception {
    count++;
    count%=20;
    System.out.println("realGetFoo");
    if(count<10){
      throw new Exception();
    }else{
      return "foo";
    }
  }

  public static String defaultFoo(){
    return "defaultFoo";
  }

}

插入一些日志輸出,發現會先調用一下getFoo這個接口,如果出現異常則調用defaultFoo
熔斷可能可以設置一些策略,在某些情況下不調用getFoo接口

啟用hystrix報表
添加依賴

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-netflix-hystrix-dashboard</artifactId>
</dependency>

Application增加注解

@EnableHystrixDashBoard

在瀏覽器中輸入

http://host:port/hytrix

並填入地址,可以進入hystrix-dashboard界面

測試發現如果多次快速調用foo接口 並且Foo接口拋出異常
斷路器會變為open狀態,此時程序不會嘗試調用實際的getFoo方法,而是直接調用defaultFoo
過一段時間之后 circuit會自動閉合


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM