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());
}
}
測試:
浏覽器位址欄輸入服務者調用接口
正确調用:
輸入報錯參數調用:
服務提供方失聯
如果服務提供方失聯為了更友好的體驗,要在消費端進行及時的降級
首先要在消費端配置檔案中添加 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);
}
測試:
停掉服務提供方,進行接口測試:
至此一個Hystrix的簡單使用就完成了,下篇将會學習一下HystrixDashboard的使用
springcloud 搭建更多請檢視:
springcloud 項目一步一步搭建(1)之eureka
springcloud 項目一步一步搭建(2)之Ribbon
springcloud 項目一步一步搭建(3)之Feign
GitHub位址:
https://github.com/ArronSun/micro-services-practice.git