1. 程式人生 > >Spring Cloud入門教程-熔斷器-Hystrix

Spring Cloud入門教程-熔斷器-Hystrix

這裡說一下熔斷器,開始之前先了解兩個概念:

1.什麼是Hystrix?

       在分散式系統中,服務與服務之間的依賴錯綜複雜,一種不可避免的情況就是某些服務會出現故障,導致依賴於它們的其他服務出現遠端排程的執行緒阻塞。 Hystrix是 Netflix公司開源的一個專案,它提供了熔斷器功能,能夠阻止分散式系統中出現聯動故障。 Hystrix是通過隔離服務的訪問點阻止聯動故障的,並提供了故障的解決方案,從而提高了整個分散式系統的彈性。

2.雪崩效應

      在高併發的情況下,單個服務的延遲會導致整個請求都處於延遲狀態,可能在幾秒鐘就使整個服務處於執行緒負載飽和的狀態。某個服務的單個點的請求故障會導致使用者的請求處於阻塞狀態,最終的結果就是整個服務線資源消耗盡,由於服務的依賴性,會導致依賴於該故障服務的其他服務也處於執行緒阻塞,整最終導致這些服務的執行緒資源消耗殆盡,直到不可用,從而導致整個服務系統不可用,即雪崩效應。        為了防止雪崩效應,因而產生了熔斷器模型。 Hystrix是在業界表現非常好的一個熔斷器模型實現的開源元件,它是 Spring Cloud元件不可缺少的一部分。

Hystrix的設計原則: a.防止單個服務的故障耗盡整個服務的Seet容器(例如 Tomcat)的執行緒資源 b.快速失敗機制,如果某個服務出現了故障,則呼叫該服務的請求快速失敗,而不是執行緒等待。 c.提供回退( fallback)方案,在請求發生故障時,提供設定好的回退方案。 d.使用熔斷機制,防止故障擴散到其他服務。 e.提供熔斷器的監控元件 Hystriⅸ Dashboard,可以實時監控熔斷器的狀態。

怎樣在RestTemp 上使用熔斷器

在之前的eureka-client-ribbon 專案上進行改造:

首先增加依賴:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

在啟動類EurekaClientRibbonApplication上新增@EnableHystrix註解

@EnableHystrix
@EnableEurekaClient
@SpringBootApplication
@ComponentScan("com.springcloud.demo.eurekaclientribbon")
public class EurekaClientRibbonApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientRibbonApplication.class, args);
	}
}

修改RibbonService 在main()方法上新增@HystrixCommand

@Service
public class RibbonService {
    @Autowired
    RestTemplate restTemplate;
    @HystrixCommand(fallbackMethod = "errorFallbackMsg")
    public int main(){
        return restTemplate.getForObject("http://eureka-client/main",Integer.class);
    }

    public int errorFallbackMsg(){
        return -2;
    }
}
fallbackMethod引數是在熔斷器開啟時,即遠端服務呼叫失敗時執行的方法名。

啟動eureka-client-ribbon ,關閉兩個eureka-client 例項,請求http://localhost:8795/main

返回-2,熔斷器生效。

在Feign上使用熔斷器

新增依賴

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

在老版本中 由於feign 中使用了hytrix,因此不需要加入依賴,但是新版本中會報錯找不到類

Caused by: java.lang.ClassNotFoundException: com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect  

新增配置

eign.hystrix.enabled=true

開啟Hytrix 功能。

修改FeignService,新增引數fallback。

@FeignClient(value = "eureka-client", configuration = FeignConfig.class,fallback = MainHystrixError.class)
public interface FeignService {
    @GetMapping("main")
    int main();
}

建立熔斷器邏輯處理類MainHystrixError,當請求遠端服務失敗時執行。

@Component
public class MainHystrixError implements FeignService {
    @Override
    public int main() {
        return -1;
    }
}

關閉兩個eureka-client 例項,啟動eureka-client-feign,請求:http://localhost:8794/main 返回-1,說明熔斷器功能開啟。