• Hystrix + Hystrix Dashboard搭建(Spring Cloud 2.X)


    本机IP为  192.168.1.102

    一、搭建Hystrix Dashboard

    1.   新建 Maven 项目  hystrix-dashboard

    2. pom.xml

    <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">
    
    
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.java</groupId>
        <artifactId>hystrix-dashboard</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <name>${project.artifactId}</name>
    
        <!-- 配置版本常量 -->
        <properties>
            <jdk.version>1.8</jdk.version>
            <spring.cloud.version>2.0.0.RELEASE</spring.cloud.version>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.5.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
                <version>${spring.cloud.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
                <version>${spring.cloud.version}</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>${jdk.version}</source>
                        <target>${jdk.version}</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
    
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>

     

    3.   application.yml

    server:
      port: 9999

    4.   HystrixDashboardStarter.java

    package com.java.hystrix.dashboard;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
    
    @SpringBootApplication
    @EnableHystrixDashboard
    public class HystrixDashboardStarter extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(HystrixDashboardStarter.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(HystrixDashboardStarter.class);
        }
    }

    5.  运行 HystrixDashboardStarter.java

    浏览器打开URL

    http://192.168.1.102:9999/hystrix/

    http://127.0.0.1:9999/hystrix/

    截图如下:

     Hystrix Dashboard搭建成功!

    二、搭建 Hystrix 

    1.   新建 Maven 项目  hystrix

    2.  pom.xml

    <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">
    
    
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.java</groupId>
        <artifactId>hystrix</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <name>${project.artifactId}</name>
    
        <!-- 配置版本常量 -->
        <properties>
            <jdk.version>1.8</jdk.version>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.5.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                <version>2.0.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
                <version>2.0.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <!-- 热部署 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
                <version>1.2.8.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
    
        </dependencies>
    
        <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>${jdk.version}</source>
                        <target>${jdk.version}</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
    
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <delimiters>
                            <delimit>$</delimit>
                        </delimiters>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

     

    3.   application.yml

    server:
      port: 8888
    
    spring:
      application:
        name: hystrix
    
    eureka:
      client:
        service-url:
          defaultZone: http://192.168.1.102:8080/eureka 
      instance:
        instance-id: hystrix.java.com
        prefer-ip-address: true #访问路径可以显示IP地址    
    
    
    info:
      app.name: hystrix
      app.update: 2018-10-07
      build.groupId: $project.groupId$
      build.artifactId: $project.artifactId$
      build.version: $project.version$

    4.   HostController.java

    package com.java.hystrix.controller;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    
    @RestController
    public class HostController {
    
        @GetMapping("/getHostMessage/{id}")
        @HystrixCommand(fallbackMethod = "getHostMessageFallback")
        public Map<String, Object> getHostMessage(@PathVariable String id) {
    
            if ("error".equals(id)) {
                throw new RuntimeException("测试异常演习!");
            }
    
            Map<String, Object> map = new HashMap<>();
            try {
                InetAddress serverHost = InetAddress.getLocalHost();
                map.put("hostname", serverHost.getHostName());
                map.put("hostAddress", serverHost.getHostAddress());
                map.put("id", id);
    
                return map;
            } catch (UnknownHostException e) {
                e.printStackTrace();
                map.put("msg", e.getMessage());
                throw new RuntimeException(e.getMessage());
            }
    
        }
    
        public Map<String, Object> getHostMessageFallback(@PathVariable String id) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", id);
            map.put("description", "异常演习Fallback!");
            return map;
    
        }
    
    }

    5.   ConfigBean.java

    package com.java.hystrix.config;
    
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
    
    @Configuration
    public class ConfigBean {
    
        @Bean
        public ServletRegistrationBean<HystrixMetricsStreamServlet> getServlet() {
            HystrixMetricsStreamServlet servlet = new HystrixMetricsStreamServlet();
            ServletRegistrationBean<HystrixMetricsStreamServlet> bean = new ServletRegistrationBean<>(servlet);
            bean.addUrlMappings("/hystrix.stream");
            bean.setName("HystrixMetricsStreamServlet");
            return bean;
        }
    
    }

    6.   HystrixStarter.java

    package com.java.hystrix;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @EnableEurekaClient
    @EnableCircuitBreaker
    @EnableDiscoveryClient
    @SpringBootApplication
    public class HystrixStarter extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(HystrixStarter.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(HystrixStarter.class);
        }
    
    }

    7.   运行测试

    启动  Eureka   服务注册中心,参考  https://www.cnblogs.com/jonban/p/eureka.html

    运行 HystrixStarter.java

    浏览器输入URL

    http://192.168.1.102:8888/getHostMessage/hello

    http://127.0.0.1:8888/getHostMessage/hello

    返回数据如下:

    {"hostname":"F6RK2EXYAFARPPS","hostAddress":"192.168.1.102","id":"hello"

    截图如下:

    Hystrix 搭建成功!

    三、使用 Hystrix Dashboard 监控 Hystrix 服务

    在 Hystrix Dashboard 监控页面 (http://127.0.0.1:9999/hystrix/)输入Hystrix 的监控地址

    http://192.168.1.102:8888/hystrix.stream

    截图如下:

    单击【Monitor Stream】按钮,开始监控,截图如下:

    连续多次请求Hystrix 服务的URL

    http://192.168.1.102:8888/getHostMessage/hello

    切换到仪表盘页面观察,监控开始变化。

    监控仪表盘功能正常

    搭建完毕!

    技术要点提炼

    只要在被监控项目上加入相关依赖和配置并开启注解即可

    内容如下:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        <version>2.0.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.0.5.RELEASE</version>
    </dependency>

     

    @EnableCircuitBreaker
    @EnableDiscoveryClient
    package com.java.hystrix.config;
    
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
    
    @Configuration
    public class ConfigBean {
    
        @Bean
        public ServletRegistrationBean<HystrixMetricsStreamServlet> getServlet() {
            HystrixMetricsStreamServlet servlet = new HystrixMetricsStreamServlet();
            ServletRegistrationBean<HystrixMetricsStreamServlet> bean = new ServletRegistrationBean<>(servlet);
            bean.addUrlMappings("/hystrix.stream");
            bean.setName("HystrixMetricsStreamServlet");
            return bean;
        }
    
    }

    .

  • 相关阅读:
    JS笔记009
    JS笔记008
    JS笔记007
    JS笔记006
    JS笔记005
    JS笔记004
    JS笔记003
    JS笔记001
    CSS3笔记012
    expdp SYNONYM of publick and schema owner
  • 原文地址:https://www.cnblogs.com/jonban/p/hystrix-dashboard.html
Copyright © 2020-2023  润新知