【Springcloud專欄七】Hystrix服務熔斷與服務降級

目錄

服務熔斷

服務降級

熔斷器

Hystrix熔斷器的使用【在服務調用方配置】

    1、引入依賴

    2、啓動類上加註解【服務調用方 】@EnableCircuitBreaker

    3、配置降級策略

    4、實現效果


服務熔斷

        當某服務出現不可用或響應超時的情況時,爲了防止整個系統出現雪崩,暫時停止對該服務的調用。

服務降級

        服務降級是從整個系統的負荷情況出發和考慮的,對某些負荷會比較高的情況,爲了預防某些功能(業務場景)出現負荷過載或者響應慢的情況,在其內部暫時捨棄對一些非核心的接口和數據的請求而直接返回一個提前準備好的fallback(退路)錯誤處理信息。這樣,雖然提供的是一個有損的服務,但卻保證了整個系統的穩定性和可用性。【空閒出線程或資源】

共同點:保證了整個系統的穩定性和可用性

不同點:熔斷一般是下行程序故障,服務降級是爲了解決整體項目的負荷

熔斷器

        三個狀態:打開、半打開、關閉

        默認情況,在最近的20次請求中出現50%超時的情況,會斷開服務。如果仍有請求則會直接返回失敗信息fallback,該服務默認情況下會在關閉狀態持續5S,之後會放行一定的請求進入半打開狀態,如果放行的請求出現超時情況,重新進入關閉狀態。

Hystrix熔斷器的使用【在服務調用方配置】

    1、引入依賴

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

    2、啓動類上加註解【服務調用方 】@EnableCircuitBreaker

@EnableCircuitBreaker  // 服務熔斷
@EnableDiscoveryClient // 內部既能兼容eurake又能兼容zookeeper
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
//@SpringCloudApplication
public class ConsumerApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class);
    }
}

    3、配置降級策略

        3.1、方法級別標註服務降級

@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @HystrixCommand(fallbackMethod = "queryByIdFallback")
    public String queryById(@PathVariable("id")BigDecimal id){
        String url = "http://user-service/user/" + id;
        String user = restTemplate.getForObject(url, String.class);
        return user;
    }

    public String queryByIdFallback(BigDecimal id){
        return "服務器忙";
    }
}

        3.2、類級別默認降級策略

a.@DefaultProperties(defaultFallback = "queryByIdFallback")

b.queryByIdFallback方法此時不能寫參數,返回值也不用一致

@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "queryByIdFallback")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
    })
    public String queryById(@PathVariable("id")BigDecimal id){
        String url = "http://user-service/user/" + id;
        String user = restTemplate.getForObject(url, String.class);
        return user;
    }

    public String queryByIdFallback(){
        return "服務器忙";
    }
}

    4、實現效果

 

觸發熔斷的最小請求次數10

觸發熔斷的失敗請求次數最小佔比60

休眠時長10S

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章