服务雪崩解决方案三:请求合并

没合并的请求:
在这里插入图片描述
请求进行合并
在这里插入图片描述

消费者

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);
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值