服務(wù)故障雪崩效應(yīng)
在微服務(wù)架構(gòu)中,根據(jù)業(yè)務(wù)來拆分成一個(gè)個(gè)的服務(wù)敦捧,服務(wù)與服務(wù)之間可以通過 RPC 相互調(diào)用,在 Spring Cloud 中可以用 RestTemplate + LoadBalanceClient 和 Feign 來調(diào)用。為了保證其高可用锅风,單個(gè)服務(wù)通常會(huì)集群部署。由于網(wǎng)絡(luò)原因或者自身的原因线婚,服務(wù)并不能保證 100% 可用遏弱,如果單個(gè)服務(wù)出現(xiàn)問題,調(diào)用這個(gè)服務(wù)就會(huì)出現(xiàn)線程阻塞塞弊,此時(shí)若有大量的請(qǐng)求涌入漱逸,Servlet 容器的線程資源會(huì)被消耗完畢,導(dǎo)致服務(wù)癱瘓游沿。服務(wù)與服務(wù)之間的依賴性饰抒,故障會(huì)傳播,會(huì)對(duì)整個(gè)微服務(wù)系統(tǒng)造成災(zāi)難性的嚴(yán)重后果诀黍,這就是服務(wù)故障的雪崩效應(yīng)袋坑。
概念
服務(wù)熔斷:
一般是指軟件系統(tǒng)中,由于某些原因使得服務(wù)出現(xiàn)了過載現(xiàn)象眯勾,為防止造成整個(gè)系統(tǒng)故障枣宫,從而采用的一種保護(hù)措施,所以很多地方把熔斷亦稱為過載保護(hù)吃环。很多時(shí)候剛開始可能只是系統(tǒng)出現(xiàn)了局部的也颤、小規(guī)模的故障,然而由于種種原因郁轻,故障影響的范圍越來越大翅娶,最終導(dǎo)致了全局性的后果文留。
適用場(chǎng)景:防止應(yīng)用程序直接調(diào)用那些很可能會(huì)調(diào)用失敗的遠(yuǎn)程服務(wù)或共享資源
服務(wù)降級(jí):
當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)當(dāng)前業(yè)務(wù)情況及流量對(duì)一些服務(wù)和頁面有策略的降級(jí)竭沫,以此釋放服務(wù)器資源以保證核心任務(wù)的正常運(yùn)行燥翅。
Feign 中使用 Sentinel
如果要在項(xiàng)目中引入 Sentinel,使用 group ID 為 org.springframework.cloud 和 artifact ID 為 spring-cloud-starter-alibaba-sentinel 的 starter蜕提。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
Sentinel 適配了 Feign 組件森书。但默認(rèn)是關(guān)閉的。需要在配置文件中配置打開它贯溅,在配置文件增加以下代碼:
feign:
sentinel:
enabled: true
在 Service 中增加 fallback 指定類
package com.dsy.spring.cloud.alibaba.nacos.consumer.feign.service;
import com.dsy.spring.cloud.alibaba.nacos.consumer.feign.service.fallback.EchoServiceFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author sanya deng
* @version 1.0.0
* @Title: EchoService
* @ProjectName SpringCloud
* @Description: TODO
* @email forestsancy@163.com
* @date 2019-04-12 16:31
*/
//通過 @FeignClient("服務(wù)名") 注解來指定調(diào)用哪個(gè)服務(wù)
@FeignClient(value = "nacos-provider", fallback = EchoServiceFallback.class)
public interface EchoService {
@GetMapping(value = "/echo/{message}")
String echo(@PathVariable("message") String message);
}
創(chuàng)建熔斷器類并實(shí)現(xiàn)對(duì)應(yīng)的 Feign 接口
package com.dsy.spring.cloud.alibaba.nacos.consumer.feign.service.fallback;
import com.dsy.spring.cloud.alibaba.nacos.consumer.feign.service.EchoService;
import org.springframework.stereotype.Component;
/**
* @author sanya deng
* @version 1.0.0
* @Title: EchoServiceFallback
* @ProjectName SpringCloud
* @Description: TODO
* @email forestsancy@163.com
* @date 2019-04-15 10:43
*/
@Component
public class EchoServiceFallback implements EchoService {
@Override
public String echo(String message) {
return "echo fallback";
}
}
測(cè)試熔斷器
通過curl 訪問 http://127.0.0.1:9093/echo/hi 拄氯,服務(wù)可以正常訪問
關(guān)閉服務(wù)提供者,再通過curl 訪問 http://127.0.0.1:9093/echo/hi