先理解幾個(gè)定義:
服務(wù)雪崩效應(yīng):是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)調(diào)用者的不可用,并將不可用逐漸放大的過(guò)程。
雪崩原因:
- 服務(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去,
一般通過(guò) 超時(shí)機(jī)制, 熔斷器 和熔斷后的 降級(jí)方法 來(lái)實(shí)現(xiàn)。而Hystrix就一個(gè)可以預(yù)防服務(wù)雪崩,解決分布式系統(tǒng)交互時(shí)超時(shí)處理和容錯(cuò)的類庫(kù)。
這里就簡(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都沒有起來(lái)
然后訪問 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