(编写不易,转载请注明:http://shihlei.iteye.com/blog/2431224)
一 概述
有段时间没有更新SpringCloud的文章了,目前 SpringBoot 版本 2.0.5.RELEASE,SpringCloud 的版本:Finchley SR1 ,本文继续之前的规划,介绍下 SpringCloud集成 Hystrix 断路器功能。
Hystrix 是 Netflix 实现的断路器模式的框架库,关于 “断路器” 和 “Hystrix” 的背景知识可以阅读之前的文章:
《 SpringCloud(四)番外篇(一):Hystrix 断路器 》
深入可以读一下:
《SpringCloud(四)番外篇(二):Hystrix 1.5.12 源码分析》
文档地址:https://spring.io/guides/gs/circuit-breaker/
二 项目规划
1)核心项目
spring-cloud-webfront:服务调用者,调用“时间”微服务,返回当前时间,集成“断路器”能力;
2)辅助项目
spring-cloud-eureka-server:提供eureka 集群,提供注册中心;
spring-cloud-hystrix-dashboard:提供Hystrix dashborad,查看hystrix matrix信息
spring-cloud-hystrix-turbine:提供hystrix matrix stream 聚合,聚合后通过 Hystrix dashborad 查看 集群的 hystrix matrix信息;
三 SpringCloud Hystrix使用
1)概述
spring-cloud-webfront:底层调用时间微服务 "/time/v1/now"(http://microservice-time:10001"),返回格式化的时间,本文主要集成“断路器”功能,如果服务无法使用,返回当前时间的毫秒数。
注:本文重点演示断路功能,所以时间服务默认不可用状态,不需要实现。
2)使用Demo
(1)新建springboot工程,添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
(2)添加@EnableCircuitBreaker 开启断路器支持:
用于SpringBoot 项目启动时,添加Hystrix支持,会扫描 @HystrixCommand 注解,代理提供熔断能力
package x.demo.springcloud.webfront; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableCircuitBreaker public class SpringCloudWebfrontApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudWebfrontApplication.class, args); } }
(3)实现TimeService 进行微服务调用,通过@HystrixCommand整合断路器能力:
package x.demo.springcloud.webfront.service; public interface TimeService { /** * 获取当前时间 * @return 当前时间,格式:yyyy-MM-dd HH:mm:ss */ String now(); }
package x.demo.springcloud.webfront.service.impl; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class ProtocolResult<T> { //0 成功,非0 失败 private int code; //响应提示信息 private String message; //响应实体 private T body; public ProtocolResult(int code, String message) { this.code = code; this.message = message; } }
Hystrix 使用:
package x.demo.springcloud.webfront.service.impl.hystrix; import javax.annotation.Resource; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import x.demo.springcloud.webfront.service.TimeService; import x.demo.springcloud.webfront.service.impl.ProtocolResult; /** * Hystrix 熔断实现 * */ @Service public class TimeServiceRestClientWithHystrixImpl implements TimeService { @Value("${timeMisroService.v1.uri}") private String timeMicroServiceV1Uri; @Resource private RestTemplate restTemplate; /** * 获取当前时间 * * @return 当前时间,格式:yyyy-MM-dd HH:mm:ss */ @HystrixCommand( groupKey = "microservice-time", commandKey = "microservice-time.now", fallbackMethod = "fallbackNow") @Override public String now() { ProtocolResult<String> result = restTemplate.getForObject(timeMicroServiceV1Uri + "/now", ProtocolResult.class); return result.getBody(); } /** * 断路器打开时的回调方法 * * @return 当前时间:毫秒数 */ public String fallbackNow() { return "fallback:" + String.valueOf(System.currentTimeMillis()); } }
(4)环境配置及 Hystrix 断路器配置:修改application.yml
spring: profiles: Instance1 application: name: webfront server: port: 20001 # 自定义配置 timeMisroService: v1: uri: http://microservice-time/time/v1 # hystrix 配置 hystrix: # Hystrix 命令配置 command: # 命令默认配置 default: execution: isolation: thread: timeoutInMilliseconds: 100 circuitBreaker: requestVolumeThreshold: 1 errorThresholdPercentage: 50 sleepWindowInMilliseconds: 10000 # 指定命令配置,这里使用的是 @HystrixCommand 中的 commandKey = "microservice-time.now"(除非公共,一般不建议在配置文件中统一配置) microservice-time.now: execution: isolation: thread: timeoutInMilliseconds: 100 circuitBreaker: requestVolumeThreshold: 1 errorThresholdPercentage: 50 sleepWindowInMilliseconds: 10000 # Hystrix 线程池配置 threadpool: # 线程池默认配置 default: coreSize: 1 maxQueueSize: 1 metrics: rollingStats: timeInMilliseconds: 10000 numBuckets: 1 # 指定命令线程池配置,这里使用的是 @HystrixCommand 中的 groupKey = "microservice-time", microservice-time: coreSize: 5 maxQueueSize: 5 metrics: rollingStats: timeInMilliseconds: 10000 numBuckets: 1
注:可以在@HystrixCommand 通过属性,commandProperties,threadPoolProperties 直接指定,但是不利于共享和修改,建议在yml中配置,规则如下:
[1] 配置Hystrix 命令
hystrix.command.default.* :Hystrix Command 默认配置,共享
hystrix.command.[commandKey].* :Hystrix 指定Command 配置,@HystrixCommand 使用该命令配置需要 属性 commandKey 值 需要和 [commandKey] 一致
[2] 配置Hystrix 线程池
hystrix.threadpool.default.* : Hystrix 线程池默认配置,共享
hystrix.threadpool.[groupKey].*:Hystrix 指定group 的线程池配置,@HystrixCommand 使用该线程池配置需要 属性 groupKey 值 需要和 [groupKey] 一致
关于 Hystrix 的配置具体意义 参见 《SpringCloud(四)番外篇(一):Hystrix 断路器》 》三 Hystrix 》 5)核心配置说明(如demo);不在赘述;
(5)开放Controller用于测试:
package x.demo.springcloud.webfront.web; import javax.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import x.demo.springcloud.webfront.service.TimeService; @RestController @RequestMapping("/time") public class TimeController { @Resource(name = "timeServiceRestClientWithHystrixImpl") private TimeService timeService; @GetMapping("/now") public String now() { return timeService.now(); } }
(6)启动验证:
四 FeignClient 集成Hystrix
1) 概述
FeignClient 默认集成了Hystrix,启动方法 @FeignClient 设置 “fallback” 属性为 “实现回退的类名”,并将回退类注册到 Spring 容器。
注:feign使用Hystrix回退能力,需要保证配置 feign.hystrix.enabled:true (false可以全局禁用Hystrix,即使指定fallback )
2)使用demo
package x.demo.springcloud.webfront.service.impl.feign.client; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import x.demo.springcloud.webfront.service.impl.ProtocolResult; /** * 实现 Circuit Breaker 的 FeignClient * <p> * 特别注意 feign 添加hystrix支持是,会有多个接口实现,spring context 不知道使用哪个进行注入,可以加入 primary = false 在指定 */ @FeignClient(name = "microservice-time", fallback = TimeV1MicroServiceWithHystrixClient.TimeV1MirocServiceFallback.class) public interface TimeV1MicroServiceWithHystrixClient { @RequestMapping(method = RequestMethod.GET, value = "/time/v1/now", consumes = MediaType.APPLICATION_JSON_VALUE) ProtocolResult<String> now(@RequestParam(name = "format", required = false) String format); /** * fallback方法,必须实现 @FeignClient 注释的接口 * <p> * 特别注意:必须加@Component等注解,仍容器能找到并初始化bean */ @Component class TimeV1MirocServiceFallback implements TimeV1MicroServiceWithHystrixClient { @Override public ProtocolResult<String> now(String format) { ProtocolResult<String> fallbackResult = new ProtocolResult<>(); fallbackResult.setCode(-1); fallbackResult.setMessage("fallback"); fallbackResult.setBody("fallback : " + String.valueOf(System.currentTimeMillis())); return fallbackResult; } } }
注:关于Feign的使用参见:《SpringCloud(二):声明式RestClient—Feign》
五 Hystrix 监控
1) 健康指标
(1)概述
Hystrix 断路器状态(打开,半开,关闭),要查看“断路器”的健康指标,可以通过 SpringBoot actuator 的 health EndPoint获得;
(2)开启 actuator 监控信息服务
(a)添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
(b)配置management
修改application.yml(这里为了演示,暂不涉及actuator 的安全及详细配置,暂时全部开启)
management: endpoints: web: exposure: include: ["*"] endpoint: health: show-details: always
(3)查看: 访问当前应用的 “/actuator/health”
2)DashBoard
(1)概述
Hystrix 通过订阅 HystrixEventStream 统计 “滑动窗口内 ‘成功’、‘失败’ 的次数”,更新“断路器”状态。
Hystrix dashboard 可以通过调用 应用 开放 的 hystrix.stream , 获取实时信息并汇总,展示给我们。
注:hystrix.stream 是单“应用”内的,只能查看当前应用的统计信息。
git:https://github.com/Netflix-Skunkworks/hystrix-dashboard
(2)使用
[1] 创建新的SpringBoot工程:spring-cloud-hystrix-dashboard 并添加依赖
<!-- dashboard --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
[2] 添加注解 @EnableHystrixDashboard
package x.demo.springcloud.springcloud.hystrix.dashboard; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; /** * Hystrix:dashboard */ @EnableHystrixDashboard @SpringBootApplication public class SpringCloudHystrixDashboardApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudHystrixDashboardApplication.class, args); } }
[3] 修改application.yml 指定端口
server: port: 60001
(3) 启动使用
[1]欢迎界面
[2] 指定 webfront 的 /actuator/hystrix.stream
3)Turbine
(1)概述
上部分介绍,Hystrix Dashboard 可以用于监控 Hystrix 单 server 情况,分布式环境,监控某一节点,没有多大意义。
Turbine 可以将多台 server 的 /hystrix.stream 聚合成 /turbine.stream 供 dashboard 展示使用,这样就可以通过 Dashboard 监控某一集群的“断路器”信息。
github:https://github.com/Netflix/Turbine
Turbine完成聚合,需要绑定待聚合实例的hystrix.stream 信息;
SpringCloud 整合的Turbine ,简化的配置过程;通过EurekaServer在中间协调获取要监控的实例信息,以便获取 hystrix.stream。
所以逻辑架构如下:
(2)环境搭建
[1] 启动EurekaServer:
Eureka配置可以参见:《SpringCloud(三): 服务注册与发现,服务注册中心—Eureka 》
[2] 改造 webfront 增加上报
(a)添加注解,注册Eureka:
package x.demo.springcloud.webfront; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker public class SpringCloudWebfrontApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudWebfrontApplication.class, args); } }
(b)修改application.yml: 添加eureka 信息用于注册,同时通过eureka.instance.metadata-map.cluster: webfront-cluster 提供该服务绑定的集群信息
WebFront Instance1,WebFront Instance2:
spring: profiles: Instance1 application: name: webfront server: port: 20001 # 自定义配置 timeMisroService: server: http://localhost:10001 v1: uri: http://microservice-time/time/v1 eureka: client: service-url: defaultZone: http://localhost:50001/eureka/,http://localhost:50002/eureka/,http://localhost:50003/eureka/ instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} prefer-ip-address: true # 所属集群,提交使用 metadata-map: cluster: webfront-cluster # Hystrix stream management: endpoints: web: exposure: include: ["*"] endpoint: health: show-details: always hystrix: # Hystrix 命令配置 command: # 命令默认配置 default: execution: isolation: thread: timeoutInMilliseconds: 100 circuitBreaker: requestVolumeThreshold: 1 errorThresholdPercentage: 50 sleepWindowInMilliseconds: 10000 # 指定命令配置,这里使用的是 @HystrixCommand 中的 commandKey = "microservice-time.now"(除非公共,一般不建议在配置文件中统一配置) microservice-time.now: execution: isolation: thread: timeoutInMilliseconds: 100 circuitBreaker: requestVolumeThreshold: 1 errorThresholdPercentage: 50 sleepWindowInMilliseconds: 10000 # Hystrix 线程池配置 threadpool: # 线程池默认配置 default: coreSize: 1 maxQueueSize: 1 metrics: rollingStats: timeInMilliseconds: 10000 numBuckets: 1 # 指定命令线程池配置,这里使用的是 @HystrixCommand 中的 groupKey = "microservice-time", microservice-time: coreSize: 5 maxQueueSize: 5 metrics: rollingStats: timeInMilliseconds: 10000 numBuckets: 1 --- spring: profiles: Instance2 application: name: webfront server: port: 20002 # 自定义配置 timeMisroService: server: http://localhost:10001 v1: uri: http://microservice-time/time/v1 eureka: client: service-url: defaultZone: http://localhost:50001/eureka/,http://localhost:50002/eureka/,http://localhost:50003/eureka/ instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} prefer-ip-address: true metadata-map: cluster: webfront-cluster # 启动 feign hystrix 支持 feign: hystrix: enabled: false # Hystrix stream management: endpoints: web: exposure: include: ["*"] endpoint: health: show-details: always
(c)启动应用
[2] 创建Turbine 服务器:spring-cloud-hystrix-turbine
(a)添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- turbine --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-turbine</artifactId> </dependency>
(b)添加注解
package x.demo.springcloud.springcloud.hystrix.turbine; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.turbine.EnableTurbine; @EnableTurbine @SpringBootApplication public class SpringCloudHystrixTurbineApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudHystrixTurbineApplication.class, args); } }
(c)添加配置:修改application.yml
spring: application: name: turbine-server-standalone # Eureka 集成方式 turbine: # appConfig 值为Eureka ServiceId 列表,用于 turbine找到 instance appConfig: webfront clusterNameExpression: metadata['cluster'] # 集群参数,指定要监控的集群 aggregator: clusterConfig: ["webfront-cluster"] # 依赖 Eureka 进行配置 eureka: client: service-url: defaultZone: http://localhost:50001/eureka/,http://localhost:50002/eureka/,http://localhost:50003/eureka/ instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}} prefer-ip-address: true
注:
核心一:
turbine.cluster-name-expression: 指定要监控的集群信息,可以填写 metadata['cluster'],意味着从EurekaServer 拉取 turbine.aggregator.clusterConfig 指定的集群列表。
turbine.aggregator.clusterConfig: 提供想要监控的集群名称,多个可以以“,”分割;这个信息是Hystrix应用通过EurekaClient注册到Eureka上的,需要同Hystrix应用(webfront项目)配置一致。
如上webfront 配置 eureka.instance.metadata-map.cluster: webfront-cluster ,这里填写:webfront-cluster
turbine.app-config:指定监控集群需要收集服务id列表(Eureka上的serviceId);
核心二:
Eureka 配置,会从Eureka 拉取 监控实例列表,机/hystrix.stream 的访问地址
Eureka配置可以参见:《SpringCloud(三): 服务注册与发现,服务注册中心—Eureka 》
(d)启动
2018-09-23 16:01:50.515 INFO 2048 --- [ Timer-0] c.n.t.monitor.instance.InstanceMonitor : Url for host: http://x.x.x.x:20001/actuator/hystrix.stream webfront-cluster 。。。。。。 2018-09-23 16:01:50.518 INFO 2048 --- [ Timer-0] c.n.t.monitor.instance.InstanceMonitor : Url for host: http:/x.x.x.x:20002/actuator/hystrix.stream webfront-cluster
从启动日志中可以看到,从Eureka拉取到 webfront-cluster 集群的两个聚合地址:http://x.x.x.x:20001/actuator/hystrix.stream,http://x.x.x.x:20002/actuator/hystrix.stream(x.x.x.x 是隐藏了我的本机ip地址)
[3] 查看效果
(a)集群:http://localhost:60011/clusters
(b)聚合stram:http://localhost:60011/turbine.stream?cluster=webfront-cluster
[4] 查看聚合后dashboard:
打开dashboard:http://localhost:60001/hystrix
输入:http://localhost:60011/turbine.stream?cluster=webfront-cluster
相关推荐
本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识,需要的朋友可以参考下
在分布式系统中,Spring Cloud Hystrix 是一个关键的组件,它作为一个断路器来防止服务雪崩。断路器模式是微服务架构中的一个重要概念,用于提高系统的容错性和稳定性。下面我们将深入探讨 Spring Cloud Hystrix 的...
本篇文章将聚焦于Spring Cloud中的断路器组件——Hystrix,它是Netflix开源的一款用于实现容错管理的工具。 断路器模式是一种设计模式,旨在防止应用程序因依赖故障而崩溃。在微服务架构中,服务之间通常通过网络...
Spring Cloud Netfix Hystrix断路器例子工程。使用Spring Cloud Netflix Hystrix以及Spring RestTemplate或Spring Cloud Netflix Feign实现断路器模式。
在 Spring Cloud 中,有两种方式使用 Hystrix: 1. **直接使用 Hystrix**:通过 HystrixCommand 或 HystrixObservableCommand 封装服务调用逻辑,然后配置断路器规则。 2. **通过 FeignClient**:Feign 是一个声明...
第四课: 断路器(Hystrix) 第五课: 路由网关(zuul) 第六课: 分布式配置中心(Spring Cloud Config) 第七课: 高可用的分布式配置中心(Spring Cloud Config) 第八课: 消息总线(Spring Cloud Bus) 第九课: 服务...
总之,Spring Cloud Hystrix通过断路器、线程隔离和服务降级等机制,有效地提高了微服务架构的健壮性和容错能力。开发者可以通过注解和配置轻松地在服务中集成这些功能,提升系统的整体稳定性。
Spring Cloud 是一个基于Spring Boot实现的云应用开发工具集,为开发人员提供了一套快速构建分布式系统中一些常见模式的工具,包括服务发现、配置管理、消息总线、负载均衡、断路器、网关等。它所依赖的基础是Spring...
4. **Hystrix**:Hystrix是Spring Cloud中的断路器组件,用于处理服务间的延迟和故障,防止服务雪崩。当服务调用失败或者响应时间过长时,Hystrix会打开断路器,避免后续的请求继续尝试调用失败的服务,从而保护整个...
在Spring Cloud生态系统中,Hystrix是一个至关重要的组件,它主要负责实现服务容错和断路器模式,以增强系统的稳定性和健壮性。本文将深入探讨如何在Spring Cloud项目中集成并使用Hystrix,以及如何将其与Feign...
Hystrix 是一个由 Netflix 开源的断路器组件,用于防止级联故障和避免服务雪崩。Hystrix 可以检测到服务调用中的故障,并在故障发生时断开服务调用链,避免级联故障的发生。 Spring Cloud Gateway 中可以使用 ...
本资源涵盖了Spring Cloud的基本概念、核心组件如Eureka、Zuul、Hystrix、Config,以及服务发现、客户端负载均衡、断路器模式、配置管理、API网关、分布式追踪等关键技术点。此外,还扩展到了消息队列(MQ)的集成、...
Spring Cloud Hystrix 是一个基于 Netflix Hystrix 实现的服务降级、断路器和熔断器框架,它被广泛应用于分布式系统中的容错管理,以提高系统的稳定性和可用性。在微服务架构中,服务间通信是常见的操作,而Spring ...
现在,我们来看如何在 Spring Cloud 应用中集成和配置 Hystrix: 1. **依赖添加**:在 Maven 或 Gradle 的构建文件中添加 Spring Cloud Netflix Hystrix 的依赖。 2. **服务接口封装**:通过 `@HystrixCommand` ...
4. Hystrix:断路器,防止服务雪崩,确保系统的稳定性和容错性。 5. Config:配置中心,提供集中式、动态的配置管理。 6. Spring Cloud Bus:事件、消息总线,用于在微服务间传播状态变化。 7. Spring Cloud Gateway...
三、Spring Cloud Hystrix:断路器 Hystrix是防止服务雪崩的重要组件,它通过引入断路器模式,监控服务的调用情况,当服务出现故障或响应超时时,断路器会打开,后续请求不再转发到故障服务,而是直接返回预设的 ...
* Spring Cloud Hystrix:断路器 * Spring Cloud Config:分布式统一配置管理 Spring Cloud 和 SpringBoot 的关系 * SpringBoot 专注于快速方便的开发单个微服务 * Spring Cloud 是关注全局的微服务协调整理治理...
Hystrix是Netflix开源的一款强大的断路器库,它适用于Java环境,并且广泛应用于Spring Cloud框架中。本教程将深入探讨如何使用Hystrix在微服务中实现断路器功能。 首先,让我们理解断路器的工作原理。断路器在正常...
Spring Cloud Hystrix 是一款强大的断路器框架,旨在防止微服务架构中的服务雪崩效应。服务雪崩是指在一个复杂的分布式系统中,由于某个服务的故障导致连锁反应,导致整个系统的稳定性受损。为了应对这种情况,...
Spring Cloud是一系列框架的有序集合,利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等。Spring Cloud的设计目标...