
在微服務(wù)架構(gòu)中,我們將系統(tǒng)拆分為很多個(gè)服務(wù),各個(gè)服務(wù)之間通過(guò)注冊(cè)與訂閱的方式相互依賴,由于各個(gè)服務(wù)都是在各自的進(jìn)程中運(yùn)行,就有可能由于網(wǎng)絡(luò)原因或者服務(wù)自身的問(wèn)題導(dǎo)致調(diào)用故障或延遲,隨著服務(wù)的積壓,可能會(huì)導(dǎo)致服務(wù)崩潰。為了解決這一系列的問(wèn)題,斷路器等一系列服務(wù)保護(hù)機(jī)制出現(xiàn)了。
一、Hystrix簡(jiǎn)介
Netflix提供了一個(gè)叫Hystrix的類庫(kù),它實(shí)現(xiàn)了斷路器模式。在微服務(wù)架構(gòu)中,通常一個(gè)微服務(wù)會(huì)調(diào)用多個(gè)其他的微服務(wù)。一個(gè)相對(duì)低層級(jí)的服務(wù)失敗可能造成上層應(yīng)用的級(jí)聯(lián)失敗,服務(wù)訪問(wèn)量越大失敗率越高。當(dāng)斷路打開(kāi)的時(shí)候,這個(gè)調(diào)用就被終止了。打開(kāi)的斷路可以阻止級(jí)聯(lián)失敗。

較底層的服務(wù)如果出現(xiàn)故障,會(huì)導(dǎo)致連鎖故障。當(dāng)對(duì)特定的服務(wù)的調(diào)用的不可用達(dá)到一個(gè)閥值(Hystric 是5秒20次) 斷路器將會(huì)被打開(kāi)。

二、Hystrix使用
這里我們使用之前的Client項(xiàng)目進(jìn)行演示。
1.在服務(wù)調(diào)用方添加pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
2.添加@EnableCircuitBreaker注解
這個(gè)注解只需要在springboot工程的啟動(dòng)application類上就好了
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
//@SpringCloudApplication
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
這時(shí)我們發(fā)現(xiàn)我們的啟動(dòng)類上添加了很多的注解,所以Spring Cloud將這些注解封裝了一下,提供了一個(gè)@SpringCloudApplication的注解:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
3.對(duì)要服務(wù)進(jìn)行降級(jí)
之前的例子里我們有一個(gè)restHello的接口,這個(gè)接口調(diào)用的Discovery的hello接口。
我們現(xiàn)在在他上面添加一個(gè)@HystrixCommand注解
@HystrixCommand(fallbackMethod = "helloFallback")
@GetMapping("/restHello")
public String CliHello() {
return restTemplate.getForObject("http://discovery/hello",String.class);
}
我們使用fallbackMethod屬性指定一個(gè)fallback方法,在需要降級(jí)的時(shí)候調(diào)用這個(gè)方法
private String helloFallback() {
return "哎呀,服務(wù)器開(kāi)小差了!請(qǐng)稍后再試。";
}
這時(shí)候我們將服務(wù)端和客戶端都啟動(dòng)進(jìn)行訪問(wèn)

這時(shí)候我們將服務(wù)端Discover關(guān)掉然后再訪問(wèn)這個(gè)地址,他就會(huì)去訪問(wèn)降級(jí)的地址

這樣我們就實(shí)現(xiàn)了服務(wù)降級(jí)。但是這樣需要沒(méi)一個(gè)接口都添加這個(gè)注解,有沒(méi)有更快一點(diǎn)的方法呢?
4.配置默認(rèn)服務(wù)降級(jí)注解
在類上添加@DefaultProperties注解配置默認(rèn)的降級(jí)方法
@RestController
@RefreshScope
@DefaultProperties(defaultFallback = "helloFallback")
public class ClientController {
//@HystrixCommand(fallbackMethod = "helloFallback")
@GetMapping("/restHello")
public String CliHello() {
return restTemplate.getForObject("http://discovery/hello",String.class);
}
private String helloFallback() {
return "哎呀,服務(wù)器開(kāi)小差了!請(qǐng)稍后再試。";
}
}
這樣我們?cè)龠M(jìn)行剛才的操作,可以發(fā)現(xiàn)是同樣的效果_

本文作者: catalinaLi
本文鏈接: http://catalinali.top/2018/startHystrix/
版權(quán)聲明: 原創(chuàng)文章,有問(wèn)題請(qǐng)?jiān)u論中留言。非商業(yè)轉(zhuǎn)載請(qǐng)注明作者及出處。