没合并的请求:
请求进行合并
消费者
1、service接口
因为请求合并所以会有多个id传参,故使用数组接收,同样返回值也是有多个,用list接收
/***
* 查询某个订单信息
*/
public List<Orders> loadOrdersService(Integer[] id);
2、serviceImpl实现类
有几个请求(传来几个id),就有几个orders返回,要一一对应
@Override
public List<Orders> loadOrdersService(Integer[] id) {
//调用dao或者mapper where id in()
List<Orders> result=new ArrayList<Orders>();
Orders orders=new Orders();
orders.setId(888);
orders.setRemark("来福配送....8083");
orders.setTotal(123);
Orders orders2=new Orders();
orders2.setId(999);
orders2.setRemark("旺财配送....8083");
orders2.setTotal(456);
Orders orders3=new Orders();
orders3.setId(1111);
orders3.setRemark("来福配送....8083");
orders3.setTotal(123);
result.add(orders);
result.add(orders2);
result.add(orders3);
System.out.println("----------"+result.size());
return result;
}
服务提供者
1、添加依赖
<!-- 添加hystrix实现服务降级 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2、service接口
用list接收参数
/***
* 查询某个会员的所有订单信息
*/
public List<Orders> loadVipOrdersListService(List<Integer> ids);
}
3、serviceImpl实现类
注意返回值future
//注入RestTemplate对象
@Autowired
private RestTemplate restTemplate;
/***
* 负责请求的合并,Consumer的Controller需要调用该方法而不是loadVipOrdersListService方法
* 由该方法将请求进行合并,将每次请求传入的id,合并为List集合
* @param id
* @return
*/
// Hystrix请求合并,设置请求合并相关参数
@HystrixCollapser
(
//batchMethod 指定合并请求的方法,只能接受一个参数
batchMethod = "loadVipOrdersListService",
//请求合并方式(requeset|global)
scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL,
collapserProperties = {
//请求时间间隔在20ms之内的请求会被合并为一个请求,默认为10ms
@HystrixProperty(name = "timerDelayInMilliseconds", value = "1000"),
//设置触发批处理执行之前,在批处理中允许的最大请求数。
@HystrixProperty(name = "maxRequestsInBatch", value = "200")}
)
//Controller调用该方法,完成请求合并,将多个id加入到List集合,传入loadVipOrdersListService
public Future<Orders> loadOrders(Integer id){
System.out.println("=========="+id);
return null;
}
@HystrixCommand
@Override
public List<Orders> loadVipOrdersListService(List<Integer> ids) {
// 拼接id(结果为?id=1&id=2&id=3)
Integer[] ays = ids.toArray(new Integer[] {});
String params = Arrays.toString(ays);
params=params.replace("[","?id=");
params=params.replace("]","");
params=params.replace(", ","&id=");
String url="http://orders-provider/orders"+params;
Orders[] orders = restTemplate.getForObject(url, Orders[].class);
return Arrays.asList(orders);
}
}