请求是一个链式请求的过程 假如说在一个环节当中有一个链条断裂了,他的上一个链条就请求不到,为了防止这种情况产生就出来了熔断器,
Ribbon
@HystriCommand指明了为这个方法添加熔断器 如果服务出了问题那么就调用指定的方法来返回
feign
它自带熔断器 但是默认是关闭的需在yml配置文件中打开
只需要在Controller上面增加一个注解说明并且实现一个熔断的实现类就行了 在实现类的具体方法里面写上熔断之后产生的消息
很多时候很多用户会请求相同的资源 比如user表
然后后台就可以进行一个请求合并 把请求的userID放进一个list里面 发一次请求 到user服务去请求回来一个user列表 再返回客户端 这样避免了多次请求减小了并发量
当然请求合并能能够设置多少时间段内的请求才合并成为一个请求去请求其他模块
首先在user的model中写一个controller
@RequestMapping("/getUserAll")
public List<String> getAllUSer(@RequestParam List<Integer> ids) {
ArrayList<String> list = new ArrayList<>();
for (Integer id : ids) {
list.add("用户:" + id);
}
return list;
}
然后是order 的model的controller
@RequestMapping("/findTest")
public String findTest() throws ExecutionException, InterruptedException {
/**
*即使是调用一次也会被合并
*/
HystrixRequestContext context = HystrixRequestContext.initializeContext();
调用的是findone方法 但是他会转化成findall方法
Future<String> f1 = orderService.findOne(1);
Future<String> f2 = orderService.findOne(2);
Future<String> f3 = orderService.findOne(3);
Future<String> f4 = orderService.findOne(4);
// context.close();
return f1.get()+"\t"+f2.get()+"\t"+f3.get()+"\t"+f4.get();
}
service
/**
* Hystrix 请求合并
*/
@HystrixCommand //设置能被找到
public List<String> findAll(List<Integer> id) {
System.out.println("合并的请求");
System.out.println("\n\n\n\n\n"+StringUtils.join(id, ',')+"\n\n\n\n\n");
String url = "http://yidiankt-user/getUserAll?ids={1}";
List info2 = restTemplate.getForObject(url,List.class,StringUtils.join(id, ','));
/**
* StringUtils.join(id , ',') 把list转化成数组
*/
return info2;
}
/**
* @return
* @HystrixCollapser(batchMethod = "findAll") 说明需要被合并的方法是这个 合并方法是findall
* <p>
* <p>
* collapserProperties = {
* @HystrixProperty(name = "timeDelayInMilliseconds",value = "300")
* }
* <p>
* 这个 是指明多少时间内的请求都合并为一个请求 value = 300 表示300毫秒以内的请求都合并
*/
@HystrixCollapser(batchMethod = "findAll", collapserProperties = {
@HystrixProperty(name = "timerDelayInMilliseconds", value = "300")
})
public Future<String> findOne(Integer id) {
System.out.println("被合并的请求");
return null;
}