SpringCloud之Hystrix-Dashboard監控,以及踩的坑...


前言:

最近剛入職,公司使用了SpringCloud,之前有了解過SpringCloud,但是長時間不去搭建不去使用很容易就忘了,因此空閑時間重新復習一下SpringCloud。但是之前開的SpringCloud的版本可能有點低,公司現在用的 " Greenwich.RELEASE "的版本,SpringBoot使用了“ 2.1.x ”的版本,算是比較新了,因此在使用 Hystrix-Dashboard 的時候會有點坑,因此想把踩到的坑記錄下來,讓更多的人避開這個坑,廢話不多說,開始了!

一、創建 Hystrix-Dashboard 監控服務:springcloud-hystrix-dashboard

  1. 工程pom依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gxc.test</groupId>
    <artifactId>springcloud-hystrix-dashboard</artifactId>
    <version>1.0.0</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
  1. yml配置文件
server:
  port: 10000
spring:
  application:
    name: springcloud-hystrix-dashboard
  1. 在啟動類上添加注解 @EnableHystrixDashboard
@EnableHystrixDashboard
@SpringBootApplication
public class HystrixDashboardApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashboardApplication.class, args);
    }
}
  1. 啟動!瀏覽器訪問地址:http://localhost:10000/hystrix ,如下圖:
    image.png

二、創建Eureka注冊中心:springcloud-eureka-server

有讀者可能會問:不是說玩 Hystrix-Dashboard 嗎?為啥還要用到Eureka?
答:請耐心往下看,這也是我為什么題目說的坑...

  1. 工程pom依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gxc.test</groupId>
    <artifactId>springcloud-hystrix-dashboard</artifactId>
    <version>1.0.0</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

  1. yml配置文件
server:
  port: 9000

spring:
  application:
    name: springcloud-eureka-server

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://127.0.0.1:${server.port}/eureka
  1. 啟動類添加注解:@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  1. 啟動!瀏覽器訪問:http://localhost:9000/ ,如下圖:
    image.png

三、創建被監控服務:springcloud-user

  1. 工程pom依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gxc.test</groupId>
    <artifactId>springcloud-user</artifactId>
    <version>1.0.0</version>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <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>
        </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-openfeign</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
  1. yml配置文件
server:
  port: 10001

spring:
  application:
    name: springcloud-user

# 將服務注冊到Eureka注冊中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:9000/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${server.port}

feign:
  hystrix:
    enabled: true
  1. 啟動類添加注解
//@EnableCircuitBreaker
//@EnableEurekaClient
//@EnableFeignClients
//@SpringBootApplication

// 以上四個注解可以用如下兩個注解取代
@EnableFeignClients
@SpringCloudApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}
  1. 創建測試Controller類
@RestController
public class UserController {
    @GetMapping("/user")
    public Object getUser() {
        Map<String, Object> user = Maps.newHashMap();
        user.put("username","GongXincheng");
        user.put("age", 23);
        user.put("birthday", new Date());
        return user;
    }
}
  1. 啟動!瀏覽器訪問:http://localhost:10001/user,如下圖:
    image.png

四、測試 Hystrix-Dashboard 監控 user 服務

  1. 瀏覽器訪問:http://localhost:10001/hystrix.stream ,出現了404錯誤
    說明:第一個坑,在SpringBoot 2.0之前,只要添加了Actuator依賴,不會出現404錯誤的
    image.png
  2. 解決404問題:創建一個配置類,並注冊一個Servlet
@Configuration
public class ServletConfigBean {
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet() {
        ServletRegistrationBean regist = new ServletRegistrationBean();
        regist.setServlet(new HystrixMetricsStreamServlet());
        regist.setName("hystrixMetricsStreamServlet");
        regist.setLoadOnStartup(1);
        regist.addUrlMappings("/hystrix.stream");
        return regist;
    }
}
  1. 瀏覽器訪問:http://localhost:10001/hystrix.stream ,如下圖:
    image.png

  2. 將第一步的鏈接:http://localhost:10001/hystrix.stream ,復制到 Hystrix-Dashboard頁面中
    image.png

  3. Hystrix-Dashboard會一直在 loading... 中,這就是第二個坑...
    image.png

  4. 解決辦法:

1:創建另一個服務(例如:springcloud-order)
2:將新的服務(order)注冊到Eureka
3:在user服務寫一個新的Api接口,通過 Feign 訪問新服務(order)的Api接口
4:注意:經過本人測試通過RestTemplate的方式調用,仍然沒有效果。
5:當通過Feign調用一次新服務(order)后,hystrix.stream 正常,效果如下:

image.png
image.png

  1. Controller層代碼
@RestController
public class UserController {

    private static final String ORDER_SERVER_URL = "http://springcloud-order";

    @Resource private OrderFeign orderFeign;
    @Resource private RestTemplate restTemplate;

    @GetMapping("/user")
    public Object getUser() {
        Map<String, Object> user = Maps.newHashMap();
        user.put("username","GongXincheng");
        user.put("age", 23);
        user.put("birthday", new Date());
        return user;
    }

    @GetMapping("/feign/order")
    public Object feignGetOrder() {
        return orderFeign.getOrder();
    }

    @GetMapping("/rest/order")
    public Object restGetOrder() {
        return restTemplate.getForObject(ORDER_SERVER_URL + "/order", Object.class);
    }
}

8:user服務和oder服務目錄結構 和 相關代碼
image.png

五:代碼鏈接

https://gitee.com/gxc6/gxc-springcloud-study

如果有什么錯誤的地方,歡迎大家幫忙指正!感謝!

我透... 寫完這個已經凌晨3點了... 溜了溜了...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM