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

前言:

最近刚入职,公司使用了SpringCloud,之前有了解过SpringCloud,但是长时间不去搭建不去使用很容易就忘了,因此空闲时间重新复习一下。但是之前开的SpringCloud的版本可能有点低,公司现在用的 " Greenwich.RELEASE "的版本,SpringBoot使用了“ 2.1.x ”的版本,算是比较新了,因此在使用 Hystrix-Dashboard 的时候会有点坑,因此想把踩到的坑记录下来,让更多的人避开这个坑,废话不多说,开始了!

一、创建 Hystrix-Dashboard 监控服务:springcloud-hystrix-dashboard

  1. 工程pom依赖


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.7.RELEASE
         
    
    com.gxc.test
    springcloud-hystrix-dashboard
    1.0.0

    
        1.8
    

    
        
            org.springframework.cloud
            spring-cloud-starter-netflix-hystrix-dashboard
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Greenwich.RELEASE
                pom
                import
            
        
    

  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依赖


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.7.RELEASE
         
    
    com.gxc.test
    springcloud-hystrix-dashboard
    1.0.0

    
        1.8
    

    
       
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Greenwich.RELEASE
                pom
                import
            
        
    


  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依赖


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.7.RELEASE
         
    
    com.gxc.test
    springcloud-user
    1.0.0
    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-hystrix
        
        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Greenwich.RELEASE
                pom
                import
            
        
    

  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 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

=============== 2019-09-06 补充 ===============

经过后期测试,当引入 Actuator stater pom 依赖后,在application.yml添加配置:

management:
  endpoints:
    web:
      exposure:
        include: "*"

重启项目访问地址:http://127.0.0.1:10001/actuator/hystrix.stream
因为可以完成监控数据的输出,如果加了此配置项,就无须再配置 HystrixMetricsStreamServlet
  1. 将第一步的链接:http://localhost:10001/hystrix.stream ,复制到 Hystrix-Dashboard页面中

    image.png

  2. Hystrix-Dashboard会一直在 loading... 中,这就是第二个坑...

    image.png

  3. 解决办法:

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 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

================================================

补充:

经过后来的测试,发现可以不用Feign调用,只要调用被监控的工程带有服务熔断注解@HystrixCommand 的接口,也可以(hystrix.stream 不会只出现ping),如图:

image.png

如果有什么错误的地方,欢迎大家帮忙指正!感谢!

我透... 写完这个已经凌晨3点了... 溜了溜了...

你可能感兴趣的:(SpringCloud之Hystrix-Dashboard监控,以及踩的坑...)