文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Cloud中怎么自定义Hystrix请求命令

2023-06-19 12:40

关注

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

自定义HystrixCommand

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

public class BookCommand extends HystrixCommand<Book> {    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();    //异步调用    Future<Book> queue = bookCommand.queue();    Book book = queue.get();    return book;}

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

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

执行结果如下:

Spring Cloud中怎么自定义Hystrix请求命令  

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

Spring Cloud中怎么自定义Hystrix请求命令  

通过注解实现异步请求

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

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

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

1.配置HystrixCommandAspect的Bean

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

@Beanpublic HystrixCommandAspect hystrixCommandAspect() {    return new HystrixCommandAspect();}

2.通过AsyncResult来执行调用

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

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

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

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

对响应式函数编程的支持

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

BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate);        Observable<Book> observe = bookCommand.observe();        Observable<Book> bookObservable = bookCommand.toObservable();

关于Observable小伙伴们可以自行度娘RxJava的用法,我这里就不再赘述,就说下observe和toObservable的区别:

observe命令在调用的时候会立即返回一个Observable。
2.toObservable则不会立即返回一个Observable,订阅者调用数据的时候才会执行。

通过注解支持响应式函数编程

当然,响应式函数编程也可以通过注解来实现,如下:

@HystrixCommandpublic Observable<Book> test4() {    return Observable.create(new Observable.OnSubscribe<Book>() {        @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模式来执行

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯