Spring Cloud Hystrix理解与实践(一):搭建简…

2019-05-24 06:10:38来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

 

 前言

  在分布式架构中,所谓的断路器模式是指当某个服务发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,这样就不会使得线程因调用故障服务被长时间占用不释放,避免故障的继续蔓延Spring Cloud Hystrix实现了断路器,线程隔离等一系列服务保护功能,它是基于Netflix的开源框架Hystrix实现的。

  目的不是介绍Hystrix的与原理、及其使用等(有时间也要记录啊),而是通过实战搭建一个简单的监控集群,使用Hystrix Dashboard仪表盘动态监控展示以此来加深对Hystrix的认识与理解,为什么要记录呢?这是因为网上资料甚少(或版本过低,不适用),同时加之书中的Spring Cloud版本与现在Spring Boot 2.x差距明显

  本文主要参考《Spring Cloud 微服务实战》(PDF电子版,需要的朋友可以私聊或评论)

 


 

一、Hystrix 仪表盘

1、认识Hystrix仪表盘

  HystrixCommand与HystrixObserableCommand实例执行过程中记录的重要信息称之为Hystrix仪表盘,以供内部或者外部进行查询使用。Spring Cloud整合仪表盘组件Hystrix Dashboard,主要用来实时监控Hystrix的各项指标信息,可以帮我们快速发现系统中存在的问题,从而及时地采取应对措施。

  1)加入依赖

  特别注意Spring Boot 2.x版本引入的hystrix-dashboard依赖,不然可能访问不了http://localhost:port/hystrix仪表盘页面,注解@EnableHsytrixDashboard也可能找不到

 <!-- hystrix 容错机制 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>${spring-cloud-eureka.version}</version>
        </dependency>
        <!-- actuator监控 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- Spring Boot 2.x以上版本 spring-cloud-starter-netflix-hystrix-dashboard 仪表盘,
        以下版本则需要spring-cloud-starter-hystrix-dashboard-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
            <version>${spring-cloud-eureka.version}</version>
        </dependency> 

  2)添加配置

# 应用实例
spring:
  application:
    name: hystrix-dashboard

server:
  port: 8000

# actuator开放所有端点,Spring Boot 2.x与1.x不同,具体请查询
management:
  endpoints:
    web:
      exposure:
        include: "*"

  3)增加注解:应用主类加上@EnableHsytrixDashboard,启用Hystrix Dashboard功能。

@EnableHystrixDashboard // 开启Hystrix仪表盘
@SpringBootApplication
public class HystrixMonitorApplication {

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

}

  4)访问http://localhost:8000/hystrix界面如下:

          

2、监控页面介绍

 

从界面中我们就可以看到Hystrix Dashboard支持不同的三种监控方式:

  1) 默认的集群监控:通过URL http://turbine-hostname:port/turbine.stream

  2) 指定的集群监控:通过URL http://turbine-hostname:port/turbine.stream?cluster=[clusterName]开启

  3) 单体应用的监控:URL http://hystrix-app:port/hystrix.stream开启,实现对具体某个服务实例的监控

   前两者关于集群的监控需要整合turbine才能实现,而对于单体实例节点需要访问实例的/hystrix.stream接口实现,我们自然需要为服务实例添加端点。只需要添加acutator与hystrix依赖,应用主程序类开启断路器@EnableCircuitBreaker注解与@EnableHystrixDashboard注解即可。

其中的参数:

  1)Delay:用来控制服务器上轮询监控信息的延迟时间,默认为2000ms。可以通过该配置该属性降低客户端的网络和CPU消耗。

  2)Ttile:对应进入监控后的的标题,如Hystrix,则进入监控页面后如下图红框标题

此外,我们在URL框输入我们需要监听的某个服务实例/hystrix.stream接口,如http://localhost:8081/hystrix.stream,就可以进入监控页面

 

 

                      

监控页面参数介绍:

1) 实心圆与曲线的含义

  实心圆颜色:健康度从绿色、黄色、橙色、红色递减

  实心圆大小:会根绝实例的请求流量发生变化,流量越大实心圆就越大。

  曲线:用来记录2分钟内流量的相对变化,可以通过它来观察流量的上升与下降。

2) 其它的指标参数:鼠标停留会显示相应的说明

          

 

 

二、简单监控架构

 

1、监控单实例的架构

  1)架构图

 

         

 

  2)过程说明

    • 服务提供者:HELLO-SERVICE,提供一个接口如:http:/HELLO-SERVER/hello,让消费者通过restTemplate(封装好的HTTP)调用消费
    • 服务消费者:RIBBON-CONSUMER,会有ribbon承担负载均衡的作用,分别轮询访问HELLO-SERVER-1与HELLO-SERVICE-2
    • 注册中心:Spring Cloud Eureka,主要负责服务治理:服务的注册、续约、剔除(更新)等
    • Hystrix仪盘表:通过/hystrix.stream接口监控某个服务实例,动态展示仪表盘数据。

  然而现在只针对一个实例来监控,而分布式系统中往往有很多实例,我们就需要利用Turbine和Hystrix Dashboard配置实现对集群的监控

 

2、监控聚合服务

  需要通过Turbine来聚合RIBBON-CONSUMER-1与服务RIBBON-CONSUMER-2成一个服务展示监控信息,并输出到Hystrix Dashboard中,只显示一张监控图,但是注意Hosts的数量为2

                

 

  (1)架构图

        

  (2)过程说明

    同上述“单实例监控”,不同的是这次服务消费者有RIBBON-CONSUMER-1与RIBBON-CONSUMER-2两个,通过/turbine.stream接口聚合两个服务实例(实则就是同一个服务不同实例)成一个服务,共同动态展示整个集群的动态数据。对于集群来说关注的是服务集群的高可用性,所以Turbine会将相同服务作为整体看待。

 

三、代码实践

1、实践前的准备

  首先本示例使用的是Idea+Maven构造的项目工程的,所以先熟悉下idea如何构建一个简单的Spring Boot项目

  1)新建项目:File->New->Project

  

  2)选择Spring Initializr,选择默认的https://start.spring.io(需要联网),点击Next

  

  3)填写项目信息

  

  4)选择依赖,这里我们只需要选择web依赖即可,之后再加入相关Spring Cloud Hystrix的依赖,这是因为Spring Boot版本与Spring Cloud版本有相对应的关系,不然会冲突项目到处都是坑

  

  5)查看Spring Boot与Spring Cloud的版本对应关系从官网(https://spring.io/projects/spring-cloud)中查看,这里使用的是Spring Boot 2.0.6.RELEASE与Spring Cloud Fincley.SR1

 

   

  6)我们需要搭建以下的架构

            

 

  从图中我们知道我们需要:

  1)两个Eureaka Server提供高可用的注册中心:

    分别对应工程eureka-server与eureke-slave-server,配置文件中register-with-eureka与fetch-registry保持默认true,相互注册进行同步维护服务实例列表。

 

  2)两个服务提供者实例提供HELLO-SERVICE/hello服务:

    对应工程hello-service,打包成jar包后通过命令 java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8081 开启实例HELLO-SERVICE-1,通过命令 java -jar hello-service-0.0.1-SNAPSHOT.jar --server.port=8082 开启实例HELLO-SERVICE-2

  3)两个服务消费者实例消费HELLO-SERVICE/hello服务

    对应工程ribbon-consumer,打包jar包后通过命令 java -jar ribbon-consumer-0.0.1-SNAPSHOT.jar --server.port=8083 开启实例RIBBON-CONSUMER-1,通过命令 java -jar ribbon-consumer-0.0.1-SNAPSHOT.jar --server.port=8084 开启实例RIBBON-CONSUMER-2

  4)开启Spring Cloud Circuit Breaker 断路器

    引入相关依赖,应用程序中开启注解即可,具体请看下面示例。

  5)消费者开启负载均衡器

    服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用

  6)开启Hystrix Dashboard仪表盘

    引入hystrix dashboard、turbine等相关依赖,应用程序中开启注解即可,具体请看下面示例。

 

2、代码示例 

1)服务治理工程:eureka-service与eureka-slave-service

pom.xml文件内容:eureka-service与eureka-slave-service都相同

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
        <spring-cloud-eureka.version>1.4.6.RELEASE</spring-cloud-eureka.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Cloud Eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>${spring-cloud-eureka.version}</version>
        </dependency>
        <!-- 可以删除(需要同时删除Test类),但是为了不麻烦就保留了 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

eureka-service的application.yml文件:

server:
  port: 5678
eureka:
  instance:
    hostname: master
  # slave注册中心url
  client:
    service-url:
      defaultZone: http://slave:5679/eureka/
  # 关闭保护模式
  server:
    enable-self-preservation: false

eureka-slave-service的application.yml文件:

server:
  port: 5679
eureka:
  instance:
    hostname: slave
  client:
    service-url:
      defaultZone: http://master:5678/eureka/
  server:
    enable-self-preservation: false

注:需要在hosts文件中添加slave/master域名解析。

应用程序类开启@EnableEurekaServer注解,表明是注册中心服务器

@EnableEurekaServer
@SpringBootApplication
public class EurekaSlaveServerApplication {

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

}

2)服务提供者工程:hello-service

pom.xml文件内容:

注:这里加入的依赖是spring-cloud-starter-eureka,不是spring-cloud-starter-eureka-server

 

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
        <spring-cloud-eureka.version>1.4.6.RELEASE</spring-cloud-eureka.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>${spring-cloud-eureka.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

application.yml配置文件:

spring:
  application:
    name: hello-service
# 注册中心url
eureka:
  client:
    service-url:
      defaultZone: http://master:5678/eureka/,http://slave:5679/eureka/

  instance:
    # 定义服务失效的时间,默认为90s。
    lease-expiration-duration-in-seconds: 60
    # 续约任务的调用时间间隔,默认为30s
    lease-renewal-interval-in-seconds: 10

应用程序增加注解@EnableEurekaClient

@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {

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

}

编写/hello接口,提供消费者调用

  

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {

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

}

原文链接:https://www.cnblogs.com/jian0110/p/10912893.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:File类

下一篇:教妹学 Java:大有可为的集合