hystrix简介

分布式系统面临的问题

复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败

当多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的扇出,如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,从而引出系统崩溃,这就是服务雪崩

解决方案

hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免的会调用失败,比如超时,异常等,hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性

何为熔断

就是在某个服务出现故障后,通过故障监控,会向调用方返回一个符合预期的,可处理的备选响应,而不是长时间等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间,不必要的占用,从而避免故障造成分布式系统的服务雪崩

hystrix重要概念

服务降级

  • 服务降级就是向调用方返回一个符合预期的,可处理的备选响应,而不是长时间等待或者抛出调用方无法处理的异常

哪些情况会发出降级:

  • 程序运行异常
  • 超时
  • 服务熔断触发服务降级
  • 线程池/信号量打满

服务熔断

  • 熔断就类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示,其实就是服务降级的触发条件,当响应恢复正常后,可以恢复服务的正常调用

hystrix服务熔断和降级_微服务

服务限流

  • 限定指定时间只能指定数量的请求进来

demo案例

服务降级

引入依赖

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

启动类加上注解

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class Hystrix {

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

配置降级处理方法

@HystrixCommand(fallbackMethod = "timeOutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
@RequestMapping("/errorTimeAwait")
public Object errorTimeAwait(){
return paymentService.error_timeAwait();
}


public Object timeOutHandler(){
return "超时啦!";
}

这种方式的话,每一个需要处理降级的业务都需要配置一个单独的处理方法,会造成代码膨胀

全局降级处理

@RestController
@RequestMapping("/pay")
@DefaultProperties(defaultFallback = "globalHandler")//再配合 @HystrixCommand对业务方法实现降级
public class PaymentController {

/**
* 服务熔断和降级,限流在消费端和服务提供端都可以配置
* 这里模拟消费端配置
*/

@Autowired
private PaymentService paymentService;

@RequestMapping("/ok")
public Object ok(){
return paymentService.ok();
}

@HystrixCommand
@RequestMapping("/errorTimeAwait")
public Object errorTimeAwait(){
return paymentService.error_timeAwait();
}


public Object timeOutHandler(){
return "超时啦!";
}
}

还有一种是在feign调用方中设置

@Component
@FeignClient(value = "PAYMENT8101",fallback = FeignServiceImpl.class)//声明服务名
public interface FeignService {

@RequestMapping("/res/res")//controller方法的接口声明
String create();
}

将降级处理方法实现在实现类上

@Component
public class FeignServiceImpl implements FeignService {
/**
* 降级处理方法
* @return
*/
@Override
public String create() {
return "------- 降级啦 -------";
}
}

配置文件开启配置

feign:
hystrix:
enabled: true

服务熔断

//在10s中有6次请求失败则触发断路器,10s一个窗口
@HystrixCommand(fallbackMethod = "timeOutHandler",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),//是否开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolmueThreshold",value = "10"),//请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//时间窗口期
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")//失败率达到多少后触发熔断
})
@RequestMapping("/errorTimeAwait")
public Object errorTimeAwait(){
return paymentService.error_timeAwait();
}


public Object timeOutHandler(){
return "超时啦!";
}