springcloud之hystrix
1.什么是hystrix?hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能.2、hystrix能做什么?Hystrix 负责监控服务之间的调用情况,连续多次失败的情况进行熔断保护。保护的方法就是使用Fallback,当调用的服务出现故障时,就可以使用Fallback 方法的返回值;Hystrix 间隔时
1.什么是hystrix?
hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能.
2、hystrix能做什么?
Hystrix 负责监控服务之间的调用情况,连续多次失败的情况进行熔断保护。保护的方法就是使用 Fallback,当调用的服务出现故障时,就可以使用 Fallback 方法的返回值;Hystrix 间隔时间会再次检查故障的服务,如果故障服务恢复,将继续使用服务。
通过hystrix可以解决雪崩效应问题,它提供了资源隔离、降级机制、熔断、缓存等功能。
资源隔离:包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
缓存:返回结果缓存,后续请求可以直接走缓存。
请求合并:可以实现将一段时间内的请求(一般是对同一个接口的请求)合并,然后只对服务提供者发送一次请求。
3、功能点详解
3.1、服务降级
服务降级的目的保证上游服务的稳定性,当整体资源快不够了,将某些服务先关掉,待渡过难关,再开启回来。
使用场景:
比如双十一买东西,出现“哎哟喂,被挤爆了”。
app秒杀某个商品提示 “网络开小差,请稍后再试”。
使用 Hystrix 服务降级:
设置自身调用超时时间的峰值,峰值内可以正常运行,超过了需要有兜底的方法处理,作服务降级fallback。
服务降级 fallback 既可以放在服务端,也可以放在客户端,但是我们一般放在客户端,这里两种都演示一下。
3.1.1、服务提供者服务降级
@RestController
public class ProductController {
@RequestMapping("/getProduct")
@HystrixCommand(fallbackMethod = "getProductFailed",
commandProperties = {
//设置这个线程的超时时间是3s,3s内是正常的业务逻辑,超过3s调用fallbackMethod指定的方法进行处理
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
}
)
public Product getProduct() {
int timeNumber = 5;
//int age = 10/0;
try {
TimeUnit.SECONDS.sleep(timeNumber);
} catch (InterruptedException e) {
e.printStackTrace();
}
Product product = new Product();
return product;
}
/**
* 该方法是对接口调用异常的处理方法
*/
public Product getProductFailed() {
Product product = new Product();
product.setName("getProduct服务异常");
return product;
}
}
@SpringBootApplication
@EnableEurekaClient //开启Eureka客户端
@EnableHystrix // 启用hystrix ,@EnableHystrix继承了@EnableCircuitBreaker
public class SpringcloudStudyProductApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudStudyProductApplication.class, args);
}
}
启动测试,没有报错,而是执行了fallbackMethod指定的方法
{
"name": "getProduct服务异常",
"age": 12,
"add": "北京市历史互通",
"email": "6666.qq.com"
}
如果我们故意制造两个异常:
int age = 10/0; 运行时异常
我们能接受3秒钟,它运行5秒钟,超时异常。
当前服务不可用了,做服务降级,兜底的方案都是getProductFailed。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)