-
使用熔断器防止服务雪崩-Hystrix
-
雪崩效应
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以通过 RPC 相互调用,在 Spring
Cloud 中可以用 RestTemplate + Ribbon 和 Feign 来调用。为了保证其高可用,单个服务通常会集群部署。由
于网络原因或者自身的原因,服务并不能保证 100% 可用,如果单个服务出现问题,调用这个服务就会出现线
程阻塞,此时若有大量的请求涌入,Servlet 容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的
依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 “雪崩” 效应。 -
Hystrix概述
-
Netflix 开源了 Hystrix 组件,实现了熔断器模式,Spring Cloud 对这一组件进行了整合。在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图:
-
较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystrix 是 5 秒
20 次) 熔断器将会被打开。
-
熔断器打开后,为了避免连锁故障,通过 fallback 方法可以直接返回一个固定值。
-
-
Ribbon 中使用熔断器
-
添加Hystrix依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
-
在启动类添加EnableHystrix注解设置允许使用熔断器
/** * 在启动类添加@EnableDiscoveryClient声明此应用为服务发现客户端(服务消费者) * 在启动类添加EnableHystrix注解设置允许使用熔断器 */ @EnableDiscoveryClient @SpringBootApplication @EnableHystrix public class SpringCloudCustomer1Application { public static void main(String[] args) { SpringApplication.run(SpringCloudCustomer1Application.class, args); } }
-
在Service中访问服务的方法中增加@HystrixCommand注解,指定服务访问达到熔断器阈值时调用的方法
@Service public class RibbonService { //注入消费者访问对象 @Autowired private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "requestFail") public String getMsg(){ String str = restTemplate.getForObject("http://springcloudprovider1/ provider1/get",String.class); return str; } public String requestFail(){ return "request fail ..."; } }
-
-
Feign中使用熔断器
-
开启熔断器, Feign 是自带熔断器的,但默认是关闭的。需要在配置文件中配置打开它,在配置文件增加以下代码:
feign: hystrix: enabled: true
-
在FeignService的@FeignClient注解添加fallback属性
/** * fallback属性,指定熔断器open状态调用的类 */ @FeignClient(value="springcloud-provider1",fallback = FeignServiceFallback.class) public interface FeignService { @RequestMapping(value="provider1/get",method = RequestMethod.GET) public String getMsg(); }
-
创建fallback指定的回退类
/** * fallback(回退)类实现FeignService接口 */ @Component public class FeignServiceFallback implements FeignService { @Override public String getMsg() { return "request fail ..."; } }
-
-
使用熔断器仪表盘监控-Hystrix Dashboard
-
熔断器仪表盘,用于监控熔断器作用过程
-
在Ribbon和Feign项目增加Hystrix仪表盘功能,两个项目增加Hystrix的方式是相同的相同
-
添加Hystrix仪表盘监控
-
在pom.xml中增加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
-
在启动类中增加 @EnableHystrixDashboard 注解
@EnableDiscoveryClient @SpringBootApplication @EnableHystrix @EnableHystrixDashboard public class SpringCloudCustomer1Application { public static void main(String[] args) { SpringApplication.run(SpringCloudCustomer1Application.class, args); } }
-
创建hystrix.stream的Servlet配置(Java配置类配置,类似shiro的配置)
@Configuration public class HystrixDashboardConfig { @Bean public ServletRegistrationBean getServlet() { //创建HystrixMetricsStreamServlet HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); //配置HystrixMetricsStreamServlet ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; } }
-
测试Hystrix Dashboard
-
浏览器端访问 http://localhost:port/hystrix
-
-
-
-