在微服务架构中,我们将系统分成了一个一个单元,各个单元应该通过服务注册与订阅的方式进行一个相互依赖,每一个单元在不同的进程中去运行,依赖通过远程调用的方式运行,这样就会产生一些问题,比如网络延迟、自身系统故障、请求急剧增加导致任务挤压、线程资源无法释放,这些很可能会导致系统瘫痪,甚至影响到一些核心业务。
一. 降级
我们具体来实现下:
在父工程RocketParent的pom文件中添加hystrix的版本号
我们首先在order服务的pom文件中添加下面三个jar包
然后再config包下建立一hystrix包,在包内编写一个HystrixConfig类
然后我们再web包下建立一个OrderController:
package com.yy.order.web;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
// 超时降级
@HystrixCommand(
commandKey = "createOrder",
commandProperties = {
@HystrixProperty(name="execution.timeout.enabled", value="true"),
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000"),
},
fallbackMethod = "createOrderFallbackMethod4Timeout" //降级调用的方法名
)
@RequestMapping("/createOrder")
public String createOrder(@RequestParam("cityId")String cityId,
@RequestParam("platformId")String platformId,
@RequestParam("userId")String userId,
@RequestParam("supplierId")String supplierId,
@RequestParam("goodsId")String goodsId) throws Exception{
return "下单成功!";
}
//降级的方法一定要与原来的方法一模一样(返回值,函数参数,),除了方法名
public String createOrderFallbackMethod4Timeout(@RequestParam("cityId")String cityId,
@RequestParam("platformId")String platformId,
@RequestParam("userId")String userId,
@RequestParam("suppliedId")String suppliedId,
@RequestParam("goodsId")String goodsId) throws Exception {
System.err.println("-------超时降级策略执行------------");
return "hysrtix timeout !";
}
}
然后我们就可以测试了:
我们可以看到,熔断器还没发挥作用,现在我们在原函数createOrder中阻塞五秒种
我们再测试,我们就可以看到方法降级了
二. 限流
和降级一样,我们只需要修改@HystrixCommand标签里面的内容即可(我们这里使用的线程池限流方式,我们还有信号量方式)
使用Jmeter测试:(关于jmeter的使用可以看这篇博文:https://blog.csdn.net/u012111923/article/details/80705141)
可以看到当没满足threadPoolProperties里面的条件时,就降级了
三. 批量请求合并
上面配置的意思是:单个请求延迟200秒,200秒后将50个或少于50个请求合并发送(超过的部分下次合并发送)