Spring Cloud(三):断路器Hystrix和Hystrix Dashboard

Netflix创造了一个可调用的库来实现断路器模式,即Hystrix组件,在微服务架构中,一个API网关控制请求发送到不同的服务中,如下图所示,各个客户端通过API网关发送请求到各个服务

HystrixGraph

当一个服务挂掉的时候,会导致通信出现问题。当请求这个服务的次数达到一定阈值时(Hystrix中的默认值为5秒内出现20次故障),电路打开,不进行通话。在错误和开路的情况下,开发人员可以进行服务的修复。

HystrixFallback 

同时Hystrix提供Fallback(回滚)的作用,防止级联故障。接下来展示如何在SpringCloud中集成Hystrix组件

  • 配置Hystrix

在新建模块的时候加入以下依赖,其中actuator包是Hystrix监控必须的包

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

启动类上加上@EnableHystrix注解,表示开启Hystrix监控


@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
@EnableHystrix
public class EurekaConsumerHystrixApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerHystrixApplication.class, args);
    }

}

配置文件如下,其中feign.hystrix.enabled表示开启监控,这个属性配置时又没提示,很容易会以为是错的OAO

spring:
  application:
    name: eureka-consumer-hystrix
server:
  port: 8763
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
feign:
  hystrix:
    enabled: true

在上一个项目中以及写了Feign调用服务的接口,这次新建一个实现类,重写message方法,该方法是用在断路开路情况下调用的方法

@Component
public class HystrixRemote implements FeignRemote {
    @Override
    public String clientMessage(@RequestParam("name") String name) {
        return name + " this message sending failed";
    }
}

依次启动server、client、HystrixApplication

访问http://localhost:8763/message/hong,返回信息如下

然后我们停止client服务,断路器Hystrix就会起作用,并且返回当服务断路开路时要调用的方法

  • Hystrix Dashboard

Hystrix Dashboard是Hystrix提供的监控面板,是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。

在刚才的项目上修改,新增dashboard依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

然后是启动类上增加@EnableHystrixDashboard注解

@SpringBootApplication
@EnableHystrixDashboard
@EnableEurekaClient
@EnableFeignClients
public class HystrixDashboardTurbineApplication {

    public static void main(String[] args) {
        SpringApplication.run(HystrixDashboardTurbineApplication.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;
    }
}

这里多加了一个servlet,是因为SpringBoot1.x版本和2.x版本的不同,如果按照1.x的版本的各个教程去启动,就会导致dashboard页面无法连接到服务的错误,即红色字体的hystrix dashboard Unable to connect to Command Metric Stream,在源码中体现为HystrixStreamEndpoint ——>HystrixMetricsStreamServlet 。其中的description就告诉我们需要增加这个HystrixMetricsStreamServlet的映射才能保证hystrix的正常运行

/**
 * Streams Hystrix metrics in text/event-stream format.
 * <p>
 * Install by:
 * <p>
 * 1) Including hystrix-metrics-event-stream-*.jar in your classpath.
 * <p>
 * 2) Adding the following to web.xml:
 * <pre>{@code
 * <servlet>
 *  <description></description>
 *  <display-name>HystrixMetricsStreamServlet</display-name>
 *  <servlet-name>HystrixMetricsStreamServlet</servlet-name>
 *  <servlet-class>com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet</servlet-class>
 * </servlet>
 * <servlet-mapping>
 *  <servlet-name>HystrixMetricsStreamServlet</servlet-name>
 *  <url-pattern>/hystrix.stream</url-pattern>
 * </servlet-mapping>
 * } </pre>
 */
public class HystrixMetricsStreamServlet extends HystrixSampleSseServlet {

   .......

}

配置文件上新增endpoint指向属性

spring:
  application:
    name: eureka-consumer-hystrix
server:
  port: 8764
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
feign:
  hystrix:
    enabled: true
management:
  endpoints:
    web:
      exposure:
        exclude: hystrix.stream

然后就可以打开http://localhost:8764/hystrix,看到如下画面

如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用第三个,这里我们选第三个,输入url:http://localhost:8764/hystrix.stream

发现都处于loading状态,因为没有请求发送,这时我们访问http://localhost:8764/message/hong,发送请求,就可以看见监控画面了

下图是对这个图形界面的解释

demo地址:https://github.com/hong52ni/SpringCloud-Demo-Aggregate

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方木丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值