在前文里,我们讲述了通过Hystrix进行容错处理的方式,这里我们将讲述通过Hystrix合并请求的方式
哪怕一个URL请求调用的功能再简单,Web应用服务都至少会开启一个线程来提供服务,换句话说,有效降低URL请求数能很大程度上降低系统的负载。通过Hystrix提供的“合并请求”机制,我们能有效地降低请求数量。
在如下的HystrixMergeDemo.java里,我们将收集2秒内到达的所有“查询订单”的请求,并把它们合并到一个对象中传输给后台,后台则是根据多个请求参数统一返回查询结果,这种基于合并的做法将比每次只处理一个请求的方式要高效得多,代码比较长,我们按类来说明。
1 //省略必要的package和import的代码2 class OrderDetail{ //订单业务类,其中包含2个属性3 private String orderId; 4 private String orderOwner; 5 //省略针对orderId和orderOwner的get和set方法6 //重写toString方法,方便输出7 public String toString() { 8 return "orderId: " + orderId + ", orderOwner: " + orderOwner ; 9 } 10 } 11 //合并订单请求的处理器12 class OrderHystrixCollapser extends HystrixCollapser<Map<String, OrderDetail>, OrderDetail, String> 13 { 14 String orderId; 15 //在构造函数里传入请求参数16 public OrderHystrixCollapser(String orderId) 17 { this.orderId = orderId;} 18 //指定根据orderId去请求OrderDetail19 public String getRequestArgument() 20 { return orderId; } 21 //创建请求命令22 protected HystrixCommand<Map<String, OrderDetail>> createCommand( 23 Collection<CollapsedRequest<OrderDetail, String>> requests) 24 { return new MergerCommand(requests); } 25 //把请求得到的结果和请求关联到一起26 protected void mapResponseToRequests(Map<String, OrderDetail> batchResponse, 27 Collection<CollapsedRequest<OrderDetail, String>> requests) { 28 for (CollapsedRequest<OrderDetail, String> request : requests) 29 { 30 // 请注意这里是得到单个请求的结果31 OrderDetail oneOrderDetail = batchResponse.get(request.getArgument()); 32 // 把结果关联到请求中33 request.setResponse(oneOrderDetail); 34 } 35 } 36 }
在第2行,我们定义了OrderDetail类,这里,我们将合并针对该类对象的请求。
在第12行,我们定义了合并订单的处理器OrderHystrixCollapser类, 它继承(extends)了HystrixCollapser<Map<String, OrderDetail>, OrderDetail, String>类,而HystrixCollapser泛型中包含了3个参数,其中第一个参数Map<String, OrderDetail>表示该合并处理器合并请求后返回的结果类型,第二个参数表示是合并OrderDetail类型的对象,第三个参数则表示是根据String类型的请求参数来合并对象。
在第19行里,我们指定了是根据String类型的OrderId参数来请求OrderDetail对象,在第22行的createCommand方法里,我们指定了是调用MergerCommand方法来请求多个OrderDetail,在第26行的mapResponseToRequests方法里,我们是用第28行的for循环,依次把batchResponse对象中包含的多个的查询结果设置到request对象里,由于request是参数requests里的元素,所以执行完第28行的for循环后,requests对象就能关联到合并后的查询结果。
37 class MergerCommand extends HystrixCommand<Map<String, OrderDetail>> { 38 //用orderDB模拟数据库中的数据39 static HashMap<Str

