详解春云中Hystrix的请求合并

  

在微服务架构中,我们将一个项目拆分成很多个独立的模块,这些独立的模块通过远程调用来互相配合工作,但是,在高并发情况下,通信次数的增加会导致总的通信时间增加,同时,线程池的资源也是有限的,高并发环境会导致有大量的线程处于等待状态,进而导致响应延迟,为了解决这些问题,我们需要来了解Hystrix的请求合并。
  

  

Hystrix中的请求合,并就是利用一个合并处理器,将对同一个服务发起的连续请求合并成一个请求进行处理(这些连续请求的时间窗默认为10毫秒),在这个过程中涉及到的一个核心类就是HystrixCollapser,好,接下来我们就来看看如何实现Hystrix的请求合并。

  

  

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

        @RequestMapping ("/getbook6”)   公共Listbook6(字符串id) {   System.out.println (“ids>在在在在在在在在在在在在在在在在在在在在”+ ids);   ArrayList书=new ArrayList<在();   书。add(新书(《李自成》”,55岁,”姚雪垠”、“人民文学出版社”));   书。add(新书(《中国文学简史”,33岁的“林庚”,“清华大学出版社”));   书。add(新书(“文学改良刍议”,33岁的“胡适”,“无”));   书。添加(新书(“helloworld”“id”, 22日,“哈哈”));   返回的书;   }      @RequestMapping (“/getbook6/{id}”)   公共图书book61 (@PathVariable整数id) {   书书=新书(《李自成》2”,55岁,”姚雪垠2”,“人民文学出版社2”);   返回的书;   }      之前      

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

  

  

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

  

<强> BookService

  

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

        公共图书test8 (id) {   返回创建restTemplate。getForObject (“http://HELLO-SERVICE/getbook6/{1}”的书。类,id);   }      公共Listtest9 (Listids) {   System.out.println (“test9 - - - - - - - - - - - -”+ id +“Thread.currentThread () . getname ():”+ Thread.currentThread () . getname ());   书[]书=restTemplate.getForObject (" http://HELLO-SERVICE/getbook6& # 63; id={1}”,书[]。类,stringutil的。加入(id, ", "));   返回arrays . aslist(书);   }      之前      

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

  

<强> BookBatchCommand

  

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

        公共类BookBatchCommand HystrixCommand<延伸;Listid;   私人BookService BookService;      公共BookBatchCommand (Listid, BookService BookService) {   超级(Setter.withGroupKey (HystrixCommandGroupKey.Factory.asKey (“CollapsingGroup”))   .andCommandKey (HystrixCommandKey.Factory.asKey (“CollapsingKey”)));   这一点。id=id;   这一点。bookService=bookService;   }      @Override   保护Listrun()抛出异常{   返回bookService.test9 (ids);   }   }      之前      

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

  

<强> BookCollapseCommand

  

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

        公开课BookCollapseCommand延伸HystrixCollapser{   私人BookService BookService;   私人长id;      公共BookCollapseCommand (BookService BookService长id) {   超级(Setter.withCollapserKey (HystrixCollapserKey.Factory.asKey (“bookCollapseCommand”)) .andCollapserPropertiesDefaults (HystrixCollapserProperties.Setter () .withTimerDelayInMilliseconds (100)));   这一点。bookService=bookService;   这一点。id=id;   }      @Override   公共长getRequestArgument () {   返回id;   }      @Override   保护HystrixCommand

详解春云中Hystrix的请求合并