Spring Cloud Hystrix

Hystrix 默认的超时时间(阻塞)是2000毫秒。超过默认的2000毫秒就发生熔断请求。

  1. 引入Spring Cloud Hystrix
    1. 再ribbon-consumer工程的pom.xml的dependency节点中引入spring-cloud-starter-hystrix依赖
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifact>spring-cloud-starter-hystrix</artifact>
</dependency>
   2.  再ribbon-consumer工程中的筑类ConsumenrApplication中使用@EnableCirCuitBreaker注解开启断路器功能。
   3. 
注意这里可以使用@SpringCloudApplication注解来修饰应用注解类,该注解类堡汉下面的这三个注解类

     @EnableCircuitBreaker
     @EnableDiscoveyClient
     @SpringBootApplication
     public class ConsumerApplication
     {
      @Bean
      @LoadBalanced
      RestTemplate restTemplate()
      {
  	return new RestTemplate();		
      }

public static void main(String[] args)
{
  SpringApplication.run(ConsumerApplication.class.args);
}
      }
  4. 改造服务消费方式,新增HelloService类,注入RestTemplate实例,然后,将在ConsumerController中对RestTemlate的使用迁移到helloService函数中,最后helloService函数增加@HystrixCommand注解来指定回调方法
@Service
public class HelloService
{
 @Autowired
 RestTemplate restTemplate;
@HystrixCommand(fallbackMethod="helloFallback")
public String helloService()
{
return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
}

public String helloFallback()
{
return "error";
}
}
 5. 修改ConsumerController类注入上面实现的HelloService实例,并在helloConsumer中进行调用。
  		@RestController
        public   class  ConsumerController
        {
          @Autowired
          HelloService   helloService; 

         @RequestMapping(value="/ribbon-iconsumenr",method=RequestMethod.GET)
         public  String helloConsumer()
         {
            return  helloService.helloService();
          }
         }

 6. Hystrix的工作流程
      1. 创建HystrixCommand,用来表示对依赖服务的操作请求,同事传递所有需要的参数。利用命令模式来实现对服务调用调用的封装
          HystrixCommand: 用在依赖的服务返回单个操作结果的时候
          HystrixObservableCommand:用在依赖的服务返回多个操作结果的时候
   //接收者
   public class Receiver{  //业务逻辑
}

//抽象命令
  interface Command{
     void execute();
}

//具体命令实现
public class ConcreteComand implements Command
{
  private Receiver receiver;
  public ConcreteCommand(Receiver receiver)
  {
  this.receiver=receiver;
  }
  public void execute()
  {
    this.receiver.action();
}
  
}

//客户端调用者
public class Invoker
{
   private Command command;
   public void setCommand(Command command)
   {
    this.command=command;
}
public void action()
{
  this.command.execute();
}
}

public class Client
{
  public sftatic void main(String[] args)
  {
      Receiver receiver = new  Receiver();
      Command Command = new ConcreteCommand(receiver);
      Invoker invoker = new Invoker();
      inovker.setCommand(command);
      invoker.action(); //客户端通过调用者来执行命令
  }
}

从上面的实例中,我们可以看到,调用者Invoker与操作者Receiver通过Command命令接口实现了解耦。Invoker和Receiver的关系非常类似于“请求-响应”模式,所以它比较适用于实现记录日志 撤销操作 队列请求等。
2. 命令执行
HystriCommand实现了下面两个执行方式
execute(); 同步执行
queue(); 异步执行
observe(); 返回Observable对象
toObservable() ; 同样会返回Observable对象,也代表了操作的多个结果,但它妇女会的是一个Cold Observable

		3.  结果是否被缓存
		     若当前命令的请求缓存功能事被启用的,并且该命令缓存命中,那么缓存的结果会立即以Observable对象的形式返回
		 4.  断路器是否打开	
		     在命令结果没有缓存命中的时候Hystrix在执行命令前需要检查断路器是否为打开状态,弱国是打开的Hystrix不会执行命令,而是转接到fallback处理逻辑(对应第八步),如果断路器是关闭的,那么Hystrix跳转到第五步,检查是否有可用资源来执行命令
		  5. 线程池/请求队列/信号量是否占满   
		         如果命令相关的线程池和请求队列或者信号量已经被沾满,那么Hystrix也不会执行命令,而实转接到fallback处理逻辑(对应第八步)。
		         需要注意的是,这里Hystrix所判断的线程池并非容器的线程池,而是每个依赖服务的专有线程池,Hystrix为了保证不会因为谋个依赖服务的问题影响到其他依赖服务而采用了“舱壁模式(Bulkhead Pattern)”来隔离每个依赖的服务。关于依赖服务的隔离与线程池相关的内容见后序详细介绍。

		6. HystrixObservableCommand.construct()或HystrixCommand.run()
		     Hystrix会根据我们编写的方法来决定采取什么样的方式去请求依赖服务。
		     hystrixCommand.run(): 返回一个单一的结果或者抛出异常
		     hystrixObservableCommand.construct() 返回一个Observable对象来发射多个结果或者通过onError发送错误通知。
		     如果run()或construct()方法的执行时间超过了命令设置的超时阈值,当前处理的线程将会抛出一个TimeoutException.。在这种情况下,Hystrix会转接到fallback处理逻辑(第八步),同时,如果当前命令没有被取消或者终端,那么它最终会忽略,或者construct方法的返回
		     如果命令没有配出异常并返回了结果,那么Hystrix在记录一些日志并采集监控报告后将该结果返回。在使用run()的情况下,hystrix会返回一个Observable它发射单个结果并产生onCompleted的结束通知;而在使用construct()的情况下,Hystrix会直接返回该方法长生Observable对象。
		  7. 计算断路器的健康度
		      Hystrix会将成功,失败 ,拒绝,超时,等信息报告给断路器,而断路器会维护一组计数器来通级这些数据
		      断路器会使用这些通级数据来决定是否要将断路器打开,来对谋个以来服务的请求进行“熔断/短路”,直到恢复期结束。若在恢复期结束后,根据通级数据判断如果还是未达到健康指标,就再次“/熔断/短路”   
		     8. fallback处理
		      当命令执行失败的时候,Hystrix会进入fallback尝试回退处理,我们通常也称该操作为“服务降级” ,而能够引起服务降级处理的情况有以下几种
		      第四步:当前命令处于“熔断/短路” 状态。断路器是打开的时候
		      第五步:当前命令的线程池,请求队列或者信号量被占满的时候
		      第六步:HystrixObservableCommand.construct()或者HystrixCommand.run()抛出异常的时候。
		      在降级服务逻辑中,我们需要实现一个通用的响应结果,并且该结果的处理逻辑应当是从缓存或是根据一些静态逻辑来获取,而不是依赖网络请求获取。如果一定要在降级中堡汉网络请求,那么该请求也必须被包含在Hystrixommand或是HystrixObservableCommand中,从而形成级联的降级策略而最终的降级逻辑一定不是一个依赖网络请求的处理而实一个能够稳定的返回结果的处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值