一 新建合并请求控制器
package org.crazyit.cloud.collapser;
import java.util.concurrent.Future;
import org.crazyit.cloud.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CollController {
@Autowired
private CollService collService;
@RequestMapping(value = "/coll", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public String testCollapse() throws Exception {
// 连续执行3次请求
Future<Member> f1 = collService.getMember(1);
Future<Member> f2 = collService.getMember(2);
Future<Member> f3 = collService.getMember(3);
Member p1 = f1.get();
Member p2 = f2.get();
Member p3 = f3.get();
return "";
}
}
二 新建合并请求服务
package org.crazyit.cloud.collapser;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;
import org.crazyit.cloud.Member;
import org.springframework.stereotype.Service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
@Service
public class CollService {
@HystrixCollapser(batchMethod = "getMembers", collapserProperties = {
@HystrixProperty(name = "timerDelayInMilliseconds", value = "1000")
})
public Future<Member> getMember(Integer id) {
System.out.println("执行单个查询的方法");
return null;
}
@HystrixCommand
public List<Member> getMembers(List<Integer> ids) {
List<Member> mems = new ArrayList<Member>();
for(Integer id : ids) {
System.out.println(id);
Member m = new Member();
m.setId(id);
m.setName("angus");
mems.add(m);
}
return mems;
}
}
三 启动服务
四 浏览器输入http://localhost:8081/coll
控制台输出结果如下,符合预期。
2
3
1
五 请求缓存的优势