构师系列文:通过Spring Cloud组件Hystrix合并请求

 在前文里,我们讲述了通过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
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信