一、说明
在微服务架构中为例保证程序的可用性,防止程序出错导致网络阻塞,出现了断路器模型。断路器的状况反应了一个程序的可用性和健壮性,它是一个重要指标。Hystrix Dashboard是作为断路器状态的一个组件,提供了数据监控和友好的图形化界面。
接下来,我们改造一下 client01。
二、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
完整依赖如下
<?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 http://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.0.3.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.dhsg.sc</groupId>
<artifactId>client01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>client01</name>
<description>client01</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<!-- eureka client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- config client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- spring cloud bus -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三、启动类添加注解 @EnableHystrix 和 @EnableHystrixDashboard
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.cloud.openfeign.EnableFeignClients;
/**
* 添加注解 @EnableFeignClients 开启 Feign 功能
* 添加注解 @EnableHystrix 开启 Hystrix 功能
* 添加注解 @EnableHystrixDashboard 开启 HystrixDashboard 功能
*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
@EnableHystrixDashboard
public class Client01Application {
public static void main(String[] args) {
SpringApplication.run(Client01Application.class, args);
}
}
四、写一个接口去访问 client02 的接口,并在接口上面加上注解 @HystrixCommand(fallbackMethod = "hiError")
/**
* 通过 feign 组件,访问 client02 的接口,并且使用了 hystric 断路器
* @return String
*/
@RequestMapping(value = "getclient02namewithhystric",method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "hiError")
public String getClient02NameWithHystric(){
return useOtherApiWithHystricService.getClient02Name();
}
/**
* hystrix 断路器的 fallback 方法
* @return String
*/
public String hiError() {
return "sorry, hystric say error!";
}
具体思路类似我们之前学习使用 feign 那样
五、启动项目
结果
之前我们使用了 feign 的断路器,现在在之前的接口上面添加 hystric 的注解 @HystrixCommand(fallbackMethod = "hiError") ,观察他会使用 hystric 还是 feign 的断路器。
/**
* 该接口是通过 feign 组件,访问 client02 的接口
* 并且服务层的 getClient02Name 添加了 feign 的断路器
* 但是 hystrix 的优先级高于 feign 的,所以这里会使用 hystrix 的断路器
* 注解 @HystrixCommand(fallbackMethod = "hiError") 是使用了 hystric 的断路器
* @return client02 的端口和服务名
*/
@RequestMapping(value = "/getclient02name", method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "hiError")
public String getClient02Name() {
return userOtherApiService.getClient02Name();
}
结果
所以,hystrix 的优先级高于 feign 自带的断路器。
六、访问 http://localhost:8763/hystrix
结果依次输入 http://localhost:8763/actuator/hystrix.stream 、2000 、dhsg(随便起个名字),点击 Monitor Stream
这就是监控界面了,这个时候你再去调用 client01 的接口,这边就会监控到
网友评论