先理解幾個(gè)定義:
服務(wù)雪崩效應(yīng):是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)調(diào)用者的不可用,并將不可用逐漸放大的過程失仁。
雪崩原因:
- 服務(wù)提供者不可用
-
a们何、硬件故障
- 硬件損壞造成的服務(wù)器主機(jī)宕機(jī)
- 網(wǎng)絡(luò)硬件故障造成的服務(wù)提供者的不可訪問
b冤竹、程序Bug
c、緩存擊穿:緩存應(yīng)用重啟, 所有緩存被清空時(shí),以及短時(shí)間內(nèi)大量緩存失效時(shí). 大量的緩存不命中, 使請(qǐng)求直擊后端,造成服務(wù)提供者超負(fù)荷運(yùn)行,引起服務(wù)不可用
d烘苹、用戶大量請(qǐng)求:在秒殺和大促開始前,如果準(zhǔn)備不充分,用戶發(fā)起大量請(qǐng)求造成服務(wù)提供者的不可用
解決方案,太多了,開濤大神的《億級(jí)流量》就有好多應(yīng)對(duì)策略廊鸥。
還是回歸正傳用Hystrix去惰说,
一般通過 超時(shí)機(jī)制, 熔斷器 和熔斷后的 降級(jí)方法 來實(shí)現(xiàn)缘回。而Hystrix就一個(gè)可以預(yù)防服務(wù)雪崩酥宴,解決分布式系統(tǒng)交互時(shí)超時(shí)處理和容錯(cuò)的類庫。
這里就簡(jiǎn)單使用授滓,在上面的Feign項(xiàng)目中再加一個(gè)模塊hystrix肆糕。
代碼就是復(fù)制feign模塊诚啃。
添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
然后修改HelloService
,加上一個(gè)fallback噩咪,當(dāng)服務(wù)不可用時(shí)胃碾,調(diào)用ErrorHelloService
筋搏,
@FeignClient(value = "service-hi",fallback = ErrorHelloService.class)
自定義一個(gè)ErrorHelloService類奔脐,繼承HelloService
,上面要加上@Component
峦朗,注入spring
@Component
public class ErrorHelloService implements HelloService {
@Override
public String callClientOne(String name) {
return "sorry "+name;
}
}
其他都一樣波势,然后運(yùn)行這個(gè)項(xiàng)目,注意拴曲,現(xiàn)在server凛忿,client都沒有起來
然后訪問 http://localhost:8765/hi?name=lijia
會(huì)輸出剛剛定義的ErrorHelloService
的信息sorry lijia
店溢。這樣就實(shí)現(xiàn)了如果服務(wù)不可用也不會(huì)造成雪崩效應(yīng)床牧。
然后啟動(dòng)server,client驹马,再次訪問 http://localhost:8765/hi?name=lijia
上面是在Feign項(xiàng)目中加上Hystrix糯累,在Ribbon中呢册踩。
用的是Ribbon的項(xiàng)目暂吉,和上面一樣。加個(gè)hystrix模塊阎肝,代碼復(fù)制ribbon的肮街。
添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
修改啟動(dòng)類AppHystrix
添加@EnableHystrix
注解嫉父。
然后修改HelloService绕辖,在調(diào)用的方法上面加上@HystrixCommand(fallbackMethod = "hiError")
,fallbackMethod中定義如果服務(wù)不可用的方法围小。
然后啟動(dòng)吩抓。效果在啟動(dòng)server和client前后是有區(qū)別的疹娶。
還有一個(gè)Hystrix Dashboard
在Ribbon項(xiàng)目的hystrix中加上依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
然后在啟動(dòng)類中加上@EnableHystrixDashboard
啟動(dòng)類雨饺,然后訪問 http://localhost:8764/hystrix
會(huì)進(jìn)入
輸入要調(diào)用的服務(wù),點(diǎn)擊
Monitor Stream
,進(jìn)入hystrix Monitor 惑淳,由于我的server和client未啟動(dòng)额港,會(huì)出現(xiàn)然后啟動(dòng)server,client歧焦,得等一會(huì)移斩,不到一分鐘,具體以后再看绢馍。
首先訪問 http://localhost:8764/hi?name=lijia
然后在hystrix dashboard中輸入 http://localhost:8764/hystrix.stream
進(jìn)去之后會(huì)發(fā)現(xiàn)一些監(jiān)控?cái)?shù)據(jù)
ribbon代碼放在 https://github.com/lijiaccy/springcloud-study/tree/master/eurefa-Ribbon
feign代碼放在 https://github.com/lijiaccy/springcloud-study/tree/master/eurefa-Feign