这是一个从零开始的springcloud的系列教程,如果你从中间开始看,可能会看不明白.进入我的博客查看其他文章
前言
在之前课程中,我们学会创建了多工程项目,spring-cloud-learn.
搭建的项目有:
- eureka-server:服务治理中心,为微服务提供注册和管理
- eureka-client:在此工程学会了如何向服务端注册,如何发现其他服务,学会如何使用ribbon+restTemplate来访问eureka-client2的服务.
- eureka-client2: 提供了简单的api供eureka-client访问
- eureka-client-feign:在此工程学会了如何使用feign来访问eureka-client提供的api,如何使用feign提供的熔断器(hystrix)来防治雪崩效应,如何使用hystrix-dashboard来观察熔断状态.以及如何通过spring-actuator来提供熔断状态信息流.
因为微服务不可能只有一个,所以观察单个微服务的熔断状态是没有太大意义的.我们需要收集多个微服务的熔断状态,然后统一展示.Netflix系列为我们提供了工具turbine.
在开始前:
- 启动eureka-server微服务
- 启动eureka-client-feign微服务
Turbine
看单个的Hystrix Dashboard的数据并没有什么多大的价值,要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix Turbine。Hystrix Turbine将每个服务Hystrix Dashboard数据进行了整合。Hystrix Turbine的使用非常简单,只需要引入相应的依赖和加上注解和配置就可以了。
创建一个turbine工程
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-learn</artifactId>
<groupId>com.jack</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>turbine</artifactId>
<dependencies>
<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-netflix-hystrix-dashboard</artifactId>
</dependency>
<!--引入-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8000
spring:
application:
name: hystrix-turbine
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7770/eureka/
########## turbine配置详解 ############
# 情况1,使用服务名字作为集群名字,被监控应用不需要配置任务额外的东西,
# 直接读取被监控的应用服务名字作为集群。
# 当发现服务名字为EUREKA-CLIENT-FEIGN(eureka会让其大写),状态数据将会被读取
#turbine:
# aggregator:
# cluster-config: EUREKA-CLIENT-FEIGN # 需要监控的服务集群名
# app-config: eureka-client-feign # 需要监控的服务名
#情况2,当clusterNameExpression=metadata['cluster']
#使用被监控服务eureka.instance.metadata-map.cluster名字作为集群名字
#当发现服务的eureka.instance.metadata-map.cluster为EUREKA-CLIENT-FEIGN(eureka会让其大写),状态数据将会被读取
#turbine:
# aggregator:
# cluster-config: EUREKA-CLIENT-FEIGN # 需要监控的服务集群名,可以多个,用,号分隔
# app-config: eureka-client-feign # 需要监控的服务名,多个用,号分隔
# cluster-name-expression: metadata['cluster']
#情况3,当clusterNameExpression="'default'"
#无论什么服务状态数据都会将会被读取
turbine:
app-config: eureka-client-feign # 需要监控的服务名,多个用,号分隔
cluster-name-expression: "'default'"
# 读取被监控应用状态数据的路径,不写的情况默认为actuator/hystrix.stream
# turbine
# instanceUrlSuffix:
# default: actuator/hystrix.stream
创建turbine
package com.jack.turbine;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.turbine.EnableTurbine;
@SpringBootApplication
@EnableTurbine
// 启动dashboard
@EnableHystrixDashboard
// 启动hystrix
@EnableHystrix
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}
访问http://localhost:8000/hystrix,可以看到一个dashboard
因为使用turbine,所有要输入turbine的状态流,http://localhost:8000/turbine.stream, 该流收集的内容来自其他微服务提供的熔断状态流,比如eureka-client-feign微服务提供的流/actuator/hystrix.stream. 输入http://localhost:8000/turbine.stream,点击Monitor Stream.
此时访问eureka-client-feign微服务的api, http://localhost:7773/hello_stores,因为eureka-client服务没有启动,会触发eureka-client-feign微服务的熔断徽调,所以可以观察到以下信息.红色1表示访问失败一个.方法为feignService的sayStore方法.
是不是很简单.使用turbine,我们就能观察我们想要观察的服务了.
如果使用turbine配置的情况2,需要在eureka-client-feign的application.yml中加入,指定其集群名字,因为turbine通过读取该参数和cluster-config中的参数进行匹配来决定是否获取其状态流
eureka:
instance:
metadata-map:
cluster: EUREKA-CLIENT-FEIGN
输入http://localhost:8000/turbine.stream?cluster=EUREKA-CLIENT_FEIGN . 访问localhost:7773/hello_stores就可以观察到了.如果处于loading,稍微等一下,同步可能需要一小会.