1. 程式人生 > >springcloud入門之熔斷器hystrix

springcloud入門之熔斷器hystrix

在使用springcloud搭建為服務架構專案中,我們會根據業務或功能將系統拆分為多個服務單元,各個單元之間通過服務註冊和訂閱的方式相互依賴和呼叫功能,隨著專案和業務的不斷拓展,服務單元數量增多,相互之間的依賴關係更為複雜,可能會出現當某個服務出現問題或網路原因出現依賴調用出錯或延遲,此時如果呼叫該依賴的請求不斷增加,Servlet容器的執行緒資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應。為了解決這種單點或多點問題造成的連鎖問題,就有了熔斷器的出現。

一、在ribbon上實現熔斷器hystrix

改造serice-ribbon 工程的程式碼
1.pox.xml檔案中加入hystrix的起步依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

2.在程式啟動類application上添加註解@EnableHystrix開啟hystrix功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ServiceRibbonApplication
{
public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } }

3.在service方法上添加註解@HystrixCommand(fallbackMethod = “method”)指定熔斷點並指定熔斷方法

@Service
public class TestService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "testError")
    public  String testService(String name){
        return restTemplate.getForObject("http://SERVICE-HELLO/index?name="+name,String.class);
    }

    public String testError(String name){
        return "sorry, "+name+"訪問 SERVICE-HELLO服務 出錯";
    }
}

啟動eureka-server註冊中心,再啟動eureka-client服務提供者,最後啟動service-ribbon服務消費者
開啟瀏覽器訪問url:http://localhost:9001/test?name=hao 檢視服務正常時返回

服務提供者client:hao服務埠:8081

關閉eureka-client,再訪問url地址,發現熔斷器已生效,返回熔斷方法欄位

sorry, hao訪問 SERVICE-HELLO服務 出錯

這就說明當 SERVICE-HELLO 服務不可用的時候,server-ribbon呼叫 SERVICE-HELLO的API介面時,會執行快速失敗,直接返回一組字串,而不是等待響應超時,這很好的控制了容器的執行緒阻塞。

二、在feign上實現熔斷器

feign已經自帶斷容器不需要再單獨引用hystrix依賴,只不過在feign中熔斷器功能預設是未開啟的,需要在配置檔案中開啟。

1.在application.yml中開啟熔斷器

feign:
  hystrix:
      enabled: true

2.直接在service-feign的TestFeignService介面的@FeignClient註解加上fallback屬性並指定其熔斷類就行了

@FeignClient(value = "SERVICE-HELLO",fallback = TestFeignServiceFallback.class)
public interface TestFeignService {
    /**
     * @RequestMapping指定呼叫到服務的那個介面,@RequestParam("name")指定傳入的引數名
     */
    @RequestMapping(value = "index",method = RequestMethod.GET)
    String testEurekaClient(@RequestParam("name")String name);
}

3.自定義類TestFeignServiceFallback 實現 TestFeignService 介面並在相應的重寫方法中執行熔斷業務

@Component
public class TestFeignServiceFallback implements TestFeignService {

    @Override
    public String testEurekaClient(String name){
        return "sorry, "+name+"訪問 SERVICE-HELLO服務 出錯";
    }
}

注:自定義的熔斷類還需要加上@Component註解方式注入容器,否則當熔斷執行時會出現找不到類的異常。

啟動eureka-server註冊中心,再啟動eureka-client服務提供者,最後啟動service-ribbon服務消費者
開啟瀏覽器訪問url:http://localhost:9002/testFeign?name=aaa 檢視服務正常時返回

服務提供者client:aaa服務埠:8081

關閉eureka-client,再訪問url地址,發現熔斷器已生效,執行熔斷類返回熔斷方法欄位

sorry, aaa訪問 SERVICE-HELLO服務 出錯