Spring Cloud中怎么自定义Hystrix请求命令,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
创新互联服务项目包括庄浪网站建设、庄浪网站制作、庄浪网页制作以及庄浪网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,庄浪网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到庄浪省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
我们除了使用@HystrixCommand注解,也可以自定义类继承自HystrixCommand,如下:
public class BookCommand extends HystrixCommand{ private RestTemplate restTemplate; @Override protected Book getFallback() { return new Book("宋诗选注", 88, "钱钟书", "三联书店"); } public BookCommand(Setter setter, RestTemplate restTemplate) { super(setter); this.restTemplate = restTemplate; } @Override protected Book run() throws Exception { return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); } }
在BookCommand中注入RestTemplate,然后重写两个方法:一个是getFallback,这个方法将在服务调用失败时回调;另一个是run方法,执行请求时调用。构造方法的第一个参数主要用来保存一些分组信息。
当BookCommand创建成功之后,我们就可以在我们的Controller中调用它了,如下:
@RequestMapping("/test1") public Book test1() throws ExecutionException, InterruptedException { BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate); //同步调用 //Book book1 = bookCommand.execute(); //异步调用 Futurequeue = bookCommand.queue(); Book book = queue.get(); return book; }
关于这一段调用,我说如下几点:
1.获取到BookCommand对象之后,我们有两种方式来执行请求,一种是调用execute方法发起一个同步请求,另一种是调用queue方法发起一个异步请求。
2.同步请求中可以直接返回请求结果。
3.异步请求中我们需要通过get方法来获取请求结果,在调用get方法的时候也可以传入超时时长。
执行结果如下:
如果我们先启动一个服务注册中心,再启动两个服务提供者实例,再启动一个服务消费者,然后再关掉一个服务提供者,此时再访问,就会间隔的看到如下页面:
在上篇文章(Spring Cloud中的断路器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 Futuretest3() { return new AsyncResult () { @Override public Book invoke() { return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); } }; }
OK,如此之后我们就可以通过注解来实现异步调用了。调用方式如下:
@RequestMapping("/test3") public Book test3() throws ExecutionException, InterruptedException { FuturebookFuture = bookService.test3(); //调用get方法时也可以设置超时时长 return bookFuture.get(); }
有的小伙伴可能对响应式函数编程情有独钟,Hystrix对此也提供了相应的支持,在我们获取到BookCommand对象之后,也可以通过如下两种方式来获取到一个Observable
BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate); Observableobserve = bookCommand.observe(); Observable bookObservable = bookCommand.toObservable();
关于Observable
1.observe命令在调用的时候会立即返回一个Observable。
2.toObservable则不会立即返回一个Observable,订阅者调用数据的时候才会执行。
当然,响应式函数编程也可以通过注解来实现,如下:
@HystrixCommand public Observabletest4() { return Observable.create(new Observable.OnSubscribe () { @Override public void call(Subscriber super Book> subscriber) { if (!subscriber.isUnsubscribed()) { Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); subscriber.onNext(book); subscriber.onCompleted(); } } }); }
这个时候我们可以通过在注解中添加参数来描述是通过observe还是toObservable来实现,如下:
@HystrixCommand(observableExecutionMode = ObservableExecutionMode.EAGER)表示使用observe模式来执行 @HystrixCommand(observableExecutionMode = ObservableExecutionMode.LAZY)表示使用toObservable模式来执行
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款