实战前需了解:https://blog.csdn.net/wanzijy/article/details/125041622
Hystrix熔断器整合 - 搭建项目:https://blog.csdn.net/wanzijy/article/details/125496651
Hystrix熔断器整合 - 请求缓存:https://blog.csdn.net/wanzijy/article/details/125512072
Hystrix熔断器整合 - 请求合并:https://blog.csdn.net/wanzijy/article/details/125579664
Hystrix熔断器整合 - 服务隔离之线程池隔离:https://blog.csdn.net/wanzijy/article/details/125630353
Hystrix熔断器整合 - 服务隔离之信号量隔离:https://blog.csdn.net/wanzijy/article/details/125826690
Hystrix熔断器整合 - 服务熔断和服务降级:https://blog.csdn.net/wanzijy/article/details/125826853
Hystrix熔断器整合 - Feign实现服务容错:https://blog.csdn.net/wanzijy/article/details/125985304
Hystrix熔断器整合 - 可视化界面三部曲:https://blog.csdn.net/wanzijy/article/details/126005452
1. 说明
在 product-service 的 controller 中,有两个方法:
- 一个是根据 id 进行主键查询的 selectProductById()
- 一个是传一个 id 的 List 集合进行查询的 selectProductListByIds()
请求合并的意思是:将多次的使用 selectProductById() 的这些请求合并在一起或者合并为多批,然后一次或分批的使用 selectProductListByIds()
2. 在 order-service-rest 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
3. 修改 order-service-rest 的 ProductServiceImpl 的方法
selectProductListByIds 方法:
@HystrixCommand // 声明需要服务容错的方法
selectProductListById 方法:
- 因为在这里接口实现类的返回值变了,所以在接口中也要去修改其返回值
- 修改 selectProductListById 接口中的返回值为 Future<Product>
- 在下面的方法中,设置了当同一个请求被访问的间隔时间不超过设置的时间时,就将这些请求合并成一次请求。要是在后面测试发现请求合并失败,可以把间隔的时间再设置得小一点。因为每个人电脑的配置不同,处理的速度也会不同,所以可根据需求修改间隔的时间
/**
* 处理请求合并的方法一定要支持异步,返回值必须是 Future<T>
* 合并请求
* @param id
* @return
*/
@HystrixCollapser(batchMethod = "selectProductListByIds", // 合并请求的方法
scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL, // 请求方式
collapserProperties = {
@HystrixProperty(name = "timerDelayInMilliseconds", value = "20"), // 间隔多久的请求会进行合并,默认 10ms
@HystrixProperty(name = "maxRequestsInBatch", value = "200") // 批处理之前,批处理中允许的最大请求数
}
)
@Override
public Future<Product> selectProductListById(Integer id) {
System.out.println("------orderService------selectProductListById------");
return null; // 在这里不做处理,看最终的控制台打印
}
4. 在 OrderServiceImpl 模拟一次发5次请求
@Override
public Order searchOrderById(Integer id) {
/*
模拟5个请求,看一会的 ProductServiceImpl 执行的是哪个方法
执行 selectProductListByIds 代表请求合并成功
*/
Future<Product> p1 = productService.selectProductListById(1);
Future<Product> p2 = productService.selectProductListById(2);
Future<Product> p3 = productService.selectProductListById(3);
Future<Product> p4 = productService.selectProductListById(4);
Future<Product> p5 = productService.selectProductListById(5);
try {
System.out.println(p1.get());
System.out.println(p2.get());
System.out.println(p3.get());
System.out.println(p4.get());
System.out.println(p5.get());
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return new Order(id, "order-003", "中国", 29000D, null);
}
Future 是 JUC 并发编程包里的并发框架,在这里不进行说明,了解即可
5. 在 order-service-rest 的启动类上开启熔断注解
@EnableHystrix // 开启熔断器注解
6. 测试
此处要观察的是控制台打印的语句:
- 如果打印一次“------orderService------selectProductListByIds------”,且能取到5个值,证明合并成功
- 如果打印五次“------orderService------selectProductListById------”,则请求合并失败
访问 http://localhost:9090/order/1/product