介紹
- 雪崩效應
在微服務架構中服務與服務之間能夠相互調用,因爲網絡緣由或者自身的緣由,服務並不能保證100%可用,若是單個服務出現問題,調用這個服務就會佔用愈來愈多的系統資源,致使服務癱瘓。因爲服務與服務之間的依賴性,故障會傳播,會對整個微服務系統形成影響,這就是服務故障的「雪崩」效應。
- 斷路器
「斷路器」是一種開關裝置,當某個服務發生故障監控(相似熔斷保險絲),向調用方法返回一個備選的響應,而不是長時間的等待或者拋出調用方法沒法處理的異常,這樣就保證了服務調用方的線程不會被長時間、沒必要要地佔用,從而避免了故障在分佈式系統中的蔓延,乃至雪崩。
- 熔斷模式
在對某個服務調用不可用達到一個閾值,5秒內20次調用失敗就會就會啓動熔斷模式。熔斷器的開關是由服務的健康情況(服務的健康情況 = 請求失敗數 / 請求總數
)決定的。當斷路器開關關閉時請求能夠經過,一但服務器健康情況低於設定閾值斷路器就會打開,請求會被禁止經過。當斷路器處於打開狀態時,一段時間後會進入半開狀態,這時只容許一個請求經過,若是該請求成功熔斷器恢復到關閉狀態,若是調用失敗斷路器繼續保持打開。
- 服務降級
服務降級,通常是從總體符合考慮,就是當某個服務熔斷以後,服務器將再也不被調用,此刻客戶端能夠本身準備一個本地的fallback回調,返回一個缺省值。
Ribbon中使用Hystrix
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
@Service
public class HelloServiceRibbonSer {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "helloError")
public String helloServiceRibbon(String helloName) {
return restTemplate.getForObject("http://say-hello/sayHello?helloName="+helloName,String.class);
}
public String helloError(String helloName) {
return "hello,"+helloName+",error!";
}
}
@Autowired
private HelloServiceRibbonSer helloServiceRibbonSer;
@GetMapping("/ribbonHello")
public String ribbonHelloCtr(@RequestParam("helloName")String helloName){
return helloServiceRibbonSer.helloServiceRibbon(helloName);
}
在helloServiceRibbon方法的頭上加了@HystrixCommand(fallbackMethod = "helloError")註解,表明對這個方法使用了Hystrix相關的功能,fallbackMethod屬性是調用回調以後的處理方法。
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient //向服務中心註冊
@EnableHystrix //啓動Hystrix
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRibbonApplication.class, args);
}
}
- 啓動項目
啓動註冊中心和service-ribbon,不啓動say-hello項目(服務提供者),在瀏覽器地址欄訪問http://localhost:3333/ribbonHello?helloName=aaa發現調用了fallbackMethod中的方法。
Feign中使用Hystrix
@FeignClient(value = "say-hello",fallback = SayHelloFeignSerHiHystric.class)
public interface SayHelloFeignSer {
@RequestMapping(value = "/sayHello",method = RequestMethod.GET)
String feignSayHelloSer(@RequestParam(value = "helloName") String helloName);
}
@Component
public class SayHelloFeignSerHiHystric implements SayHelloFeignSer{
@Override
public String feignSayHelloSer(String helloName) {
return "發生錯誤 !"+helloName;
}
}
#打開斷路器,D版本以後默認關閉
feign.hystrix.enabled=true
- 啓動項目
啓動註冊中心,service-feign,不啓動say-hello項目。在瀏覽器地址欄訪問:http://localhost:4444/feignSayHello?helloName=adaad,發現調用了fallback中的方法。
- fallbackFactory使用
若是要熔斷的功能或者業務比較複雜可使用一個工廠來封裝,而後直接使用fallbackFactory來標註。
修改SayHelloFeignSer
@FeignClient(value = "say-hello",fallbackFactory = HystrixFallBackFactory.class/*fallback = SayHelloFeignSerHiHystric.class*/)
public interface SayHelloFeignSer {
@RequestMapping(value = "/sayHello",method = RequestMethod.GET)
String feignSayHelloSer(@RequestParam(value = "helloName") String helloName);
}
public interface UserFeignWithFallBackFactoryClient extends SayHelloFeignSer {
}
@Component
public class HystrixFallBackFactory implements FallbackFactory<SayHelloFeignSer> {
@Override
public SayHelloFeignSer create(Throwable throwable) {
return new SayHelloFeignSer(){
@Override
public String feignSayHelloSer(String helloName) {
return "error";
}
@Override
public String manyParamsSer(String userName, String userPassword) {
return "error";
}
@Override
public Object objParamsCtr(Object user) {
return "error";
}
};
}
}