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

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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LF3_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值