一 . 概述
分布式系统中一个微服务需要依赖于很多的其他的服务,那么服务就会不可避免的失败。例如A服务依赖于B、C、D等很多的服务,当B服务不可用的时候,会一直阻塞或者异常,更不会去调用C服务和D服务。同时假设有其他的服务也依赖于B服务,也会碰到同样的问题,这就及有可能导致雪崩效应。
如下案例:一个用户通过通过web容器访问应用,他要先后调用A、H、I、P四个模块,一切看着都很美好。

由于某些原因,导致I服务不可用,与此同时我们没有快速处理,会导致该用户一直处于阻塞状态。

当其他用户做同样的请求,也会面临着同样的问题,tomcat支持的最大并发数是有限的,资源都是有限的,将整个服务器拖垮都是有可能的。

Hystrix是一个用于分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖会不可避免的调用失败,例如超时,异常等,Hystrix能保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
断路器本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控(类似于保险丝),向调用者返回符合预期的,可处理的备选响应,而不是长时间的等待或者抛出无法处理的异常,这样就保证了服务调用的线程不会被长时间,不必要的占用,从而避免故障在分布式系统中的蔓延,乃至雪崩。
Hystrix在网络依赖服务出现高延迟或者失败时,为系统提供保护和控制;可以进行快速失败,缩短延迟等待时间;提供失败回退(Fallback)和相对优雅的服务降级机制;提供有效的服务容错监控、报警和运维控制手段。
二 . 基础使用
2.1 配置依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.2 application.yml配置
feign:
hystrix:
enabled: true #开启feign的熔断机制
2.3 启动类配置
只需要在启动类上加上@EnableCircuitBreaker注解即可,如下所示:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
public class ShopConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ShopConsumerApplication.class, args);
}
}
2.4 接口的编写 (在service层)
在接口的@FeignClient注解中加入fallback参数,该参数为Class类型的对象,我们将该接口实现,作为服务降级后的快速响应,然后提供给fallback作为参数的值,如下所示:
@FeignClient(name = "shop-provier", fallback = TicketServiceFallback.class)
public interface TicketService {
@RequestMapping(value = "ticket", method = RequestMethod.GET)
public List<Ticket> getAllTicket(Person person);
}
TicketServiceFallback是对TicketService这个接口的实现,用于在服务降级后的一个快速响应,代码如下:
@Component
public class TicketServiceFallback implements TicketService {
@Override
public List<Ticket> getAllTicket(Person person) {
return Arrays.asList(new Ticket());
}
}
三 . Hystrix监控
3.1 配置依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
3.2 启动类配置
在启动类上加上@EnableHystrixDashboard注解,如下图所示:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrixDashboard
public class ShopConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ShopConsumerApplication.class, args);
}
}
3.3 编写servlet入口
@Bean
public ServletRegistrationBean getServlet() {
// 该Servlet是处理Hystrix监控
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean<HystrixMetricsStreamServlet> servlets = new ServletRegistrationBean<>();
servlets.setServlet(streamServlet);
servlets.setName("streamServlet");
servlets.addUrlMappings("/actuator/hystrix.stream");
servlets.setLoadOnStartup(2);
/**
<servet>
<servlet-name>streamServlet</servlet-name>
<serlvet-class>HystrixMetricsStreamServlet</servlet-class>
<load-on-starup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>streamServlet</servlet-name>
<url-pattern>/actuator/hystrix.stream</url-pattern>
</servlet-mapping>
*/
return servlets;
}
3.4 访问Hystrix Dashboard

在输入框中输入:http://locahost:8080/actuator/hystrix.stream

网友评论