springcloud之Hystrix熔斷器

Moshow鄭鍇發表於2020-04-07

雪崩效應

在分散式系統中,各個服務相互呼叫相互依賴,如果某個服務掛了,很可能導致其他呼叫它的一連串服務也掛掉或者在不斷等待耗盡伺服器資源,這種現象稱之為伺服器雪崩效應

熔斷機制

未來防止系統雪崩,熔斷機制必不可少,就是當一個服務掛掉後,呼叫它的服務能快速熔斷,不再耗費資源,快速失敗並提供回退方案

Hystrix

Hystrixspring cloud全家桶的Circuit Breaker熔斷器元件,提供了熔斷器功能,能夠阻止聯動故障,並提供故障的解決方案,提供系統彈性;

maven依賴

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

application.yml

在配置檔案中開啟熔斷器

#開啟熔斷器開關
feign:
  hystrix:
    enabled: true

@EnableHystrix啟動Hystrix

SpringBoot啟動類中增加 @EnableHystrix 註解和bean

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
@EnableFeignClients
public class SpringCloudApplication
{
    public  static void main(String[] args)
    {
        SpringApplication.run(application.class);
	} 
	@Bean
	public ServletRegistrationBean getServlet(){
	    HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
	    ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
	    registrationBean.setLoadOnStartup(1);
	    registrationBean.addUrlMappings("/actuator/hystrix.stream");
	    registrationBean.setName("HystrixMetricsStreamServlet");
	    return registrationBean;
	}
}

熔斷器類

增加熔斷器類,實現Feign的介面

import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;

@Component
public class FUserServiceHystrix implements FUserService
{
    @RequestMapping("/user/hello")
    @Override
    public  String hello()
    {
        return "對不起,user服務不可達,請稍後再試!";
    }
}

熔斷器配置類

增加熔斷器配置類FeignConfig

import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;

@Configuration
public class FeignConfig {
    @Bean
    public Retryer feignRetryer() {
        /*
         * 引數說明:
         * 第一個> 重試間隔為100毫秒
         * 第二個> 最大重試時間為1秒
         * 第三個> 最大重試次數為5次
         */
        return new Retryer.Default(100, TimeUnit.SECONDS.toMillis(1), 5);
    }
}

增加fallback

在Feign介面註解中增加fallback,指向熔斷器類

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(name = "user",configuration = FeignConfig.class,fallback = FUserServiceHystrix.class)
public interface FUserService
{
    @RequestMapping("/user/hello")
    public  String hello();
}

相關文章