在微服务架构中,我们将一个项目拆分成很多个独立的模块,这些独立的模块通过远程调用来互相配合工作,但是,在高并发情况下,通信次数的增加会导致总的通信时间增加,同时,线程池的资源也是有限的,高并发环境会导致有大量的线程处于等待状态,进而导致响应延迟,为了解决这些问题,我们需要来了解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 (List ids) { 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 (List id, BookService BookService) { 超级(Setter.withGroupKey (HystrixCommandGroupKey.Factory.asKey (“CollapsingGroup”)) .andCommandKey (HystrixCommandKey.Factory.asKey (“CollapsingKey”))); 这一点。id=id; 这一点。bookService=bookService; } @Override 保护List run()抛出异常{ 返回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的请求合并