這大概是全網最詳細的教你如何在 Spring Cloud 中使用 Hystrix 的文章了
一、簡單使用
在
fsh-substitution
服務中增加Hystrix的依賴,如以下程式碼所示:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId></dependency>
在啟動類上新增
@EnableHystrix
或者
@EnableCircuitBreaker
。注意,
@EnableHystrix
中包含了
@EnableCircuitBreaker
。
然後改造之前的
callHello
方法,在上面增加一個
@HystrixCommand
註解,用於指定依賴服務呼叫延遲或失敗時呼叫的方法,如以下程式碼所示:
@GetMapping ("/ca11Hel1o")@HystrixCommand(fallbackMethod = "defaultCal1Hello")public String callHe11o() {
String result = restTemplate.getForobject(");
return result;}
當呼叫失敗觸發熔斷時會用
defaultallHello
方法來回退具體的內容,定義
default-CallHello
方法的程式碼,如以下程式碼所示:
pub1ic String defaultCal1Hello() {
return "fail";}
只啟動
fsh-substitution
服務而不啟動
fsh-house
服務,呼叫
/alHello
介面,可以看到返回的內容是
"fail"
。
將啟動類上的
@EnableHystrix
去掉,重啟服務,再次呼叫
/callHello
介面可以看到返回的是500錯誤資訊,這個時候就沒有用到回退功能了。
{
code: 500,
message: "I/O error on GET request for "http: //fsh-house/ house/hello": fsh-house; nested exception is java . net . UnknownHostException:
fsh-house" ,
data: null}
二、配置詳解
HystrixCommand中除了
fallbackMethod
還有很多的配置,下面我們來看看這些配置:
官方的配置資訊文件請參考: 。
上面列出來的都是Hystrix的配置資訊,在Spring Cloud中如何使用呢?只需要在介面的方法上面使用
HystrixCommand
註解( 見下面程式碼),指定對應的屬性即可。
@HystrixCommand(fallbackMethod = "defaultcallHello",commandProperties = {
@HystrixProperty (
name= " execution. isolation. strategy",
value = "THREAD" )
})@GetMapping("/cal1He1lo")public String cal1He11o() {
String result =restTemplate .getForobject (
");
return result;}
三、Feign整合Hystrix服務容錯
首先需要執行第一節中的整合步驟,然後在屬性檔案中開啟Feign 對Hystrix的支援:
feign.hystrix.enabled=true
1. Fallback 方式
在Feign的客戶端類上的
@FeignClient
註解中指定
fallback
進行回退(見下面程式碼),改造
fsh-house
的客戶端類
HouseRemoteClient
, 為其配置
fallback
。
@FeignClient(value = "fsh-house", . path = "/house",configuration =FeignConfiguration.class, fallback = HouseRemoteClientHystrix.class)public interface HouseRemoteClient{
@GetMapping("/ {houseId}")
HouseInfoDto hosueInfo (@PathVariable( "houseId" )Long houseId);}
HouseRemoteClientHystrix
類需要實現
HouseRemoteClient
類中所有的方法,返回回退時的內容,如以下程式碼所示:
@Componentpub1ic class HouseRemoteClientHystrix implements HouseRemoteClient {
@Override
public HouseInfoDto hosueInfo(Long houseId) {
return new HouseInfoDto( ) ;
}}
啟動
fsh-substitution
服務,停掉所有
fsh-house
服務,然後訪問
htp://ocalhost:8082/substitution/1介面,這個時候
fsh-house
服務是不可用的,必然會觸發回退,返回的內容是正常的格式,只是house物件是空的,這證明回退生效了。在這種情況下,如果你的介面呼叫了多個服務的介面,那麼只有
fsh-house
服務會沒資料,不會影響別的服務,如果不用Hystrix回退處理,整個請求都將失敗。
{
code:200,
message:"",
data: {
id:1,
money:100.12,
house: {
id :null,
city :nu1l,
region:null,
name : null
}
}}
下面我們將啟用 Hystrix 斷路器禁用:
feign.hystrix.enabled=false
{
code:500,
message: "Failed to connect to localhost/0:0:0:0:0:0:0:1:8083 executing GET
data:null}
2. FallbackFactory 方式
透過fallback已經可以實現服務不可用時回退的功能,如果你想知道觸發回退的原因,可以使用
FallbackFactory
來實現回退功能,如以下程式碼所示:
@Componentpublic class HouseRemoteClientFallbackFactory implements FallbackFactory<HouseRemoteClient> {
@Override
public HouseRemoteClient create( final Throwable cause) {
return new HouseRemoteClient() {
@Override
public HouseInfoDto hosueInfo(Long houseId) {
HouseInfoDto info = new HouseInfoDto( );
info. setData (new HouseInfo(1L, "", "", cause . getMessage()));
return info;
}
};
}
}
FallbackFactory
的使用就是在
@FeignClient
中用
fallbackFactory
指定回退處理類,如以下程式碼所示:
@FeignClient (value = "fsh-house",path = "/house”configuration = FeignConfiguration.class,fallbackFactory = HouseRemoteClientFallbackFactory.class)
在這個回退處理的時候,將異常資訊設定到
HouseInfo
中的name屬性中了,我們重啟
fsh-substitution
,呼叫介面,可以看到異常資訊返回在結果裡面了,
FallbackFactory
和
Fallback
唯一的區別就在這裡。
四、Feign 中禁用 Hystrix
禁用Hystrix還是比較簡單的,目前有兩種方式可以禁用,其中一種是在屬性檔案中進行全部禁用。
feign.hystrix.enabled=false
另一種是透過程式碼的方式禁用某個客戶端,在Feign的配置類中增加程式碼,如以下程式碼所示:
@Configurationpublic class FeignConfiguration {
@Bean
@Scope("prototype" )
public Feign. Builder feignBuilder() {
return Feign.builder();
}
}
喜歡這篇文章的朋友們可以關注個人簡介中的公眾號
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69964492/viewspace-2766876/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 可能是全網最詳細的 Spring Cloud OAuth2 單點登入使用教程了SpringCloudOAuth
- 可能是全網最詳細的 Spring Cloud OAuth2 授權碼模式使用教程了,微信登入就是這個原理SpringCloudOAuth模式
- 全網最細 | 教你如何在 docker 容器下使用 mmdetection 訓練自己的資料集Docker
- 年底晉升,全網最詳細的通關指南來了!
- Java-全網最詳細反射Java反射
- 全網最詳細的PyCharm+Anaconda的安裝。PyCharm
- 全網最詳細的負載均衡原理圖解負載圖解
- 7、Spring Cloud HystrixSpringCloud
- 這應該是全網最詳細的Vue3.5版本解讀Vue
- Spring Cloud:使用Hystrix實現斷路器原理詳解(下)SpringCloud
- 別找了,這是 Pandas 最詳細教程了
- 可能是全網最詳細的express--middlewareExpress
- 詳細剖析Spring Cloud 和Spring Cloud Alibaba的前世今生SpringCloud
- Spring Cloud Hystrix的請求合併SpringCloud
- 手把手教你構建一個web前端專案,全網最詳細教程!Web前端
- Spring Cloud 之 Hystrix.SpringCloud
- spring cloud微服務分散式雲架構--hystrix的使用SpringCloud微服務分散式架構
- 最詳細的spring(IOC、AOP)教程Spring
- 全網最!詳!細!Tarjan演算法講解。演算法
- Spring Cloud 關於:Spring Cloud Netflix HystrixSpringCloud
- Spring cloud(4)-熔斷(Hystrix)SpringCloud
- 全網最詳細的AbstractQueuedSynchronizer(AQS)原始碼剖析(一)AQS基礎AQS原始碼
- 全網最詳細最齊全的序列化技術及深度解析與應用實戰
- Docker版Grafana整合InfluxDB看這一篇就夠了(2020全網最詳細教程)DockerGrafanaUX
- Java設計模式之單例模式,這是最全最詳細的了Java設計模式單例
- 學習SVM,這篇文章就夠了!(附詳細程式碼)
- 全網把Map中的hash()分析的最透徹的文章,別無二家。
- 全網最詳細的AbstractQueuedSynchronizer(AQS)原始碼剖析(三)條件變數AQS原始碼變數
- 全網最詳細的一篇Flutter 尺寸限制類容器總結Flutter
- 全網最詳細的ReentrantReadWriteLock原始碼剖析(萬字長文)原始碼
- Spring Cloud Hystrix應用篇(十一)SpringCloud
- Spring Cloud Hystrix原碼篇(十一)SpringCloud
- Spring Cloud Hystrix 容錯保護SpringCloud
- Spring Cloud Sleuth超詳細實戰SpringCloud
- Spring註解驅動開發第28講——為你嘔心瀝血分析建立和註冊AnnotationAwareAspectJAutoProxyCreator的過程,這應該是全網分析的最詳細的了!Spring
- iOS推送群發的問題,PushSharp作者的這篇講得最詳細了iOS
- 最完整的 Spring Cloud 元件-訊息中介軟體 Spring Cloud Stream 使用教程SpringCloud元件
- 手把手教你使用 Spring Cloud GatewaySpringCloudGateway