Spring Cloud(三):服务容错保护——Spring Cloud Hystrix

  在微服务架构中,通常会出现服务不可用的现象,假设A为服务提供者,B为A服务的调用者,C、D为B服务的调用者,那么当A服务不可用之后,随着时间的推移就会导致B服务不可用,B服务的不可用可能会导致C、D服务的不可用,最终导致整个系统的不可用,为了解决这种级联失败的问题,在分布式架构中出现了断路器等一系列服务保护机制。

  在Spring Cloud中使用Hystrix实现断路器,Spring Cloud Hystrix是基于Netflix的开源框架Hystrix实现的。断路器的开关由关闭到打开的状态是通过当前服务健康状态(服务健康状态=请求失败数/请求总数)和设定阈值(默认10秒内的20次故障)比较决定的。当断路器开关关闭时,请求允许通过断路器,如果当前服务健康状态高于设定的阈值,则开关继续保持关闭;如果当前服务状态低于设置的阈值,则开关切换为打开状态。当断路器开关打开时,请求禁止通过,如果设置了fallback方法,则会进入fallback的流程,当断路器开关处于打开状态时,经过一段时间,断路器会自动进入半开状态并允许一个请求通过,如果该请求调用成功,则断路器会恢复到断开状态,否则继续保持打开状态。

  本节在上一节的项目基础上进行搭建,项目地址:https://github.com/francis785/springclouddemo.git ,要使用Spring Cloud Hystrix,只需要做如下几步即可:

1. 创建 springcloud-demo-user-hystrix 的模块, pom.xml 文件内容如下:

1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>springcloud-demo-parent</artifactId> 7 <groupId>com.fix</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>springcloud-demo-user-hystrix</artifactId> 13 <dependencies> 14 <!--Finchley,Greenwich版本的spring cloud,创建客户端工程的时候需要引入该依赖--> 15 <dependency> 16 <groupId>org.springframework.boot</groupId> 17 <artifactId>spring-boot-starter-web</artifactId> 18 </dependency> 19 <dependency> 20 <groupId>org.springframework.cloud</groupId> 21 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 22 </dependency> 23 <!--hystrix断路器支持--> 24 <dependency> 25 <groupId>org.springframework.cloud</groupId> 26 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> 27 </dependency> 28 <!--hystrixCommandAspect 的初始化依赖于com.google.common.collect.ImmutableMap--> 29 <dependency> 30 <groupId>com.google.guava</groupId> 31 <artifactId>guava</artifactId> 32 <version>28.0-jre</version> 33 </dependency> 34 </dependencies> 35</project>

2. 编写 application.yaml :

1server: 2 port: 8030 3eureka: 4 instance: 5 prefer-ip-address: true #是否显示主机的Ip 6 client: 7 service-url: 8 defaultZone: http://localhost:8761/eureka/ #指定eureka服务端地址 9spring: 10 application: 11 name: springcloud-demo-user-hystrix

3. 编写主类 UserHystrixMain ,并给主类加上 @EnableCircuitBreaker 注解表示开启断路器功能:

1@SpringBootApplication 2@EnableEurekaClient 3@EnableCircuitBreaker 4public class UserHystrixMain { 5 public static void main(String[] args) { 6 SpringApplication.run(UserHystrixMain.class, args); 7 } 8 9 @Bean 10 @LoadBalanced 11 public RestTemplate initRestTemplate() { 12 return new RestTemplate(); 13 } 14}

4. 编写 UserController ,并在 findOrderByUser() 方法上面加上 @HystrixCommand 注解,来指定回调方法:

1@RestController 2public class UserController { 3 @Autowired 4 private RestTemplate restTemplate; 5 6 /** 7 * 按照用户id查询订单信息 8 * @param id 用户id 9 * @return 用户订单信息 10 */ 11 @GetMapping("/findOrderByUser/{id}") 12 @HystrixCommand(fallbackMethod = "fallBackMethod") 13 public String findOrderByUser(@PathVariable String id) { 14 int orderId = 123; 15 return this.restTemplate.getForObject("http://SPRINGCLOUD-DEMO-ORDER/order/" + orderId, String.class); 16 } 17 18 /** 19 * 调用订单查询接口失败后的返回信息 20 * @param id 21 * @return 22 */ 23 public String fallBackMethod(@PathVariable String id){ 24 return "服务不可用,当前查询id="+id; 25 } 26}

5. 功能验证

  依次启动服务注册中心,以及其他模块,此时服务注册中心有如下服务实例:

  在浏览器中访问:http://localhost:8030/findOrderByUser/1 可以正常访问:

  然后关闭 springcloud-demo-order 服务,继续访问http://localhost:8030/findOrderByUser/1链接,就会提示如下信息:

  说明Spring Cloud Hystrix配置生效。

点赞
收藏

评论区

加载中...

相关推荐

springcloud eureka.instance

1.在springcloud中服务的 InstanceID默认值是:${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance\_id:${server.port}},也就是:主机名:应用名:应用端口。如图1

springcloud(四):熔断器Hystrix

熔断器雪崩效应在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B

springcloud使用Hystrix实现微服务的容错处理

使用Hystrix实现微服务的容错处理容错机制如果服务提供者相应非常缓慢,那么消费者对提供者的请求就会被强制等待,知道提供者相应超时。在高负载场景下,如果不作任何处理,此类问题可能会导致服务消费者的资源耗尽甚至整个系统崩溃。雪崩效应微服务架构的应用系统通常包含多个服务层,微服务之间通过网络进行通信,从而支撑起整个应用系统,因此,微服务之间难免

SpringCloud 微服务 (十五) 服务容错 Hystrix

壹工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应有A服务调用B服务,B服务调用C服务,如果B服务调用C服务出了问题,那么B服务会一直重试,等待会将资源耗尽,结果B服务也不可用,导致A服务调用B服务的时候,也出问题,这样的话,ABC服务都

SpringCloud笔记六:Hystrix

\TOC\Hystrix是什么?Hystrix是一个断路器,主要作用是服务熔断。我举个例子,比如我想访问服务A,但是服务A依赖服务B,服务B依赖服务C...这种多个服务之间依赖调用称为扇出(就像一把折扇缓缓打开一样)倘若某个服务反应的时间很长,或者服务不可用了,那么对服务A的调用会占用系统越来越多的资源,直至系统崩

SpringCloud的限流、降级和熔断——Hystrix

!(https://oscimg.oschina.net/oscnet/updb144b1538f24c2488b01c4e66a45d48038.JPEG)一、前言分布式系统环境中,服务间类似依赖非常常见,一个业余调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,