我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring Cloud中Hystrix的请求合并方法

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring Cloud中Hystrix的请求合并方法

本篇内容介绍了“Spring Cloud中Hystrix的请求合并方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

服务提供者接口

我需在在服务提供者中提供两个接口供服务消费者调用,如下:

@RequestMapping("/getbook6")public List<Book> book6(String ids) {    System.out.println("ids>>>>>>>>>>>>>>>>>>>>>" + ids);    ArrayList<Book> books = new ArrayList<>();    books.add(new Book("《李自成》", 55, "姚雪垠", "人民文学出版社"));    books.add(new Book("中国文学简史", 33, "林庚", "清华大学出版社"));    books.add(new Book("文学改良刍议", 33, "胡适", "无"));    books.add(new Book("ids", 22, "helloworld", "haha"));    return books;}@RequestMapping("/getbook6/{id}")public Book book61(@PathVariable Integer id) {    Book book = new Book("《李自成》2", 55, "姚雪垠2", "人民文学出版社2");    return book;}

第一个接口是一个批处理接口,第二个接口是一个处理单个请求的接口。在批处理接口中,服务消费者传来的ids参数格式是1,2,3,4…这种格式,正常情况下我们需要根据ids查询到对应的数据,然后组装成一个集合返回,我这里为了处理方便,不管什么样的请求统统都返回一样的数据集;处理单个请求的接口就比较简单了,不再赘述。

服务消费者

OK,服务提供者处理好之后,接下来我们来看看服务消费者要怎么处理。

BookService

首先在BookService中添加两个方法用来调用服务提供者提供的接口,如下:

public Book test8(Long id) {    return restTemplate.getForObject("http://HELLO-SERVICE/getbook6/{1}", Book.class, id);}public List<Book> test9(List<Long> ids) {    System.out.println("test9---------"+ids+"Thread.currentThread().getName():" + Thread.currentThread().getName());    Book[] books = restTemplate.getForObject("http://HELLO-SERVICE/getbook6?ids={1}", Book[].class, StringUtils.join(ids, ","));    return Arrays.asList(books);}

test8用来调用提供单个id的接口,test9用来调用批处理的接口,在test9中,我将test9执行时所处的线程打印出来,方便我们观察执行结果,另外,在RestTemplate中,如果返回值是一个集合,我们得先用一个数组接收,然后再转为集合(或许也有其他办法,小伙伴们有更好的建议可以提)。

BookBatchCommand

OK,BookService中的方法准备好了后,我们就可以来创建一个BookBatchCommand,这是一个批处理命令,如下:

public class BookBatchCommand extends HystrixCommand<List<Book>> {    private List<Long> ids;    private BookService bookService;    public BookBatchCommand(List<Long> ids, BookService bookService) {        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CollapsingGroup"))                .andCommandKey(HystrixCommandKey.Factory.asKey("CollapsingKey")));        this.ids = ids;        this.bookService = bookService;    }    @Override    protected List<Book> run() throws Exception {        return bookService.test9(ids);    }}

这个类实际上和我们在上篇博客中介绍的类差不多,都是继承自HystrixCommand,用来处理合并之后的请求,在run方法中调用BookService中的test9方法。

BookCollapseCommand

接下来我们需要创建BookCollapseCommand继承自HystrixCollapser来实现请求合并。如下:

public class BookCollapseCommand extends HystrixCollapser<List<Book>, Book, Long> {    private BookService bookService;    private Long id;    public BookCollapseCommand(BookService bookService, Long id) {        super(Setter.withCollapserKey(HystrixCollapserKey.Factory.asKey("bookCollapseCommand")).andCollapserPropertiesDefaults(HystrixCollapserProperties.Setter().withTimerDelayInMilliseconds(100)));        this.bookService = bookService;        this.id = id;    }    @Override    public Long getRequestArgument() {        return id;    }    @Override    protected HystrixCommand<List<Book>> createCommand(Collection<CollapsedRequest<Book, Long>> collapsedRequests) {        List<Long> ids = new ArrayList<>(collapsedRequests.size());        ids.addAll(collapsedRequests.stream().map(CollapsedRequest::getArgument).collect(Collectors.toList()));        BookBatchCommand bookBatchCommand = new BookBatchCommand(ids, bookService);        return bookBatchCommand;    }    @Override    protected void mapResponseToRequests(List<Book> batchResponse, Collection<CollapsedRequest<Book, Long>> collapsedRequests) {        System.out.println("mapResponseToRequests");        int count = 0;        for (CollapsedRequest<Book, Long> collapsedRequest : collapsedRequests) {            Book book = batchResponse.get(count++);            collapsedRequest.setResponse(book);        }    }}

关于这个类,我说如下几点:

首先在构造方法中,我们设置了请求时间窗为100ms,即请求时间间隔在100ms之内的请求会被合并为一个请求。
2.createCommand方法主要用来合并请求,在这里获取到各个单个请求的id,将这些单个的id放到一个集合中,然后再创建出一个BookBatchCommand对象,用该对象去发起一个批量请求。
3.mapResponseToRequests方法主要用来为每个请求设置请求结果。该方法的第一个参数batchResponse表示批处理请求的结果,第二个参数collapsedRequests则代表了每一个被合并的请求,然后我们通过遍历batchResponse来为collapsedRequests设置请求结果。

OK,所有的这些操作完成后,我们就可以来测试啦。

测试

我们在服务消费者端创建访问接口,来测试合并请求,测试接口如下:

@RequestMapping("/test7")@ResponseBodypublic void test7() throws ExecutionException, InterruptedException {    HystrixRequestContext context = HystrixRequestContext.initializeContext();    BookCollapseCommand bc1 = new BookCollapseCommand(bookService, 1l);    BookCollapseCommand bc2 = new BookCollapseCommand(bookService, 2l);    BookCollapseCommand bc3 = new BookCollapseCommand(bookService, 3l);    BookCollapseCommand bc4 = new BookCollapseCommand(bookService, 4l);    Future<Book> q1 = bc1.queue();    Future<Book> q2 = bc2.queue();    Future<Book> q3 = bc3.queue();    Book book1 = q1.get();    Book book2 = q2.get();    Book book3 = q3.get();    Thread.sleep(3000);    Future<Book> q4 = bc4.queue();    Book book4 = q4.get();    System.out.println("book1>>>"+book1);    System.out.println("book2>>>"+book2);    System.out.println("book3>>>"+book3);    System.out.println("book4>>>"+book4);    context.close();}

关于这个测试接口我说如下两点:

首先要初始化HystrixRequestContext
2.创建BookCollapseCommand类的实例来发起请求,先发送3个请求,然后睡眠3秒钟,再发起1个请求,这样,前3个请求就会被合并为一个请求,第四个请求因为间隔的时间比较久,所以不会被合并,而是单独创建一个线程去处理。

OK,我们来看看执行结果,如下:

Spring Cloud中Hystrix的请求合并方法  

通过注解实现请求合并

OK,上面这种请求合并方式写起来稍微有一点麻烦,我们可以使用注解来更优雅的实现这一功能。首先在BookService中添加两个方法,如下:

@HystrixCollapser(batchMethod = "test11",collapserProperties = {@HystrixProperty(name ="timerDelayInMilliseconds",value = "100")})public Future<Book> test10(Long id) {    return null;}@HystrixCommandpublic List<Book> test11(List<Long> ids) {    System.out.println("test9---------"+ids+"Thread.currentThread().getName():" + Thread.currentThread().getName());    Book[] books = restTemplate.getForObject("http://HELLO-SERVICE/getbook6?ids={1}", Book[].class, StringUtils.join(ids, ","));    return Arrays.asList(books);}

在test10方法上添加@HystrixCollapser注解实现请求合并,用batchMethod属性指明请求合并后的处理方法,collapserProperties属性指定其他属性。

OK,在BookService中写好之后,直接调用就可以了,如下:

@RequestMapping("/test8")@ResponseBodypublic void test8() throws ExecutionException, InterruptedException {    HystrixRequestContext context = HystrixRequestContext.initializeContext();    Future<Book> f1 = bookService.test10(1l);    Future<Book> f2 = bookService.test10(2l);    Future<Book> f3 = bookService.test10(3l);    Book b1 = f1.get();    Book b2 = f2.get();    Book b3 = f3.get();    Thread.sleep(3000);    Future<Book> f4 = bookService.test10(4l);    Book b4 = f4.get();    System.out.println("b1>>>"+b1);    System.out.println("b2>>>"+b2);    System.out.println("b3>>>"+b3);    System.out.println("b4>>>"+b4);    context.close();}

和前面的一样,前三个请求会进行合并,第四个请求会单独执行,OK,执行结果如下:

Spring Cloud中Hystrix的请求合并方法  

总结

请求合并的优点小伙伴们已经看到了,多个请求被合并为一个请求进行一次性处理,可以有效节省网络带宽和线程池资源,但是,有优点必然也有缺点,设置请求合并之后,本来一个请求可能5ms就搞定了,但是现在必须再等10ms看看还有没有其他的请求一起的,这样一个请求的耗时就从5ms增加到15ms了,不过,如果我们要发起的命令本身就是一个高延迟的命令,那么这个时候就可以使用请求合并了,因为这个时候时间窗的时间消耗就显得微不足道了,另外高并发也是请求合并的一个非常重要的场景。

“Spring Cloud中Hystrix的请求合并方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

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

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

Spring Cloud中Hystrix的请求合并方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring Cloud中Hystrix的请求合并方法

本篇内容介绍了“Spring Cloud中Hystrix的请求合并方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务提供者接口我需在在服
2023-06-19

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

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

Spring Cloud中Hystrix的请求缓存怎么实现

本篇内容介绍了“Spring Cloud中Hystrix的请求缓存怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过方法重载开启缓存
2023-06-19

spring cloud gateway集成hystrix的方法

本篇内容介绍了“spring cloud gateway集成hystrix的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spring
2023-06-20

Spring Cloud中Hystrix服务降级与异常处理的方法是什么

本篇内容主要讲解“Spring Cloud中Hystrix服务降级与异常处理的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud中Hystrix服务降级与异常处理的
2023-06-19

Spring Cloud Alibaba整合Nacos使用的方法是什么

今天小编给大家分享一下Spring Cloud Alibaba整合Nacos使用的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起
2023-07-05

在Go语言中如何解决并发网络请求的请求合并和批量处理问题?

在Go语言中如何解决并发网络请求的请求合并和批量处理问题?在现代互联网应用中,网络请求已经成为了不可或缺的一部分,而对于高并发的情况下,如何有效地管理和处理大量的网络请求成了一个亟待解决的问题。为了提高请求的效率和减少网络开销,我们常常需要
2023-10-22

在Go语言中如何解决并发网络请求的请求参数校验和合法性问题?

在Go语言中进行并发网络请求时,我们经常需要对请求参数进行校验和合法性检查。本文将介绍如何使用Go语言的并发特性来解决这些问题,并提供具体的代码示例。首先,我们需要使用Go语言的协程来同时发送多个网络请求。Go语言提供了goroutine来
2023-10-22

Android中使用Post请求的方法

本文实例讲述了Android中使用Post请求的方法。分享给大家供大家参考。具体如下: 一、需要用到的场景 在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中有时也要从服务器获取一些数据,就也必须得
2022-06-06

java处理高并发请求的方法是什么

Java处理高并发请求的方法有很多种,以下是一些常用的方法:使用线程池:可以使用Java中的线程池技术来管理并发请求。通过创建固定大小的线程池,可以控制同时处理的请求数量,避免系统资源被过多的请求耗尽。使用消息队列:可以使用消息队列来缓冲请
2023-10-25

react请求数据并渲染的方法是什么

在React中,可以使用fetch或axios等库来发送请求并获取数据。一般情况下,在组件的生命周期方法中发送请求并在获取到数据后进行渲染。以下是一个使用fetch发送请求并渲染数据的例子:```jsximport React, { use
2023-10-07

golang中实现graphql请求的方法

这篇文章主要介绍了如何在golang中实现graphql请求,在本文中,我们介绍了如何使用gqlgen来构建GraphQL服务,需要的朋友可以参考下
2023-05-16

Spring Cloud中声明式服务调用Feign的方法

这篇文章主要介绍“Spring Cloud中声明式服务调用Feign的方法”,在日常操作中,相信很多人在Spring Cloud中声明式服务调用Feign的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”S
2023-06-19

Spring中注解方式的异步请求如何实现

小编给大家分享一下Spring中注解方式的异步请求如何实现,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、Servlet3.0异步请求@WebServlet(value = "/async", asyncSupporte
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录