Hystrix熔断器整合 - 服务隔离之线程池隔离

实战前需了解: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

此时看控制台的打印:
在这里插入图片描述
可以看到是在不同线程池中工作

由于一些并发数的配置问题,没有看到回调方法中返回的托底数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LF3_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值