在微服務(wù)架構(gòu)中,我們將系統(tǒng)拆分成了一個個的服務(wù)單元茸塞,各單元應(yīng)用間通過服務(wù)注冊與訂閱的方式互相依賴躲庄。由于每個單元都在不同的進程中運行,依賴通過遠程調(diào)用的方式執(zhí)行钾虐,這樣就有可能因為網(wǎng)絡(luò)原因或是依賴服務(wù)自身問題出現(xiàn)調(diào)用故障或延遲读跷,而這些問題會直接導致調(diào)用方的對外服務(wù)也出現(xiàn)延遲,若此時調(diào)用方的請求不斷增加禾唁,最后就會出現(xiàn)因等待出現(xiàn)故障的依賴方響應(yīng)而形成任務(wù)積壓效览,線程資源無法釋放无切,最終導致自身服務(wù)的癱瘓,進一步甚至出現(xiàn)故障的蔓延最終導致整個系統(tǒng)的癱瘓丐枉。如果這樣的架構(gòu)存在如此嚴重的隱患哆键,那么相較傳統(tǒng)架構(gòu)就更加的不穩(wěn)定。為了解決這樣的問題瘦锹,因此產(chǎn)生了斷路器等一系列的服務(wù)保護機制籍嘹。
針對上述問題,在Spring Cloud Hystrix中實現(xiàn)了線程隔離弯院、斷路器等一系列的服務(wù)保護功能辱士。它也是基于Netflix的開源框架 Hystrix實現(xiàn)的,該框架目標在于通過控制那些訪問遠程系統(tǒng)听绳、服務(wù)和第三方庫的節(jié)點颂碘,從而對延遲和故障提供更強大的容錯能力。Hystrix具備了服務(wù)降級椅挣、服務(wù)熔斷头岔、線程隔離、請求緩存鼠证、請求合并以及服務(wù)監(jiān)控等強大功能峡竣。
接下來,我們就從一個簡單示例開始對Spring Cloud Hystrix的學習與使用量九。
在開始使用Spring Cloud Hystrix實現(xiàn)斷路器之前适掰,我們先拿之前實現(xiàn)的一些內(nèi)容作為基礎(chǔ),其中包括:
eureka-server工程:服務(wù)注冊中心荠列,端口:1001
eureka-client工程:服務(wù)提供者类浪,兩個實例啟動端口分別為2001
下面我們可以復制一下之前實現(xiàn)的一個服務(wù)消費者:eureka-consumer-ribbon,命名為eureka-consumer-ribbon-hystrix弯予。下面我們開始對其進行改在:
第一步:pom.xml的dependencies節(jié)點中引入spring-cloud-starter-hystrix依賴:
org.springframework.cloud
spring-cloud-starter-hystrix
第二步:在應(yīng)用主類中使用@EnableCircuitBreaker或@EnableHystrix注解開啟Hystrix的使用:
@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
publicclassApplication{
@Bean
@LoadBalanced
publicRestTemplaterestTemplate(){
returnnewRestTemplate();
}
publicstaticvoidmain(String[] args){
newSpringApplicationBuilder(Application.class).web(true).run(args);
}
}
注意:這里我們還可以使用Spring Cloud應(yīng)用中的@SpringCloudApplication注解來修飾應(yīng)用主類戚宦,該注解的具體定義如下所示。我們可以看到該注解中包含了上我們所引用的三個注解锈嫩,這也意味著一個Spring Cloud標準應(yīng)用應(yīng)包含服務(wù)發(fā)現(xiàn)以及斷路器受楼。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public@interfaceSpringCloudApplication {
}
第三步:改造服務(wù)消費方式,新增ConsumerService類呼寸,然后將在Controller中的邏輯遷移過去艳汽。最后,在為具體執(zhí)行邏輯的函數(shù)上增加@HystrixCommand注解來指定服務(wù)降級方法对雪,比如:
@RestController
publicclassDcController{
@Autowired
ConsumerService consumerService;
@GetMapping("/consumer")
publicStringdc(){
returnconsumerService.consumer();
}
classConsumerService{
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod ="fallback")
publicStringconsumer(){
returnrestTemplate.getForObject("http://eureka-client/dc", String.class);
}
publicStringfallback(){
return"fallback";
}
}
}
下面我們來驗證一下上面Hystrix帶來的一些基礎(chǔ)功能河狐。我們先把涉及的服務(wù)都啟動起來,比如:Services: [eureka-consumer-ribbon-hystrix, eureka-client]。
為了觸發(fā)服務(wù)降級邏輯馋艺,我們可以將服務(wù)提供者eureka-client的邏輯加一些延遲栅干,比如:
@GetMapping("/dc")
publicStringdc()throwsInterruptedException{
Thread.sleep(5000L);
String services ="Services: "+ discoveryClient.getServices();
System.out.println(services);
returnservices;
}
重啟eureka-client之后,此時我們將獲得的返回結(jié)果為:fallback捐祠。我們從eureka-client的控制臺中碱鳞,可以看到服務(wù)提供方輸出了原本要返回的結(jié)果,但是由于返回前延遲了5秒踱蛀,而服務(wù)消費方觸發(fā)了服務(wù)請求超時異常窿给,服務(wù)消費者就通過HystrixCommand注解中指定的降級邏輯進行執(zhí)行,因此該請求的結(jié)果返回了fallback率拒。這樣的機制崩泡,對自身服務(wù)起到了基礎(chǔ)的保護,同時還為異常情況提供了自動的服務(wù)降級切換機制猬膨。
從現(xiàn)在開始角撞,我這邊會將近期研發(fā)的springcloud微服務(wù)云架構(gòu)的搭建過程和精髓記錄下來,幫助更多有興趣研發(fā)spring cloud框架的朋友寥掐,希望可以幫助更多的好學者靴寂。大家來一起探討spring cloud架構(gòu)的搭建過程及如何運用于企業(yè)項目磷蜀。源碼來源