传统服务中当用户在请求c时 c请求b b请求a时 当多个用户(线程)同时请求c此时由于a迟迟不响应造成线程大面积堵塞 此时a就会发生雪崩(一台机器出现问题导致与其关联的机器也出现问题),同时影响cb
基于ribbon项目进行搭建
1.引入Hystrix maven依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>2.将启动类加入@EnableHystrix注解
3.在server层需要熔断保护机制的方法加上 @HystrixCommand(fallbackMethod = “ErrorHandler”) 定义好回退方法 编写回退方法 此时我们需要注意两点
此时依次启动 server client ribbon项目 访问
http://localhost:8888/info
当我们关闭了client项目之后重新访问
hystrix断路器有自我检测功能默认是1秒钟请求
我们可以通过改造模拟出来对应功能
我们可以将server的方法改造成
当睡眠时间超过一秒(默认熔断超时时间是1S)就会发生熔断机制 由此我们可以看出Hystrix可以自我修复
当1秒内又恢复正常
我们也可以通过修改HystrixCommand的属性来设置默认超时时间
基于feign项目
feign自带对hystrix的支持 所有无需导包
1.编写一个回退类必须实现类中Feign接口的所有方法
@Componentpublic class EurekaClientFeignHystrix implements EurekaClientFeign { @Override public String infoByFeign() { return "This is Feign with Hystrix"; } @Override public Student getStudentByFeign(String name, String address) { return null; } @Override public Student postStudentByFeign(Parent parent) { return null; }}@FeignClient 的fallback 属性 指定改接口的实现类
此时默认Feign的hystrix 是关闭的
我们需要再yml文件中进行配置
此时我们访问
http://localhost:8889/infoByFeign
client打印了两次数据 feign断路由在加载超过1S中之后会返回结果的同时还会再去重新加载一次
maven引入该注解
<!-- 仪表盘 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>启动类修改如下
@SpringBootApplication@EnableEurekaClient@EnableHystrix //启动熔断器@EnableHystrixDashboard //启动仪表盘public class SpringCloudRibbonApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudRibbonApplication.class, args); } @Bean public ServletRegistrationBean getServlet() { HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; }}此时依次启动server client ribbon
访问http://localhost:8888/hystrix.stream 图如下
此时我们访问开启了断路由的方法
此时数据就得到了监控此时由于全是json字符串 需要转换成图形界面
访问 http://localhost:8888/hystrix/
填写完毕进入
重新访问接口此时监控界面会出现以下内容