【springcloud】Spring Cloud Hystrix 断路器

Hystrix “豪猪”,具有自我保护的能力。hystrix 通过如下机制来解决雪崩效应问题。

在微服务架构中,我们把每个业务都拆成了单个服务模块,然后当有业务需求时,服务间可互相调用,但是,由于网络原因或者其他一些因素,有可能出现服务不可用的情况,当某个服务出现问题时,其他服务如果继续调用这个服务,就有可能出现线程阻塞,但如果同时有大量的请求,就会造成线程资源被用完,这样就可能会导致服务瘫痪,由于服务间会相互调用,很容易造成蝴蝶效应导致整个系统宕掉。因此,就有人提出来断路器来解决这一问题。

资源隔离:包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。

降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。

熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。

缓存:提供了请求缓存、请求合并实现。

 

Hystrix服务降级,其实就是线程池中单个线程障处理,防止单个线程请求时间太长,导致资源长期被占有而得不到释放,从而导致线程池被快速占用完,导致服务崩溃。
Hystrix能解决如下问题
1.请求超时降级,线程资源不足降级,降级之后可以返回自定义数据
2.线程池隔离降级,分布式服务可以针对不同的服务使用不同的线程池,从而互不影响
3.自动触发降级与恢复
4.实现请求缓存和请求合并

 

springBoot使用的是2.0.2.RELEASE版本 springCloud使用的是Finchley.RELEASE版本。

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

在启动类加上@EnableCircuitBreaker注解

//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker

这三个注解相当于一个@SpringCloudApplication

@EnableFeignClients
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
@SpringCloudApplication
public class OrderApplication {

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

设置断路器超时时间(默认1s)

feign:
  hystrix: 
    enabled: true

  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000

1.在方法的头上加了@HystrixCommand(fallbackMethod = "hystrixMethod")注解,
代表对这个方法使用了Hystrix相关的功能,fallbackMethod属性是调用回调之后的处理方法。

默认设置了5s超时: 

    @GetMapping("/test")
    @HystrixCommand(fallbackMethod = "hystrixMethod")
    public String test(){
        try {
            Thread.sleep(6000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "ok";
    }

    public String hystrixMethod(){
        return "请稍后再试";
    }

2.Feign是自带断路器的,只需要在FeignClient的接口的注解中加上fallback的指定类就行了。

@FeignClient(name = "product", fallback = OrderHystrix.class)
public interface OrderClient {

    @GetMapping("/product/list")
    public String getProductInfo();
}
@Component
public class OrderHystrix implements OrderClient {

    @Override
    public String getProductInfo() {
        return "商品服务忙,稍后再试。。。";
    }
}
发布了110 篇原创文章 · 获赞 36 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/wjx_jasin/article/details/103243496