SpringCloud之斷路器Hystrix
斷路器Hystrix簡介
由於網路原因或者自身的原因,服務並不能保證100%可用
,如果單個服務出現問題
,呼叫這個服務就會出現執行緒阻塞
,此時若有大量的請求湧入,Servlet容器的執行緒資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性
,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應
。
雪崩應對策略:
- 流量控制:控制的方式有很多種,類似佇列,令牌,漏桶等等。
- 閘道器限流: 因為
Nginx
的高效能, 目前一線網際網路公司大量採用Nginx+Lua
的閘道器進行流量控制, 由此而來的OpenResty
也越來越熱門. 使用OpenResty
,其是由Nginx核心
Lua開發環境
,使得Nginx
可以作為一個Web Server
使用。 藉助於Nginx
的事件驅動模型
和非阻塞IO
,可以實現高效能的Web應用程式。
而且OpenResty
提供了大量元件如Mysql、Redis、Memcached
等等,使在Nginx
上開發Web應用
更方便更簡單。目前在京東如實時價格、秒殺、動態服務、單品頁、列表頁等都在使用Nginx+Lua
架構,其他公司如淘寶、去哪兒網等。 - 使用者互動限流:友好的提示,從源端限制流量流入。
基於Netflix的開源框架 Hystrix實現的 框架目標在於通過控制那些訪問遠端系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備了服務降級、服務熔斷、執行緒隔離、請求快取、請求合併以及服務監控等強大功能。
斷路器Hystrix實踐
一、在Ribbon中使用Hystrix
①pom檔案新增依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
②啟動類上面,添加註解@EnableHystrix
③RibbonService
package com.yj.hystrix.ribbon.service; 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; @Service public class RibbonService { @Autowired private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "ribbonError") public String hiRibbon(String name) { return restTemplate.getForObject("http://EUREKA-CLIENT/hiEureka?name=" + name, String.class); } public String ribbonError(String name) { return "sorry " + name; } }
二、在Feign中使用斷路器
①Feign是自帶斷路器的,在D版本的Spring Cloud之後,它沒有預設開啟。需要在application.properties配置檔案中配置開啟:
feign.hystrix.enabled=true
②FeignService
package com.yj.hystrix.feign.service;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "eureka-client",fallback = FeignServiceHiHystric.class)
public interface FeignService {
@RequestMapping(value = "/hiEureka", method = RequestMethod.GET)
String hiFeign(@RequestParam(value = "name") String name);
}
③FeignServiceHiHystric
package com.yj.hystrix.feign.service;
import org.springframework.stereotype.Component;
@Component
public class FeignServiceHiHystric implements FeignService {
@Override
public String hiFeign(String name) {
return "sorry "+name;
}
}
④HystrixController
package com.yj.hystrix.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.yj.hystrix.feign.service.FeignService;
import com.yj.hystrix.ribbon.service.RibbonService;
@RestController
public class HystrixController {
@Autowired
private FeignService feignService;
@Autowired
private RibbonService ribbonService;
@GetMapping(value = "/hiHystrixFeign")
public String hiFeign(@RequestParam String name) {
return feignService.hiFeign(name);
}
@GetMapping(value = "/hiHystrixRibbon")
public String hiRibbon(@RequestParam String name) {
return ribbonService.hiRibbon(name);
}
}
⑤部署啟動,將Hystrix專案也註冊到Eureka
當eureka-client專案正常啟動時,訪問 http://192.168.37.141:8007/hiHystrixRibbon?name=yj或者http://192.168.37.141:8007/hiHystrixFeign?name=yj,均顯示正常 hi yj ,i am from port:8004
eureka-client專案關閉後,訪問 http://192.168.37.141:8007/hiHystrixRibbon?name=yj或者http://192.168.37.141:8007/hiHystrixFeign?name=yj,顯示 sorry yj,則可以驗證Hystrix生效了