美文网首页
三 . Spring-Cloud Hystrix 断路器

三 . Spring-Cloud Hystrix 断路器

作者: 任未然 | 来源:发表于2019-10-04 11:08 被阅读0次

一 . 概述

分布式系统中一个微服务需要依赖于很多的其他的服务,那么服务就会不可避免的失败。例如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

6.png

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

7.png

相关文章

网友评论

      本文标题:三 . Spring-Cloud Hystrix 断路器

      本文链接:https://www.haomeiwen.com/subject/jmojpctx.html