本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识。
Netflix创建了一个名为Hystrix的库,它实现了断路器模式。主要的目的是为了解决服务雪崩效应的一个组件,是保护服务高可用的最后一道防线。
确认了开发环境之后,我们再来添加相关的pom依赖。
<dependencies> <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-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
注:实际上这里是不需要Hystrix依赖的,Fegin已经添加了Hystrix依赖。
由于Hystrix机制是在微服务项目上进行的,并且Fegin中包含了该机制。所以这里我们可以把之前的 springcloud-feign
的项目进行简单的改造就行了。
首先是服务端这块,为了进行区分,创建一个 springcloud-hystrix-eureka
的项目,用于做注册中心。 代码和配置和之前的基本一样。
application.properties
配置信息:
spring.application.name=springcloud-hystrix-eureka-server server.port=8002 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:8002/eureka/
服务端这边只需要在SpringBoot启动类添加 @EnableEurekaServer
注解就可以了,该注解表示此服务是一个服务注册中心服务。
@EnableEurekaServer @SpringBootApplication public class HystrixEurekaApplication { public static void main(String[] args) { SpringApplication.run(HystrixEurekaApplication.class, args); System.out.println("hystrix注册中心服务启动..."); } }
这里我们把之前的 springcloud-fegin-consumer
项目稍微改造下,项目名改为 springcloud-hystrix-consumer
。然后在 application.properties
配置文件新增如下配置, feign.hystrix.enabled
配置表示是否启用熔断机制。
feign.hystrix.enabled=true
增加了配置之后,我们在来把之前的 fegin 进行定义转发服务的 @FeignClient
注解进行添加一个回调方法 fallback
。代码改造后的实现如下:
@FeignClient(name= "springcloud-hystrix-consumer2",fallback = HelloRemoteHystrix.class) public interface HelloRemote { @RequestMapping(value = "/hello") public String hello(@RequestParam(value = "name") String name); }
最后新增一个回调类,用于处理断路的情况。这里我们就简单的处理下,返回错误信息即可!
@Component public class HelloRemoteHystrix implements HelloRemote{ @Override public String hello(@RequestParam(value = "name") String name) { return name+", 请求另一个服务失败!"; } }
其余的代码就不展示了,和之前的 springcloud-fegin-consumer
项目中的一致,详细的可以在这篇博文 SpringCloud学习系列之二 —– 服务消费者(Feign)和负载均衡(Ribbon) 进行查看。
然后在把之前的 springcloud-feign-consumer2
进行简单的改造下,项目名称改为 springcloud-hystrix-consumer2
。然后更改下配置的端口。
完成如上的工程开发之后,我们依次启动服务端和客户端的 springcloud-hystrix-eureka
、 springcloud-hystrix-consumer
和 springcloud-hystrix-consumer2
这三个程序,然后在浏览器界面输入: http://localhost:8002/
,即可查看注册中心的信息。
首先在浏览器输入:
http://localhost:9004/hello/pancm
控制台打印:
接受到请求参数:pancm,进行转发到其他服务
浏览器返回:
pancm,Hello World
然后再输入:
http://localhost:9005/hello?name=pancm
浏览器返回:
pancm,Hello World
说明程序运行正常,fegin的调用也ok。这时我们在进行断路测试。
停止 springcloud-hystrix-consumer2
这个服务,然后在到浏览器输入: http://localhost:9004/hello/pancm
进行查看信息。
控制台打印:
接受到请求参数:pancm,进行转发到其他服务
浏览器返回:
pancm, 请求另一个服务失败!
出现以上结果说明断路器的功能已经实现了。
示例图:
Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。
确认了开发环境之后,我们再来添加相关的pom依赖。
<dependencies> <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-openfeign</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-netflix-hystrix-dashboard</artifactId> </dependency> <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> </dependencies>
注: spring-boot-starter-actuator
这个必须需要要,该jar可以得到SpringBoot项目的各种信息,关于该jar包的使用,可以在 springboot-actuator 这个项目中进行查看。
这里我们把上面的 springcloud-hystrix-consumer
项目进行改造下,项目名称改为 springcloud-hystrix-dashboard-consumer
。然后在到启动类新增如下配置。
完整的启动类配置如下:
@SpringBootApplication @EnableDiscoveryClient @EnableHystrixDashboard @EnableCircuitBreaker @EnableFeignClients public class HystrixDashboardApplication { public static void main(String[] args) { SpringApplication.run(HystrixDashboardApplication.class, args); System.out.println("hystrix dashboard 服务启动..."); } }
然后在到 application.properties
配置文件中新增如下配置:
management.endpoints.web.exposure.include=hystrix.stream management.endpoints.web.base-path=/
该配置的意思是指定hystrixDashboard的访问路径,SpringBoot2.x以上必须指定,不然是无法进行访问的,访问会出现 Unable to connect to Command Metric Stream
错误。
如果不想使用配置的话,也可以使用代码进行实现。
实现的代码如下:
@Component public class HystrixServlet extends Servlet{ @Bean public ServletRegistrationBean getServlet() { HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; } }
完成如上的工程改造之后,我们启动该程序。
然后在浏览器输入:
http://localhost:9010/hystrix
会出现以下的界面:
可以通过该界面监控使用了hystrix dashboard的项目。这里我们依照提示在中间的输入框输入如下的地址:
http://localhost:9010/hystrix.stream
会出现以下的界面:
该界面就是Hystrix Dashboard监控的界面了,通过这个界面我们可以很详细的看到程序的信息。关于这些信息中说明可以用网上找到的一张来加以说明。
注: 如果界面一直提示loading,那么是因为没有进行请求访问,只需在到浏览器上输入: http://localhost:9010/hello/pancm
,然后刷新该界面就可以进行查看了。
springcloud系列博客:
SpringCloud学习系列之一 —– 搭建一个高可用的注册中心(Eureka)
SpringCloud学习系列之二 —– 服务消费者(Feign)和负载均衡(Ribbon)
基于SpringBoot2.x、SpringCloud的Finchley版本 开发的地址 : https://github.com/xuwujing/springcloud-study
基于SpringBoot1.x、SpringCloud 的Dalston版本 开发的地址 : https://github.com/xuwujing/springcloud-study-old
如果感觉项目不错,希望能给个star,谢谢!