1. 程式人生 > 實用技巧 >[微服務-sc-05] SpringCloud-Hystrix

[微服務-sc-05] SpringCloud-Hystrix

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;
    }
}