您好,登錄后才能下訂單哦!
Hystrix 能使你的系統(tǒng)在出現(xiàn)依賴服務(wù)失效的時候,通過隔離系統(tǒng)所依賴的服務(wù),防止服務(wù)級聯(lián)失敗,同時提供失敗回退機制,更優(yōu)雅地應(yīng)對失效,并使你的系統(tǒng)能更快地從異常中恢復(fù)。
貨船為了進行防止漏水和火災(zāi)的擴散,會將貨倉分隔為多個,當(dāng)發(fā)生災(zāi)害時,將所在貨倉進行隔離就可以降低整艘船的風(fēng)險。
熔斷器就像家里的保險絲,當(dāng)電流過載了就會跳閘,不過Hystrix的熔斷機制相對復(fù)雜一些。
熔斷器開關(guān)由關(guān)閉到打開的狀態(tài)轉(zhuǎn)換是通過當(dāng)前服務(wù)健康狀況和設(shè)定閾值比較決定的.
使用一個線程池來存儲當(dāng)前的請求,線程池對請求作處理,設(shè)置任務(wù)返回處理超時時間,堆積的請求堆積入線程池隊列。這種方式需要為每個依賴的服務(wù)申請線程池,有一定的資源消耗,好處是可以應(yīng)對突發(fā)流量(流量洪峰來臨時,處理不完可將數(shù)據(jù)存儲到線程池隊里慢慢處理)。
使用一個原子計數(shù)器(或信號量)來記錄當(dāng)前有多少個線程在運行,請求來先判斷計數(shù)器的數(shù)值,若超過設(shè)置的最大線程個數(shù)則丟棄改類型的新請求,若不超過則執(zhí)行計數(shù)操作請求來計數(shù)器+1,請求返回計數(shù)器-1。這種方式是嚴(yán)格的控制線程且立即返回模式,無法應(yīng)對突發(fā)流量(流量洪峰來臨時,處理的線程超過數(shù)量,其他的請求會直接返回,不繼續(xù)去請求依賴的服務(wù))。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.12</version>
</dependency>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-metrics-event-stream</artifactId>
<version>1.5.12</version>
</dependency>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
<version>1.5.12</version>
</dependency>
@Configuration
public class HystrixConfig {
/**
* 聲明一個HystrixCommandAspect代理類,現(xiàn)攔截HystrixCommand的功能
*/
@Bean
public HystrixCommandAspect hystrixCommandAspect() {
return new HystrixCommandAspect();
}
}
@Service
public class HelloService {
@HystrixCommand(fallbackMethod = "helloError",
commandProperties = {
@HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "2")},
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "5"),
@HystrixProperty(name = "maximumSize", value = "5"),
@HystrixProperty(name = "maxQueueSize", value = "10")
})
public String sayHello(String name) {
try {
Thread.sleep( 15000 );
return "Hello " + name + " !";
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
public String helloError(String name) {
return "服務(wù)器繁忙,請稍后訪問~";
}
}
@SpringBootApplication
@RestController
public class HystrixSimpleApplication {
@Autowired
private HelloService helloService;
public static void main(String[] args) {
SpringApplication.run( HystrixSimpleApplication.class, args );
}
@GetMapping("/hi")
public String hi(String name) {
return helloService.sayHello( name );
}
}
訪問 http://localhost:80809/hi?name=zhangsan
curl -X GET -d 'name=zhangsan' http://localhost:8080/hi
返回
服務(wù)器繁忙,請稍后訪問~
https://github.com/gf-huanchupk/SpringCloudLearning/tree/master/chapter16
https://github.com/Netflix/Hystrix/wiki
https://blog.51cto.com/snowtiger/2057092
歡迎關(guān)注我的公眾號《程序員果果》,關(guān)注有驚喜~~
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。