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

Spring Cloud——断路器监控Hystrix Dashboard&Turbine

2017-04-15 19:05 996 查看
前文谈论过,服务客户端的负载均衡中,为了保证高可用的特性,我们使用了断路器Hystrix。

回顾一下,Hystrix做了什么事情呢?

在标注了HystrixCommand注解的方法中,如果该方法执行的过程中抛出了异常,并且该异常不在ignoreExceptions中,那么就会执行fallback方法。

在执行方法的过程中,Hystrix还会采集每一个HystrixCommand的信息指标,把每一个断路器的信息指标显示的Hystrix仪表盘上。这个仪表盘就是Hystrix Dashboard。

那么我们怎么使用呢?

首先需要打开Eureka Server注册中心。我的注册中心的地址是localhost:1111

然后我们新建一个项目。

在pom中增加以下依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>


然后在application配置文件中增加以下配置:

spring.application.name=node1
server.port=3334
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
在主函数中增加@EnableDiscoveryClient @EnableHystrix @EnableHystrixDashboard三个注解。

这样,配置就基本完成了。

接下来是编写业务服务。

@RestController
public class ConsumerController {

@Autowired
private ComputeService1 computeService;

@RequestMapping(value = "/add", method = RequestMethod.GET)
public String add() {
computeService.addService3();
return computeService.addService4();
}
}


@Service
public class ComputeService1 {

@Autowired
RestTemplate restTemplate;

@HystrixCommand(fallbackMethod = "addServiceFallback")
public String addService3() {
int randomInt= (int)(Math.random() * 10);
if(randomInt<8){  //模拟调用失败情况
throw new RuntimeException("call dependency service fail.");
}else{
return "number:"+randomInt;
}
}

@HystrixCommand(fallbackMethod = "addServiceFallback")
public String addService4() {
int randomInt= (int)(Math.random() * 10);
if(randomInt<6){  //模拟调用失败情况
throw new RuntimeException("call dependency service fail.");
}else{
return "number:"+randomInt;
}
}

public String addServiceFallback() {
return "error";
}
}


随便写个业务服务就好了,不过需要使用HystrixCommand去注解服务,并且在其中某个地方会抛出异常就可以了。

运行我们的程序。
程序运行成功之后,访问localhost:3334/hystrix。这里端口改成自己程序的端口即可。

不出意外的话就会看到这个页面了。



在中间的输入框中填入http://localhost:3334/hystrix.stream。然后点击monitor stream按钮。

就查看到了仪表盘,不过这个时候是没东西的,一直是LOAD。我们需要先访问一次localhost:3334/add,也就是我们的业务服务。然后就会连接上了。会看到这个界面:



在这里我们可以直观的看到各Hystrix Command的请求响应时间, 请求成功率等数据。可以就可以知道这个服务对应的状态和性能了。

不过这样显然是不够的,因为这样我们只能看到单个应用的服务信息。比如说,下单功能,可能需要调用几十个微服务,我们希望看到的是这个功能对应的这些微服务的性能,而不是一个微服务一个微服务的去查看。所以我们需要一个工具能让我们汇总系统内多个服务的数据并显示到Hystrix Dashboard上,使用Turbine可以做到这一点。

怎么使用turbine呢?

首先创建一个新的项目。

加入以下依赖:

<!-- eureka依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- hystrix依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<!-- turnbine依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
这里spring boot的parent使用1.3.x的版本可能会好点,反正我1.5.x的版本是跑不动的。。。

在application配置文件中增加以下配置:

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

turbine.appConfig=node1,node2
turbine.aggregator.clusterConfig=MAIN
turbine.clusterNameExpression=metadata['cluster']


turbine.appConfig配置是一个eureka服务ID列表,turbine将使用这个配置查询实例,这里配置了两个,一个是node1一个node2。

turbine.aggregator.clusterConfig配置集群的名字,也就是cluster。在Hystrix Dashboard中,使用http://turbine-hostname:port/turbine.stream?cluster=[clusterName]来查看这个集群对应的服务的HystrixCommand信息。这里我们创建名为MAIN的集群。

turbine.clusterNameExpression这个的意思大概是2个服务node1,node2从元数据映射,他们两个有一个或者两个会在MAIN集群中。当然,我们这里是两个都是。

最后在Main主程序中增加@EnableTurbine @EnableHystrixDashboard @EnableEurekaClient就完成了。

整个流程顺序

1.启动Eureka Server服务注册中心。

2.启动两个包含了HystrixCommand的服务客户端,这两个服务客户端的eureka.instance.hostname需要不同,我这里使用peer1和peer2,并且在etc/hosts中增加对应的映射,对应127.0.0.1.这个应该是它的BUG,如果他们两个的hostname相同的话,在Dashboard中会认为是同一个应用程序,即使他们的应用程序名称不同。最后需要在application配置文件中增加集群的映射:eureka.instance.metadata-map.cluster=MAIN

对应的application配置文件分别如下:

spring.application.name=node1
server.port=3334
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

eureka.instance.metadata-map.cluster=MAIN
eureka.instance.hostname=peer1
spring.application.name=node2
server.port=3333
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

eureka.instance.metadata-map.cluster=MAIN
eureka.instance.hostname=peer2


3.最后启动turbine。

都启动之后打开服务注册中心,可一看到,都注册在上面了。



访问localhost:4444/hystrix.也就是turbine对应的hystrix。可以看到熟悉的界面。



在中间输入想看的集群的服务信息,这里是MAIN。

分别访问两个业务服务,就可以在dashboard中看到他们的HystrixCommand信息了。



在这里,circuit标签下面,addService1等等都是断路器信息,如果启动了断路器,就是Open状态,可以看到addService3就是Open状态,其他都是Closed状态。而且图中可以看到错误率,addServer3是100%,等等。

Thread Pools标签是线程池的信息。更具体的信息,大家可以参考github:DashBoard

官网对应解释:



 通过Hystrix Dashboard和Turbine, 我们能够很方便地监控每个Hystrix Command的运行情况, 在出现问题的时候能够及时定位到问题所在的服务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息