春云中怎么自定义Hystrix请求命令

  

春云中怎么自定义Hystrix请求命令,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

自定义HystrixCommand

我们除了使用@HystrixCommand注解,也可以自定义类继承自HystrixCommand,如下:

 public  class  BookCommand  extends  HystrixCommand, {
  
  ,,,private  RestTemplate 创建restTemplate;
  
  ,,@Override
  ,,,protected  Book  getFallback (), {
  ,,,,,,,return  new 书(“宋诗选注“,,,88,“钱钟书“,,“三联书店“);
  ,,,}
  
  ,,,public  BookCommand (Setter  setter, RestTemplate 创建restTemplate), {
  ,,,,,,,超级(setter);
  ,,,,,,,this.restTemplate =,创建restTemplate;
  ,,,}
  
  ,,@Override
  ,,,protected  Book 运行(),throws  Exception  {
  ,,,,,,,return  restTemplate.getForObject (“http://HELLO-SERVICE/getbook1",, Book.class);
  ,,,}
  }

在BookCommand中注入创建RestTemplate,然后重写两个方法:一个是getFallback,这个方法将在服务调用失败时回调;另一个是运行方法,执行请求时调用。构造方法的第一个参数主要用来保存一些分组信息。

同步调用和异步调用

当BookCommand创建成功之后,我们就可以在我们的控制器中调用它了,如下:

 @RequestMapping (“/test1")
  public  Book  test1 (), throws 中,InterruptedException  {
  ,,,BookCommand  BookCommand =, new  BookCommand (HystrixCommand.Setter.withGroupKey (HystrixCommandGroupKey.Factory.asKey(“;”)),,创建restTemplate);
  ,,,//同步调用
  ,,,//Book  book1 =, bookCommand.execute ();
  ,,,//异步调用
  ,,,Future, queue =, bookCommand.queue ();
  ,,,Book  Book =, queue.get ();
  ,,,return ;
  }

关于这一段调用,我说如下几点:

1。获取到BookCommand对象之后,我们有两种方式来执行请求,一种是调用执行方法发起一个同步请求,另一种是调用队列方法发起一个异步请求。
2。同步请求中可以直接返回请求结果。
3。异步请求中我们需要通过得到方法来获取请求结果,在调用得到方法的时候也可以传入超时时长。

执行结果如下:

按涸浦性趺醋远ㄒ錒ystrix请求命令”,

如果我们先启动一个服务注册中心,再启动两个服务提供者实例,再启动一个服务消费者,然后再关掉一个服务提供者,此时再访问,就会间隔的看到如下页面:

按涸浦性趺醋远ㄒ錒ystrix请求命令”,

通过注解实现异步请求

在上篇文章(春云中的断路器Hystrix)中我们使用了注解来配置Hystrix,当时我们的写法如下:

 @HystrixCommand
  public  Book  test2 (), {
  ,,,return  restTemplate.getForObject (“http://HELLO-SERVICE/getbook1",, Book.class);
  }

那么这种请求是一种同步请求的方式,如果我们想要使用注解来实现异步请求怎么办呢?很简单,两个步骤:

<强> 1。配置HystrixCommandAspect的Bean

在项目的入口类中配置一个HystrixCommandAspect的Bean,如下:

 @ Bean
  public  HystrixCommandAspect  hystrixCommandAspect (), {
  ,,,return  new  HystrixCommandAspect ();
  }

<强> 2。通过AsyncResult来执行调用

还是使用@HystrixCommand注解,但是方法的实现使用AsyncResult,如下:

 @HystrixCommand
  ,,,public  Future, test3 (), {
  ,,,,,,,return  new  AsyncResult (), {
  ,,,,,,,,,,@Override
  ,,,,,,,,,,,public  Book 调用(),{
  ,,,,,,,,,,,,,,,return  restTemplate.getForObject (“http://HELLO-SERVICE/getbook1",, Book.class);
  ,,,,,,,,,,,}
  ,,,,,,,};
  ,,,}

好的,如此之后我们就可以通过注解来实现异步调用了。调用方式如下:

 @RequestMapping (“/test3")
  public  Book  test3 (), throws 中,InterruptedException  {
  ,,,Future, bookFuture =, bookService.test3 ();
  ,,,//调用得到方法时也可以设置超时时长
  ,,,return  bookFuture.get ();
  }

对响应式函数编程的支持

有的小伙伴可能对响应式函数编程情有独钟,Hystrix对此也提供了相应的支持,在我们获取到BookCommand对象之后,也可以通过如下两种方式来获取到一个可观测的

春云中怎么自定义Hystrix请求命令