Eclipse初次搭建SpringCloud斷路器(五)
在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互呼叫(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來呼叫。為了保證其高可用,單個服務通常會叢集部署。由於網路原因或者自身的原因,服務並不能保證100%可用,如果單個服務出現問題,呼叫這個服務就會出現執行緒阻塞,此時若有大量的請求湧入,Servlet容器的執行緒資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應。
為了解決這個問題,業界提出了斷路器模型。
一、斷路器簡介
has created a library called Hystrix that implements the circuit breaker pattern. In a microservice architecture it is common to have multiple layers of service calls.. —-摘自官網
Netflix開源了Hystrix元件,實現了斷路器模式,SpringCloud對這一元件進行了整合。 在微服務架構中,一個請求需要呼叫多個服務是非常常見的,如下圖:
較底層的服務如果出現故障,會導致連鎖故障。當對特定的服務的呼叫的不可用達到一個閥值(Hystric 是5秒20次) 斷路器將會被開啟。
斷路開啟後,可用避免連鎖故障,fallback方法可以直接返回一個固定值。
二、Ribbon+Hystrix
pom檔案新增jar檔案
<!-- 斷路器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
啟動類新增@EnableHystrix 註解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient // 定義為客戶端
@EnableHystrix // 設定斷路器
public class RibbonApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
/**
* @LoadBalanced註解表明這個restRemplate開啟負載均衡的功能。
* @return
*/
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
HelloService類配置斷路方法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
/**
* 問題一: 什麼是REST REST(RepresentationalState Transfer)是Roy Fielding
* 提出的一個描述互聯絡統架構風格的名詞。REST定義了一組體系架構原則,您可以根據這些原則設計以系統資源為中心的Web
* 服務,包括使用不同語言編寫的客戶端如何通過 HTTP處理和傳輸資源狀態。
*
* 為什麼稱為 REST?Web本質上由各種各樣的資源組成,資源由URI
* 唯一標識。瀏覽器(或者任何其它類似於瀏覽器的應用程式)將展示出該資源的一種表現方式,或者一種表現狀態。
* 如果使用者在該頁面中定向到指向其它資源的連結,則將訪問該資源,並表現出它的狀態。
* 這意味著客戶端應用程式隨著每個資源表現狀態的不同而發生狀態轉移,也即所謂REST。
*
* 問題二: RestTemplate Spring'scentral class for synchronous client-side HTTP
* access.It simplifies communication with HTTPservers, and enforces RESTful
* principles. Ithandles HTTP connections, leaving application code to provide
* URLs(with possible template variables) andextract results.
* 簡單說就是:簡化了發起HTTP請求以及處理響應的過程,並且支援REST
*
* @author 於志強
*
* 2018年11月28日 上午11:10:45
*/
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate; //
@HystrixCommand(fallbackMethod = "hiError") // hiError是你服務斷後走的方法名字
public String hiService() {
return restTemplate.getForObject("http://CLIENTNAME/test", String.class);
}
public String hiError() {
return "頁面訪問不到,走到失敗結果";
}
}
三、測試方法
啟動discSystem-3
啟動ribbon專案
啟動discSystem-4專案
------------------------------------------------------------------------------------------------------------------------------------------------------
一、Feign+Hystrix
Feign是自帶斷路器的,在D版本的Spring Cloud中,它沒有預設開啟。需要在配置檔案中配置開啟它,在配置檔案加以下程式碼:
feign:
hystrix:
enabled: true
SchedualCilentName類新增fallback = SchedualServiceHiHystric.class SchedualServiceHiHystric 為該介面實現類
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* 定義一個Feign介面類
* @author 於志強
*
* 2018年11月28日 上午11:43:20
*/
@FeignClient(value = "clientName",fallback = SchedualServiceHiHystric.class)
public interface SchedualCilentName {
// value值必須與discSystem-4、discSystem-4-1中方法名一致
@RequestMapping(value = "/test",method = RequestMethod.GET)
String sayHiFromClientOne();
}
建立SchedualServiceHiHystric類(SchedualServiceHiHystric需要實現SchedualServiceHi 介面,並注入到Ioc容器中)
import org.springframework.stereotype.Component;
@Component
public class SchedualServiceHiHystric implements SchedualCilentName {
@Override
public String sayHiFromClientOne() {
return "sorry";
}
}
不需要修改pom檔案
二、測試方法
啟動discSystem-3
啟動service-feign專案
啟動discSystem-4專案