• 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

  • 相关阅读:
    419. Battleships in a Board
    150. Evaluate Reverse Polish Notation
    153. Find Minimum in Rotated Sorted Array
    319. Bulb Switcher
    223. Rectangle Area
    iOS 常用到的宏#define
    VRAR 使用 SceneKit
    VR、AR、MR定义区别
    Swift 开源项目练习应用
    Swift3.0 UITextField
  • 原文地址:https://www.cnblogs.com/edda/p/13261853.html
Copyright © 2020-2023  润新知