一,一种可视化的数据监控dashboard
首先看下非可视化的数据监控:
我们先在原来的项目e-book-consumer-hystrix-ribbon-threadpool上做些改造。
(1)pom文件加入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
(2)启动类中加入两个注解。
(3)启动,浏览器访问http://localhost:8104/list,结果如下:
(4)然后浏览器访问http://localhost:8104/hystrix.stream,结果如下:
一般我们不会去看上面的那些数据,现在来看下可视化数据监控是怎样弄的。
(5)复制一份e-book-consumer-hystrix-ribbon-threadpool项目到e-book-consumer-hystrix,重命名为e-book-consumer-hystrix-dashboard,保留配置文件及启动类和pom文件,其他的删掉。
(6)启动该项目。
(7)浏览器访问http://localhost:8107/hystrix/,界面如下:
在url框中输入:http://localhost:8104/hystrix.stream,如何在title框中输入test(随便输),点击下面的“Monitor Stream”按钮,出现的界面如下,连续访问http://localhost:8104/list:
下面是一张解析图:
二,如何在集群的情况下收集监控信息
上一节讲的是用dashboard去监控单个服务的信息,但是监控单个服务的数据没有多大意义,要想看整个系统的监控数据,就需要用到spring cloud的另一个组件,即hystrix turbine。turbine将每个服务的hystrix dashboard的监控数据进行了整合。turbine的使用很简单,只需加入相应的注解,依赖和配置即可。
(1)首先我们改造一下e-book-consumer-hystrix-feign-fallback。
A,修改启动类,加上如下注解:
@EnableHystrixDashboard
@EnableCircuitBreaker
B,修改pom文件,加入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
(2)在e-book-consumer-hystrix模块下新建一个maven项目,命名为e-book-consumer-hystrix-turbine。
(3)修改pom文件,加入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-turbine</artifactId>
</dependency>
(4)修改配置文件。
spring.application.name=e-book-hystrix-dashboard
server.port=8108
eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/
#默认是hostname 注册,改成IP 注册
eureka.instance.perferIpAddress=true
#---------------------------------------turbine--------------------------
#配置Eureka中的serviceId列表,表明监控哪些服务
turbine.appConfig=e-book-consumer-hystrix-ribbon-threadpool,e-book-consumer-hystrix-feign-fallback
#指定聚合哪些集群,多个使用","分割,默认为default。可使用http://.../turbine.stream?cluster={clusterConfig之一}访问
turbine.aggregator.clusterConfig= default
# 1. clusterNameExpression指定集群名称,默认表达式appName;此时:turbine.aggregator.clusterConfig需要配置想要监控的应用名称;
# 2. 当clusterNameExpression: default时,turbine.aggregator.clusterConfig可以不写,因为默认就是default;
# 3. 当clusterNameExpression: metadata['cluster']时,假设想要监控的应用配置了eureka.instance.metadata-map.cluster: ABC,
# 则需要配置,同时turbine.aggregator.clusterConfig: ABC
turbine.clusterNameExpression="default"
(5)添加一个启动类
package com.twf.e.book.consumer.hystrix.turbine;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.turbine.EnableTurbine;
@SpringBootApplication
@EnableTurbine // 开启turbine
public class HystrixTurbineApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixTurbineApplication.class, args);
}
}
(6)启动eureka注册中心,启动e-book-consumer-hystrix-ribbon-threadpool,e-book-consumer-hystrix-feign-fallback这两个服务,再启动e-book-consumer-hystrix-dashboard,如何启动本项目turbine。
(7)浏览器访问http://localhost:8108/turbine.stream,结果如下:
(8)然后浏览器访问http://localhost:8107/hystrix,url框中输入http://localhost:8108/turbine.stream,点击“Monitor Stream”按钮,界面如下:
(注意,若界面出不来,可能原因是没有请求,我们可以访问一下这两个服务的接口接口:http://localhost:8104/list,http://localhost:8105/list) (9)源码点这里。
三,采用RabbitMQ,收集监控数据
首先我们来看一下turbine+dashboard收集数据监控信息得原理图,如下:
而采用RabbitMQ之后的原理图如下:
其实就是在消费者和turbine之间加入了rabbitmq。
为什么要采用RabbitMQ来收集监控数据呢?
1,降低耦合度,服务不再直接依赖turbine了;
2,不用再写turbine的配置信息。
下面是实战例子。
(1)在e-book-consumer-hystrix模块下新建maven项目,命名为e-book-consumer-hystrix-threadpool-mq,拷贝项目e-book-consumer-hystrix-threadpool的文件及部分代码到该新建项目。
(2)修改pom文件,添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
(3)修改配置文件,添加如下配置:
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=twf
spring.rabbitmq.password=123456
spring.rabbitmq.virtualHost=/
(4)然后在e-book-consumer-hystrix模块下再新建一个maven项目,命名为e-book-consumer-hystrix-turbine-mq,拷贝项目e-book-consumer-hystrix-turbine的文件及部分代码到该项目。
(5)修改pom文件,去掉所有依赖,加入如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
(6)修改配置文件,去掉原来的turbine的配置,加入rabbitmq的配置:
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=twf
spring.rabbitmq.password=123456
spring.rabbitmq.virtualHost=/
(7)修改启动类,修改注解,如下:
package com.twf.e.book.consumer.hystrix.turbine.mq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.turbine.stream.EnableTurbineStream;
@SpringBootApplication
@EnableTurbineStream
public class HystrixTurbineMqApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixTurbineMqApplication.class, args);
}
}
(8)然后启动eureka注册中心,启动dashboard,启动刚刚新建的两个项目。
(9)浏览器访问http://localhost:8107/hystrix,在这个页面的url框中输入http://localhost:8108/turbine.stream,点击下边按钮得如下展示:
(10)源码点这里。