Hytrix
爲什麼需要hytrix?
因爲雪崩效應。借用一張圖
異常情況:
首先E先down掉,這個時候會觸發CD的超時和重試,反覆的請求會慢慢耗盡CD的內存和CPU資源,然後CD也掛掉。
然後AB同理,整個服務GG。
解決方案:
線程隔離和服務降級
線程隔離指的是tomcat給每個服務分配指定的線程池,如果線程池已滿則將被立即拒絕,默認不採用排隊,加速失敗判定時間。
如果線程池已滿或者請求超時,則會進行降級服務。
服務降級指的是關掉或者簡單處理空閒無用的服務,爲核心服務提供資源。
實踐中注意,降級處理一般在服務的消費方做。
降級最簡單的demo實現:
1.添加依賴
spring-cloud-starter-netflix-hystrix
2.配置報錯時長等信息,一般默認好
3.添加@EnableCircuitBreaker註解,這裏一般可以和@EnableDiscoveryClient和@SpringbootApplication三合一使用@SpringCloudApplication
4.指定控制器上添加HytrixCommand註解@HystrixCommand(fallbackMethod = "queryByIdFallBack"),寫上對應方法的降級方法即可。注意這裏降級方法的返回值要和對應方法的返回值類型相等。
5.但是不能保證所有的方法都配置HystrixCommand,所以可以在此類頭部加上@DefaultProperties(defaultFallback="xxx")。當然根據每個方法需要觸發的等待時長不一樣,可以在Command中加入屬性。對應類裏有變量可以查看。
熔斷機制:
這張圖完美詮釋。
Feign:
作用:把rest請求隱藏,僞裝成類似Springmvc的Controller一樣,不用自己拼接url再用restTemplate調用。說人話就是簡化遠程調用。
簡單demo搭建:
1.導入依賴:spring-cloud-starter-openfeign
2.主程序註解:@EnableFeignClients
3.創建接口
比如之前原始的方法是這樣拼接url的
現在只需要在接口中
這樣實現即可。
簡單的調用。
但是Feign裏面觸發熔斷要稍微麻煩點,需要在對應的實現類中實現一個fallback函數。這裏太懶了,mark一下。
Zuul:
Zuul本意是一個怪獸的名字,在springcloud裏的作用如下