实战前需了解: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
这里是将 order-service-rest 下进行远程调用的 ProductServiceImpl 中的以下两个方法进行线程池隔离:
- public List<Product> selectProductList()
- public Product selectProductListById(Integer id)
以下操作均在 order-service-rest 模块中进行
1. 修改 ProductService
因为在实现请求合并的文章中,将 selectProductListById(Integer id) 接口方法的返回值修改成了 Future<Product>,所以在此处要将其修改回来
Product selectProductListById(Integer id);
2. 修改 ProductServiceImpl
@HystrixCommand(
groupKey = "order-productService-listPool", // 服务名称,相同名称使用同一个线程池
commandKey = "selectProductList", // 接口名称,默认为方法名
threadPoolKey = "order-productService-listPool", // 线程池名称,相同名称使用同一个线程池
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000") // 超时实践, 默认为 1000ms
},
threadPoolProperties = {
/*
线程池大小,在这里设置为6份,因为我们在配置文件中重新设置了并发线程数为10个,所以在这里给他6个
等会在 selectProductListById() 方法中分3份,那么只剩下一份给其他的方法去竞争
*/
@HystrixProperty(name = "coreSize", value = "6"),
@HystrixProperty(name = "maxQueueSize", value = "100"), // 队列等待阀值(最大等待长度), 默认 -1
@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"), // 线程存活时间,默认 1min
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "100") // 超出队列等待阀值执行拒绝策略
},fallbackMethod = "selectProductListFallback "
)
@Override
public List<Product> selectProductList() {
System.out.println(Thread.currentThread().getName() + "------selectProductList------");
return restTemplate.exchange(
"http://product-service/product/list",
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<Product>>() {
}).getBody();
}
/**
* 其实这个就是服务降级
* @return
*/
private List<Product> selectProductListFallback() {
// 托底数据,即拒绝服务后,返回给他的数据,在下面测试中没有用到
System.out.println("------selectProductListFallback------");
return Arrays.asList(
new Product(1, "托底数据-华为手机", 1, 5800D),
new Product(2, "托底数据-联想笔记本", 1, 6888D),
new Product(3, "托底数据-小米平板", 5, 2020D)
);
}
@Override
@HystrixCommand(groupKey = "order-productService-singlePool", // 服务名称,相同名称使用同一个线程池
commandKey = "selectProductListById", // 接口名称,默认为方法名
threadPoolKey = "order-productService-singlePool", // 线程池名称,相同名称使用同一个线程池
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000") // 超时实践, 默认为 1000ms
},
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "3"), // 线程池大小,在上面设置了为6份,因为我们在配置文件中设置了并发线程数为10个,在这里给他3个此时就剩下一个留给其他方法去竞争
@HystrixProperty(name = "maxQueueSize", value = "100"), // 队列等待阀值(最大等待长度), 默认 -1
@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"), // 线程存活时间,默认 1min
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "100") // 超出队列等待阀值执行拒绝策略
}
)
public Product selectProductListById(Integer id) {
System.out.println(Thread.currentThread().getName() + "------selectProductListById------");
return restTemplate.getForObject("http://product-service/product/" + id, Product.class);
}
3. 修改 OrderServiceImpl
@Override
public Order searchOrderById(Integer id) {
return new Order(id, "order-003", "中国", 2666D,
Arrays.asList(productService.selectProductListById(5)));
}
4. 测试
在 JMeter 中再次执行 http://localhost:9090/order/1/product/list 接口的压力测试
然后分别访问:
- http://localhost:9090/order/1/product/list
- http://localhost:9090/order/1/product
此时看控制台的打印:
可以看到是在不同线程池中工作
由于一些并发数的配置问题,没有看到回调方法中返回的托底数据