您的位置:首页 > 编程语言 > Java开发

SpringCloud之断路器监控(Hystrix Dashboard) |第六章 -yellowcong

2018-03-16 17:27 1081 查看
在微服务中,必须保证高可用性,防止程序出错导致网络阻塞,出现了断路器模型。断路器的状况反应了一个程序的可用性和健壮性,它是一个重要指标。Hystrix Dashboard是作为断路器状态的一个组件,提供了数据监控和友好的图形化界面。(ps:短路监控一般是搭建在Feign或ribbon上)。搭建一个断路监控的步骤:1、配置pom.xml文件,添加依赖;2、配置application.yml;3、配置启动器,添加注解
@EnableHystrix
@EnableHystrixDashboard
;4、启动eureka服务,然后再启动短路 监控系统。

代码地址

https://gitee.com/yellowcong/springcloud/tree/master/chapter6


目录结构



架构

我这个架构,直接监控ribbon里面的访问情况。

节点服务项目名
yellowcong.com:8761eureka注册服务eureka-server
yellowcong.com:8762提供服务与断路监控eureka-hystrix-dashboard

断路器监控搭建(Hystrix Dashboard)

搭建一个断路监控的步骤:1、配置pom.xml文件,添加依赖;2、配置application.yml;3、配置启动器,添加注解
@EnableHystrix
@EnableHystrixDashboard
;4、启动eureka服务,然后再启动短路 监控系统。

1、配置pom.xml

由于
spring-cloud-starter-eureka-server
的依赖包中,存在
servlet-api
,导致tomcat服务器启动失败,我们需要将这个
servlet-api
依赖包去除掉,这样服务器,才可以正常启动

<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- 添加断路器的监控系统 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>


下面是完整的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>yellowcong.com</groupId>
<artifactId>cas-client-springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>cas-client-springboot</name>
<url>http://maven.apache.org</url>

<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

<!-- 引用父类依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>

<!--eureka server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$--> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加断路器的监控系统 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$--> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$--> </dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

</dependencies>
<build>
<plugins>
<!-- 添加spring的插件, 就可以直接通过 mvn spring-boot:run 运行了 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>


2、配置application.yml

这个里面配置了注册中心,本服务的端口,以服务的名称。

#配置eureka 的注册中心
eureka:
client:
serviceUrl:
defaultZone: http://yellowcong.com:8761/eureka/ 
# 注册服务的端口
server:
port: 8762

#配置当前服务的名称
spring:
application:
name: service-hystrix-dashboard


3、配置启动器

添加注解
@EnableHystrix
@EnableHystrixDashboard
,来启用 短路和短路监控器,直接在主函数中,就添加了一个短路监控,通过注解
@HystrixCommand(fallbackMethod = "error")
,来表示如果出现熔断操作,执行error方法。

package com.yellowcong.main;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

/**
* @author yellowcong
*/
@SpringBootApplication
// @EnableEurekaClient 表示这个是一个client
@EnableEurekaClient
// @RestController 相当于配置了 当于@ResponseBody + @Controller合在一起的作用。
// 这样就不能返回视图解析了
@RestController
//开启断路器
@EnableHystrix
@EnableHystrixDashboard
public class ConfigMain {

public static void main(String[] args) {
SpringApplication.run(ConfigMain.class, args);
}

//注入配置文件(application.yml)的值
@Value("${server.port}")
String port;

/**
* 创建日期:2018年3月16日<br/>
* 创建用户:yellowcong<br/>
* 功能描述:一个简单的springmvc 的请求
* @param name 用户传递进来的参数
* @return
*/
@HystrixCommand(fallbackMethod = "error")
@RequestMapping(value="/hi/{name}",method=RequestMethod.GET)
public String home(@PathVariable String name) {
return "hi " + name + ",i am (eureka client1) from port:" + port;
}

public String error(String name ){
return name+" has  error 404";
}
}


4、启动服务测试

我们可以直接访问:http://yellowcong.com:8762/hystrix.stream 来查看那这个返回的数据信息。

下载下来后,是下面这种格式的数据,这种数据格式比较的多,而且我们基本上也分析不出啥



解决的方法是,访问http://yellowcong.com:8762/hystrix,输入要分析的路径,设定延时和名称(这 两个都可以不写)



测试点击分析后,一顿刷新 ,可以看到实时的分析结果,访问的次数逐渐上涨。



访问效果



下面是管网的图例说明,



常见问题

1、Unable to connect to Command Metric Stream.



导致这个问题,是由于刚刚我设定的时候,数据 源设定的错误

http://http://yellowcong.com:8762/hystrix.stream

2、Unable to start embedded Tomcat

出现了不能启动tomcat的错误,这个错误的原因,多半是由于maven的依赖出了问题。

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137) ~[spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) ~[spring-context-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.10.RELEASE.jar:1.5.10.RELEASE]
at com.yellowcong.ConfigMain.main(ConfigMain.java:17) [classes/:na]


后来排查发现,是由于
spring-cloud-starter-eureka-server
中的servlet-api 包捣鬼,我们把他排除掉,不到入,即可解决问题了。

<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: