依賴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會自動閉合