[微服務-sc-05] SpringCloud-Hystrix
阿新 • • 發佈:2020-10-27
Hystrix
在微服務應用中,服務存在一定的依賴關係,如果某個目標服務呼叫慢或者有大量超時造成服務不可用,間接導致其他的依賴服務不可用,最嚴重的可能會阻塞整條依賴鏈,最終導致業務系統崩潰(又稱雪崩效應)。
斷路器是一種開關設定,當某個服務單元發生故障之後,通過斷路器的故障監控,向呼叫方返回一個符合預期的服務降級處理(fallback),而不是長時間的等待或者丟擲呼叫方無法處理的異常,這樣保證了服務呼叫方的執行緒不會長時間被佔用,從而避免了故障在分散式系統的蔓延乃至崩潰。
fallback 相當於是降級操作。對於查詢操作, 我們可以實現一個 fallback 方法, 當請求後端服務出現異常的時候, 可以使用 fallback 方法返回的值。 fallback 方法的返回值一般是設定的預設值或者來自快取,告知後面的請求服務不可用了,不要再請求了。
Spring Cloud Hystrix 實現了斷路器、執行緒隔離等一系列服務保護功能。它是基於 Netflix 的開源框架 Hystrix 實現的,該框架的目的在於通過控制訪問遠端系統、服務和第三方庫節點,從而對延遲和故障提供更強大的容錯能力。
Hystrix 具備服務熔斷、服務降級、執行緒和訊號隔離、請求快取、請求合併以及服務監控的能力。
在ribbon使用斷路器
1 新增依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
2 啟動類
@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 public class HelloService { @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "hiError") public String hiService(String name) { return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class); } public String hiError(String name) { return "hi,"+name+",sorry,error!"; } }
當服務不可用會直接返回錯誤資訊。
Feign中使用斷路器
1 修改配置
//Feign是自帶斷路器的
feign.hystrix.enabled=true
2 方法改造
@FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
@RequestMapping(value = "/hi",method = RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
@Override
public String sayHiFromClientOne(String name) {
return "sorry "+name;
}
}