天天看點

springcloud 入門(4) Hystrix

Hystrix

  • ​​Hystrix介紹​​
  • ​​設計目标​​
  • ​​快速入手​​
  • ​​服務提供方正常,接口報錯​​
  • ​​服務提供方失聯​​
  • ​​實作feign.hystrix.FallbackFactory​​
  • ​​在消費端實作生産端接口​​

Hystrix介紹

在分布式系統環境中,微服務之間難免會互相依賴調用,也難免會遇到服務調用失敗的情況,這時就需要一個公共元件來維護系統的健壯性,保證系統有一定的容錯能力,并且對服務進行監控和保護,Hystrix就是這個公共元件,它能夠在服務失效的情況下,通過隔離系統依賴的方式防止服務級聯失敗。

Hystrix是Netflix的一個開源元件,2011-2012年誕生并成熟,Netflix的很多項目都使用了Hystrix。

設計目标

1、為通過第三方用戶端庫通路的依賴項(通常通過網絡)提供保護和控制延遲和故障

2、停止複雜分布式系統中的級聯故障

3、故障快速恢複。

4、在可能的情況下,後退并優雅地降級

5、啟用近實時監視、警報和操作控制

快速入手

對于服務熔斷需要考慮兩種情況:

1、服務提供方正常,但是接口報錯

2、服務提供方失聯

服務提供方正常,接口報錯

對于這種情況更像是異常處理。

分以下三個步驟:

1、服務提供方引入Hystrix 依賴

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

2、在服務提供方啟動類加注解

@EnableDiscoveryClient
@EnableCircuitBreaker
@EnableEurekaClient
@SpringBootApplication(scanBasePackages = {"site.sunlong.*.*"})
public class EurekaProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaProviderApplication.class, args);
    }
}      

3、對外提供的接口添加@HystrixCommand注解,fallbackMethod配置調用類的指定方法

ProviderController.java

@RequestMapping("/provider")
@RestController
public class ProviderController {
    @Resource
    private ApplicationArguments applicationArguments;
    @Autowired
    private ProviderService providerService;

    @GetMapping("/hello")
    public String test(){
        final String[] sourceArgs = applicationArguments.getSourceArgs();
        System.out.println(Arrays.toString(sourceArgs));
        return "Hello , I'm provider ,args:"+ Arrays.toString(sourceArgs);
    }

    @HystrixCommand(fallbackMethod = "testHystrixFallBack")
    @GetMapping("/getName/{name}")
    public String testHystrix(@PathVariable String name) throws Exception {
        return providerService.getArgs(name);
    }

    String testHystrixFallBack(@PathVariable String name){
        return "name: "+name +" is not exist.";
    }

}      

ProviderServiceImpl.java

@Service
public class ProviderServiceImpl implements ProviderService {
    @Resource
    private ApplicationArguments applicationArguments;

    /**
     * 擷取啟動參數
     *
     * @return
     */
    @Override
    public String getArgs(String name) throws Exception {
        if ("ex".equals(name)) {
            throw new Exception();
        }
        return name+"---"+Arrays.toString(applicationArguments.getSourceArgs());
    }
}      

測試:

浏覽器位址欄輸入服務者調用接口

正确調用:

springcloud 入門(4) Hystrix

輸入報錯參數調用:

springcloud 入門(4) Hystrix

服務提供方失聯

如果服務提供方失聯為了更友好的體驗,要在消費端進行及時的降級

首先要在消費端配置檔案中添加 feign.hystrix.enabled=true

然後進行回報,降級回報有兩種實作方式

實作feign.hystrix.FallbackFactory

@Component
public class ProviderFallbackFactory implements FallbackFactory<ProviderService> {
    @Override
    public ProviderService create(Throwable throwable) {
        return new ProviderServiceFallback();
    }
}      

在消費端實作生産端接口

@Component
public class ProviderServiceFallback implements ProviderService {
    @Override
    public String test() {
        return "consumer - test - fallback";
    }
    @Override
    public String testHystrix(String name) {
        return "consumer -testHystrix- fallback";
    }
}      

FeignClient注解修改:

如果是第一張方式添加屬性fallbackFactory = ProviderFallbackFactory.class

否則添加屬性fallback = ProviderServiceFallback.class

@FeignClient(name = "PROVIDER" , path = "provider" , fallback = ProviderServiceFallback.class)
//@FeignClient(name = "PROVIDER" , path = "provider" , fallbackFactory = ProviderFallbackFactory.class)
public interface ProviderService {

    @GetMapping("hello")
    public String test();

    @GetMapping("getName/{name}")
    public String testHystrix(@PathVariable String name);

}      

測試:

停掉服務提供方,進行接口測試:

springcloud 入門(4) Hystrix

至此一個Hystrix的簡單使用就完成了,下篇将會學習一下HystrixDashboard的使用

springcloud 搭建更多請檢視:

​​springcloud 項目一步一步搭建(1)之eureka​​

​​springcloud 項目一步一步搭建(2)之Ribbon​​

​​springcloud 項目一步一步搭建(3)之Feign​​

GitHub位址:

https://github.com/ArronSun/micro-services-practice.git