日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringCloud 入门教程(七): 熔断机制 -- 断路器

發布時間:2025/3/15 javascript 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringCloud 入门教程(七): 熔断机制 -- 断路器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對斷路器模式不太清楚的話,可以參看另一篇博文:斷路器(Curcuit Breaker)模式,下面直接介紹Spring Cloud的斷路器如何使用。

SpringCloud Netflix實現了斷路器庫的名字叫Hystrix. 在微服務架構下,通常會有多個層次的服務調用.?下面是微服架構下, 瀏覽器端通過API訪問后臺微服務的一個示意圖:

?

一個微服務的超時失敗可能導致瀑布式連鎖反映,下圖中,Hystrix通過自主反饋實現的斷路器,?防止了這種情況發生。

?圖中的服務B因為某些原因失敗,變得不可用,所有對服務B的調用都會超時。當對B的調用失敗達到一個特定的閥值(5秒之內發生20次失敗是Hystrix定義的缺省值), 鏈路就會被處于open狀態, 之后所有所有對服務B的調用都不會被執行, 取而代之的是由斷路器提供的一個表示鏈路open的Fallback消息. ?Hystrix提供了相應機制,可以讓開發者定義這個Fallbak消息.

open的鏈路阻斷了瀑布式錯誤, 可以讓被淹沒或者錯誤的服務有時間進行修復。這個fallback可以是另外一個Hystrix保護的調用, 靜態數據,或者合法的空值. Fallbacks可以組成鏈式結構,所以,最底層調用其它業務服務的第一個Fallback返回靜態數據.

下面,進入正題,在之前的兩HELLO WORLD服務集群中加入斷路器, 防止其中一個Hello world掛掉后, 導致系統發生連鎖超時失敗。

1. 在maven工程(前面章節中介紹的Ribbon或者Feign工程)的pom.xml中添加hystrix庫支持斷路器

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

2.?在Ribbon應用中使用斷路器

1). 在Spring Boot啟動類上添加@EnableCircuitBreaker注解

1 @SpringBootApplication 2 @EnableDiscoveryClient 3 @EnableCircuitBreaker 4 public class ServiceRibbonApplication { 5 6 public static void main(String[] args) { 7 SpringApplication.run(ServiceRibbonApplication.class, args); 8 } 。。。 。。。

2). 用@HystrixCommand注解標注訪問服務的方法

1 @Service2 public class HelloService {3 @Autowired RestTemplate restTemplate;4 5 @HystrixCommand(fallbackMethod = "serviceFailure")6 public String getHelloContent() {7 return restTemplate.getForObject("http://SERVICE-HELLOWORLD/",String.class);8 }9 10 public String serviceFailure() { 11 return "hello world service is not available !"; 12 } 13 }

@HystrixCommand注解定義了一個斷路器,它封裝了getHelloContant()方法, 當它訪問的SERVICE-HELLOWORLD失敗達到閥值后,將不會再調用SERVICE-HELLOWORLD, 取而代之的是返回由fallbackMethod定義的方法serviceFailure()。@HystrixCommand注解定義的fallbackMethod方法,需要特別注意的有兩點:

第一, ?fallbackMethod的返回值和參數類型需要和被@HystrixCommand注解的方法完全一致。否則會在運行時拋出異常。比如本例中,serviceFailure()的返回值和getHelloContant()方法的返回值都是String。

第二, ?當底層服務失敗后,fallbackMethod替換的不是整個被@HystrixCommand注解的方法(本例中的getHelloContant), 替換的只是通過restTemplate去訪問的具體服務。可以從中的system輸出看到, 即使失敗,控制臺輸出里面依然會有“call SERVICE-HELLOWORLD”。

啟動eureka服務,只啟動兩個Helloworld服務,然后中斷其中一個(模擬其中一個微服務掛起),訪問http://localhost:8901/然后刷新, 由于有負載均衡可以看到以下兩個頁面交替出現。可以看到第二個被掛起的服務,被定義在Ribbon應該里面的錯誤處理方法替換了。

? ? ? ???

4. 在Feign應用中使用斷路器

1). Feign內部已經支持了斷路器,所以不需要想Ribbon方式一樣,在Spring Boot啟動類上加額外注解

2). 用@FeignClient注解添加fallback類, 該類必須實現@FeignClient修飾的接口。

1 @FeignClient(name = "SERVICE-HELLOWORLD", fallback = HelloWorldServiceFailure.class) 2 public interface HelloWorldService { 3 @RequestMapping(value = "/", method = RequestMethod.GET) 4 public String sayHello(); 5 }

3). 創建HelloWorldServiceFailure類, 必須實現被@FeignClient修飾的HelloWorldService接口。注意添加@Component或者@Service注解,在Spring容器中生成一個Bean

?

1 @Component 2 public class HelloWorldServiceFailure implements HelloWorldService { 3 @Override 4 public String sayHello() { 5 System.out.println("hello world service is not available !"); 6 return "hello world service is not available !"; 7 } 8 }

4). Spring Cloud之前的Brixton版本中,Feign是缺省是自動激活了斷路器的,但最近的Dalston版本已經將缺省配置修改為禁止。

原因參見: ?https://github.com/spring-cloud/spring-cloud-netflix/issues/1277, 這一點要注意。所以要在Feign中使用斷路器, 必須在application.yml中添加如下配置:

feign:hystrix:enabled: true

5). 啟動Feign應用, 訪問http://localhost:8902/hello, 可以一看到和Ribbon一樣的效果。

總結

以上是生活随笔為你收集整理的SpringCloud 入门教程(七): 熔断机制 -- 断路器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。