前言

在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会出现因等待出现故障的依赖方响应而形成任务积压,线程资源无法释放,最终导致自身服务的瘫痪,进一步甚至出现故障的蔓延最终导致整个系统的瘫痪。如果这样的架构存在如此严重的隐患,那么相较传统架构就更加的不稳定。为了解决这样的问题,因此产生了断路器等一系列的服务保护机制。

针对上述问题,在Spring Cloud Hystrix中实现了线程隔离、断路器等一系列的服务保护功能。它也是基于Netflix的开源框架 Hystrix实现的,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大功能。

接下来,我们就从一个简单示例开始对Spring Cloud Hystrix的学习与使用。

动手试一试

在开始使用Spring Cloud Hystrix实现断路器之前,我们先拿之前实现的一些内容作为基础,其中包括:

  • eureka-server工程:服务注册中心,端口:1001

  • eureka-client工程:服务提供者,两个实例启动端口分别为2001

下面我们可以复制一下之前实现的一个服务消费者:eureka-consumer-ribbon,命名为eureka-consumer-ribbon-hystrix。下面我们开始对其进行改在:

第一步:pom.xml的dependencies节点中引入spring-cloud-starter-hystrix依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

第二步:在应用主类中使用@EnableCircuitBreaker@EnableHystrix注解开启Hystrix的使用:

@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class Application {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}}

注意:这里我们还可以使用Spring Cloud应用中的@SpringCloudApplication注解来修饰应用主类,该注解的具体定义如下所示。我们可以看到该注解中包含了上我们所引用的三个注解,这也意味着一个Spring Cloud标准应用应包含服务发现以及断路器。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}

第三步:改造服务消费方式,新增ConsumerService类,然后将在Controller中的逻辑迁移过去。最后,在为具体执行逻辑的函数上增加@HystrixCommand注解来指定服务降级方法,比如:

@RestController
public class DcController {@AutowiredConsumerService consumerService;@GetMapping("/consumer")public String dc() {return consumerService.consumer();}class ConsumerService {@AutowiredRestTemplate restTemplate;@HystrixCommand(fallbackMethod = "fallback")public String consumer() {return restTemplate.getForObject("http://eureka-client/dc", String.class);}public String fallback() {return "fallback";}}}

下面我们来验证一下上面Hystrix带来的一些基础功能。我们先把涉及的服务都启动起来,然后访问localhost:2101/consumer,此时可以获取正常的返回,比如:Services: [eureka-consumer-ribbon-hystrix, eureka-client]

为了触发服务降级逻辑,我们可以将服务提供者eureka-client的逻辑加一些延迟,比如:

@GetMapping("/dc")
public String dc() throws InterruptedException {Thread.sleep(5000L);String services = "Services: " + discoveryClient.getServices();System.out.println(services);return services;
}

重启eureka-client之后,再尝试访问localhost:2101/consumer,此时我们将获得的返回结果为:fallback。我们从eureka-client的控制台中,可以看到服务提供方输出了原本要返回的结果,但是由于返回前延迟了5秒,而服务消费方触发了服务请求超时异常,服务消费者就通过HystrixCommand注解中指定的降级逻辑进行执行,因此该请求的结果返回了fallback。这样的机制,对自身服务起到了基础的保护,同时还为异常情况提供了自动的服务降级切换机制。

更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。

代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

  • 码云:点击查看

  • GitHub:点击查看

具体工程说明如下:

  • eureka的服务注册中心:eureka-server

  • eureka的服务提供方:eureka-client

  • eureka的服务消费者:eureka-consumer-ribbon-hystrix

相关阅读

  • Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)

  • Spring Cloud构建微服务架构:服务消费者(基础)

  • Spring Cloud构建微服务架构:服务消费者(Ribbon)

  • Spring Cloud构建微服务架构:服务消费者(Feign)

  • Spring Cloud构建微服务架构:分布式配置中心

  • Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)

  • Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)

  • Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)

  • 更多Spring Cloud内容...

Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】 1相关推荐

  1. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)

    断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...

  2. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】

    前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...

  3. Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】

    前言 在上一篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>中,我们已经体验了如何使用@HystrixCommand来为一个依赖资源定义服务降级逻辑.实 ...

  4. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)【Dalston版】

    前言 在前两篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>和<Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)&g ...

  5. Spring Cloud构建微服务架构:分布式配置中心【Dalston版】

    Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为 ...

  6. Spring Cloud构建微服务架构:Hystrix监控面板【Dalston版】

    在上一篇<服务容错保护(hystrix断路器)>的介绍中,我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的.而这些请求情况的指标信息都是HystrixComm ...

  7. Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】

    上一篇我们介绍了使用Hystrix Dashboard来展示Hystrix用于熔断的各项度量指标.通过Hystrix Dashboard,我们可以方便的查看服务实例的综合情况,比如:服务调用次数.服务 ...

  8. Spring Cloud构建微服务架构-Hystrix断路器

    断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...

  9. Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】

    通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...

最新文章

  1. Gartner评出2017年最值得关注的11个顶级信息安全技术
  2. tensorflow 的输入层和输出层维度注意事项
  3. 51系列中data,idata,xdata,pdata的区别[笔记]
  4. Effective Java之慎用可变参数(四十二)
  5. 夺命雷公狗---ECSHOP---08---商品页的拇改成星星
  6. RunLoop总结:RunLoop的应用场景(四)
  7. Hive建表与数据加载
  8. 欧姆龙NX1P控制器及ST编程
  9. 通过apizza生成python接口测试代码
  10. 【自动驾驶】ROS机器人操作系统总结
  11. Mysql数据库死锁实战-Jmeter连接配置数据库[Mysql]
  12. 如何进行系统分析与设计
  13. 计算机试卷作文总分,教资考试作文总分50分?!如何拿高分,这篇文章你得看。。...
  14. 小红花代表什么_《送你一朵小红花》:细品后才知道,结尾处的平行世界代表着什么...
  15. C# winform 魔兽MH全图制作教程(2):创建项目与关键类
  16. [TODO]高维空间求近似最近邻
  17. Laravel Elasticsearch
  18. 财务自由到底是啥感觉啊...
  19. 练习:随机点名器案例
  20. 微信公众号输入关键字回复WordPress搜索结果

热门文章

  1. log4j配置(转)
  2. WCF 4 高级编程 - 读书笔记
  3. JAVA锁之可重入锁和递归锁及示例代码
  4. mysql error 1790_Mysql 数据恢复报错
  5. python批量执行多个py文件_Python实现批量执行同目录下的py文件方法
  6. 前端请求后端数据的三种方式
  7. 用python实现队列的循环左移和右移的实验原理_python的移位操作实现详解
  8. python字典遍历 没有顺序_Python实现字典的遍历与排序功能示例
  9. python与室内设计_基于树莓派和Python的智能家居系统设计
  10. 一台微型计算机必须具备的设备,计算机应用基础复习题(含答案)1、填空题一台微型计算机必须具备的.doc...