Turbine使用

Posted edda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Turbine使用相关的知识,希望对你有一定的参考价值。

一、简介

Turbine是聚合服务器发送事件流数据的一个工具,Hystrix的监控中,只能监控单个节点,实际生产中都为集群,因此可以通过Turbine来监控集群下Hystrix的metrics情况
Turbine的github地址:https://github.com/Netflix/Turbine

二、基本环境

  • 一个eureka模块
  • 两个消费者模块
  • 一个turbine监控模块

三、创建eureka模块

(1)创建项目

创建一个spring boot项目

技术图片

(2)依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.abc</groupId>
  6. <artifactId>00-eurekaserver-8000</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <parent>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-parent</artifactId>
  12. <version>2.1.7.RELEASE</version>
  13. <relativePath/> <!-- lookup parent from repository -->
  14. </parent>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. <scope>test</scope>
  28. </dependency>
  29. <!--热部署依赖-->
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-devtools</artifactId>
  33. <optional>true</optional>
  34. </dependency>
  35. </dependencies>
  36. <dependencyManagement>
  37. <dependencies>
  38. <dependency>
  39. <groupId>org.springframework.cloud</groupId>
  40. <artifactId>spring-cloud-dependencies</artifactId>
  41. <version>${spring-cloud.version}</version>
  42. <type>pom</type>
  43. <scope>import</scope>
  44. </dependency>
  45. </dependencies>
  46. </dependencyManagement>
  47. <build>
  48. <plugins>
  49. <plugin>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-maven-plugin</artifactId>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

(3)application.yml配置

  1. server:
  2. port: 8000
  3. eureka:
  4. instance:
  5. hostname: localhost # 指定Eureka主机
  6. client:
  7. register-with-eureka: false # 指定当前主机是否向Eureka服务器进行注册
  8. fetch-registry: false # 指定当前主机是否要从Eurka服务器下载服务注册列表
  9. service-url: # 服务暴露地址
  10. defaultZone: http://localhost:8000/eureka
  11. # defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
  12. # server:
  13. # enable-self-preservation: false # 关闭自我保护

(4)启动类

  1. package com.abc.eureka;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. @SpringBootApplication
  6. @EnableEurekaServer // 开启Eureka服务
  7. public class EurekaServerApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(EurekaServerApplication.class, args);
  10. }
  11. }

四、创建消费者09-consumer-turbine-8080

(1)创建项目

创建一个spring boot项目

技术图片

(2)依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.7.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.abc</groupId>
  12. <artifactId>09-consumer-turbine-8080</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>09-consumer-turbine-8080</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <!--hystrix依赖-->
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  25. </dependency>
  26. <!--feign依赖-->
  27. <dependency>
  28. <groupId>org.springframework.cloud</groupId>
  29. <artifactId>spring-cloud-starter-openfeign</artifactId>
  30. </dependency>
  31. <!-- hystrix-dashboard依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.cloud</groupId>
  34. <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
  35. </dependency>
  36. <!--actuator依赖-->
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-actuator</artifactId>
  40. </dependency>
  41. <!--eureka客户端依赖-->
  42. <dependency>
  43. <groupId>org.springframework.cloud</groupId>
  44. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-web</artifactId>
  49. </dependency>
  50. <!-- https://mvnrepository.com/artifact/org.webjars.bower/jquery -->
  51. <dependency>
  52. <groupId>org.webjars.bower</groupId>
  53. <artifactId>jquery</artifactId>
  54. <version>2.1.1</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.projectlombok</groupId>
  58. <artifactId>lombok</artifactId>
  59. <optional>true</optional>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework.cloud</groupId>
  63. <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
  64. </dependency>
  65. <!--热部署依赖-->
  66. <dependency>
  67. <groupId>org.springframework.boot</groupId>
  68. <artifactId>spring-boot-devtools</artifactId>
  69. <optional>true</optional>
  70. </dependency>
  71. </dependencies>
  72. <dependencyManagement>
  73. <dependencies>
  74. <dependency>
  75. <groupId>org.springframework.cloud</groupId>
  76. <artifactId>spring-cloud-dependencies</artifactId>
  77. <version>${spring-cloud.version}</version>
  78. <type>pom</type>
  79. <scope>import</scope>
  80. </dependency>
  81. </dependencies>
  82. </dependencyManagement>
  83. <build>
  84. <plugins>
  85. <plugin>
  86. <groupId>org.springframework.boot</groupId>
  87. <artifactId>spring-boot-maven-plugin</artifactId>
  88. </plugin>
  89. </plugins>
  90. </build>
  91. </project>

(3)application.yml配置

  1. # 在微服务网关zuul中演示时需要该工程的端口号为8090
  2. server:
  3. port: 8080
  4. spring:
  5. application: # 指定微服务对外暴露的名称
  6. name: abcmsc-consumer-depart01
  7. eureka:
  8. client:
  9. service-url:
  10. defaultZone: http://localhost:8000/eureka
  11. # instance:
  12. # metadata-map:
  13. # cluster: ribbon
  14. # 开启Feign对Hystrix的支持
  15. feign:
  16. hystrix:
  17. enabled: true
  18. client:
  19. config:
  20. default:
  21. connectTimeout: 5000 # 指定Feign连接提供者的超时时限
  22. readTimeout: 5000 # 指定Feign从请求到获取提供者响应的超时时限
  23. # 开启actuator的所有web终端
  24. management:
  25. endpoints:
  26. web:
  27. exposure:
  28. include: "*"
  29. # 设置服务熔断时限
  30. hystrix:
  31. command:
  32. default:
  33. execution:
  34. isolation:
  35. thread:
  36. timeoutInMilliseconds: 3000

(4)实体类Depart

  1. package com.abc.consumer.bean;
  2. import lombok.Data;
  3. @Data
  4. public class Depart {
  5. private Integer id;
  6. private String name;
  7. }

(5)DepartCodeConfig类

  1. package com.abc.consumer.codeconfig;
  2. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.client.RestTemplate;
  6. @Configuration
  7. public class DepartCodeConfig {
  8. @LoadBalanced // 开启消息者端的负载均衡功能,默认是轮询策略
  9. @Bean
  10. public RestTemplate restTemplate() {
  11. return new RestTemplate();
  12. }
  13. }

(6)DepartController类

  1. package com.abc.consumer.controller;
  2. import com.abc.consumer.bean.Depart;
  3. import com.abc.consumer.service.DepartService;
  4. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.*;
  7. import java.util.List;
  8. @RestController
  9. @RequestMapping("/consumer/depart")
  10. public class DepartController {
  11. @Autowired
  12. DepartService service;
  13. // 服务降级:若当前处理器方法发生异常,则执行fallbackMethod属性指定的方法
  14. @HystrixCommand(fallbackMethod = "getHystrixHandle")
  15. @GetMapping("/get/{id}")
  16. public Depart getHandle(@PathVariable("id") int id) {
  17. return service.getDepartById(id);
  18. }
  19. public Depart getHystrixHandle(@PathVariable("id") int id) {
  20. Depart depart = new Depart();
  21. depart.setId(id);
  22. depart.setName("no this depart -- 方法级别");
  23. return depart;
  24. }
  25. }

(7)DepartService类

  1. package com.abc.consumer.service;
  2. import com.abc.consumer.bean.Depart;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.stereotype.Service;
  5. import org.springframework.web.bind.annotation.*;
  6. import java.util.List;
  7. @Service
  8. // 指定当前Service所绑定的提供者微服务名称
  9. // fallback指定该接口所绑定的服务降级类
  10. @FeignClient(value = "abcmsc-provider-depart")
  11. @RequestMapping("/provider/depart")
  12. public interface DepartService {
  13. @GetMapping("/get/{id}")
  14. Depart getDepartById(@PathVariable("id") int id);
  15. }

(8)启动类

  1. package com.abc.consumer;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.cloud.client.SpringCloudApplication;
  4. import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
  5. import org.springframework.cloud.openfeign.EnableFeignClients;
  6. // 指定Service接口所在的包,开启OpenFeign客户端
  7. @EnableFeignClients(basePackages = "com.abc.consumer.service")
  8. @SpringCloudApplication
  9. @EnableHystrixDashboard // 开启Hystrix仪表盘功能
  10. public class Consumer01Application {
  11. public static void main(String[] args) {
  12. SpringApplication.run(Consumer01Application.class, args);
  13. }
  14. }

五、创建消费者09-consumer-turbine-8081

(1)复制项目09-consumer-turbine-8080

技术图片

(2)修改依赖

技术图片

(3)修改application.yml配置

技术图片

(4)修改09-consumer-turbine-8081.iml

技术图片

六、创建消费者turbine监控

(1)创建项目

创建一个spring boot项目

技术图片

(2)依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.7.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.abc</groupId>
  12. <artifactId>09-consumer-turbine-monitor-9000</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>09-consumer-turbine-monitor-9000</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
  24. </dependency>
  25. <!--hystrix依赖-->
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  29. </dependency>
  30. <!--feign依赖-->
  31. <dependency>
  32. <groupId>org.springframework.cloud</groupId>
  33. <artifactId>spring-cloud-starter-openfeign</artifactId>
  34. </dependency>
  35. <!-- hystrix-dashboard依赖 -->
  36. <dependency>
  37. <groupId>org.springframework.cloud</groupId>
  38. <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
  39. </dependency>
  40. <!--actuator依赖-->
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-starter-actuator</artifactId>
  44. </dependency>
  45. <!--eureka客户端依赖-->
  46. <dependency>
  47. <groupId>org.springframework.cloud</groupId>
  48. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-starter-web</artifactId>
  53. </dependency>
  54. <!-- https://mvnrepository.com/artifact/org.webjars.bower/jquery -->
  55. <dependency>
  56. <groupId>org.webjars.bower</groupId>
  57. <artifactId>jquery</artifactId>
  58. <version>2.1.1</version>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.projectlombok</groupId>
  62. <artifactId>lombok</artifactId>
  63. <optional>true</optional>
  64. </dependency>
  65. <!--热部署依赖-->
  66. <dependency>
  67. <groupId>org.springframework.boot</groupId>
  68. <artifactId>spring-boot-devtools</artifactId>
  69. <optional>true</optional>
  70. </dependency>
  71. </dependencies>
  72. <dependencyManagement>
  73. <dependencies>
  74. <dependency>
  75. <groupId>org.springframework.cloud</groupId>
  76. <artifactId>spring-cloud-dependencies</artifactId>
  77. <version>${spring-cloud.version}</version>
  78. <type>pom</type>
  79. <scope>import</scope>
  80. </dependency>
  81. </dependencies>
  82. </dependencyManagement>
  83. <build>
  84. <plugins>
  85. <plugin>
  86. <groupId>org.springframework.boot</groupId>
  87. <artifactId>spring-boot-maven-plugin</artifactId>
  88. </plugin>
  89. </plugins>
  90. </build>
  91. </project>

(3)application.yml配置

  1. server:
  2. port: 9000
  3. spring:
  4. application: # 指定微服务对外暴露的名称
  5. name: 09-consumer-turbine-monitor-9000
  6. eureka:
  7. client:
  8. service-url: # 指定Eureka服务注册中心
  9. defaultZone: http://localhost:8000/eureka
  10. # 开启Feign对Hystrix的支持
  11. feign:
  12. hystrix:
  13. enabled: true
  14. client:
  15. config:
  16. default:
  17. connectTimeout: 5000 # 指定Feign连接提供者的超时时限
  18. readTimeout: 5000 # 指定Feign从请求到获取提供者响应的超时时限
  19. # 开启actuator的所有web终端
  20. management:
  21. endpoints:
  22. web:
  23. exposure:
  24. include: "*"
  25. # 设置服务熔断时限
  26. hystrix:
  27. command:
  28. default:
  29. execution:
  30. isolation:
  31. thread:
  32. timeoutInMilliseconds: 3000
  33. turbine:
  34. app-config: abcmsc-consumer-depart01,abcmsc-consumer-depart02
  35. cluster-name-expression: new String("default")
  36. combine-host-port: true
  37. instanceUrlSuffix: /actuator/hystrix.stream #turbine默认监控actuator/路径下的端点,修改直接监控hystrix.stream
  38. #cluster-name-expression: metadata[‘cluster‘]
  39. #aggregator:
  40. # cluster-config: ribbon
  41. #instanceUrlSuffix: /hystrix.stream #turbine默认监控actuator/路径下的端点,修改直接监控hystrix.stream

(4)启动类

  1. package com.abc.consumer;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
  6. import org.springframework.cloud.netflix.turbine.EnableTurbine;
  7. @SpringBootApplication
  8. @EnableTurbine
  9. @EnableHystrixDashboard
  10. @EnableEurekaClient
  11. public class MonitorApplication {
  12. public static void main(String[] args) {
  13. SpringApplication.run(MonitorApplication.class, args);
  14. }
  15. /*@Bean
  16. public ServletRegistrationBean getServlet() {
  17. HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
  18. ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
  19. registrationBean.setLoadOnStartup(1);
  20. registrationBean.addUrlMappings("/actuator/hystrix.stream);
  21. registrationBean.setName("HystrixMetricsStreamServlet");
  22. return registrationBean;
  23. }*/
  24. }

七、启动

(1)启动eureka模块

(2)启动两个消费者模块

(3)启动turbine监控模块

八、效果

(1)请求http://localhost:8080/consumer/depart/get/1

技术图片

(1)请求http://localhost:8081/consumer/depart/get/1

技术图片

浏览器访问http://localhost:9000/hystrix

输入http://localhost:9000/turbine.stream

技术图片

 

技术图片

其他说明 

图片说明借鉴  https://www.jianshu.com/p/590bad4c8947

技术图片


以上是关于Turbine使用的主要内容,如果未能解决你的问题,请参考以下文章

使用Turbine对集群进行监控

Turbine聚合监控

hystrix-turbine 监控的使用

Hystrix/Turbine 仪表板上的多个服务?

熔断监控集群(Turbine)

微服务设计指导-使用turbine结合nacos监控多集群hystrix