当前位置: 代码迷 >> 综合 >> spring cloud-hystrix
  详细解决方案

spring cloud-hystrix

热度:88   发布时间:2023-12-13 16:11:31.0

我们的家庭电路系统少不了保险丝。当电路发生故障或异常时,伴随着电流不断升高,并且升高的电流有可能损坏电路中的某些重要器件或贵重器件,也有可能烧毁电路甚至造成火灾。
若电路中正确地安置了保险丝,那么保险丝就会在电流异常升高到一定的高度和热度的时候,自身熔断切断电流,从而起到保护电路安全运行的作用。
本文我们讲解的spring cloud-hystrix组件,作用和保险丝差不多,官方解释:hystrix通过服务隔离、熔断(也可以称为断路)、降级等手段控制依赖服务的延迟与失败。
通过上述讲解我们可以得知,hystrix可以在依赖服务延迟或失败时,提供服务保护机制。下面我们通过java code讲解hystrix是如何做到的。
我们首先启动eureka服务,然后启动microservice-provider-user服务提供者实例,接着再启动microservice-consumer-movie服务消费者调用microservice-provider-user服务提供者服务。
如果microservice-provider-user服务提供者服务是正常的,调用microservice-consumer-movie服务消费者会正常返回数据。如果服务提供者服务出现故障了呢,尤其是在业务逻辑比较复杂的情况,A调用B,B调用C,C调用D。如果D出现故障,那A、B、C岂不是都不能正常运行了。
为了在我们的项目中加上hystrix组件,我们需要做以下配置:
1.在pom添加hystrix的依赖:

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

2.在微服务main方法的class加上@EnableCircuitBreaker注解:

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class ConsumerMovieRibbonApplication {
    @Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerMovieRibbonApplication.class, args);}
}

3.在Controller调用方法的method加上@HystrixCommand注解,声明依赖服务调用延迟或失败时调用的方法:

@RestController
public class MovieController {
    @Autowiredprivate RestTemplate restTemplate;@GetMapping("/movie/{id}")@HystrixCommand(fallbackMethod = "findByIdFailback")public User findById(@PathVariable Long id) {// http://localhost:7900/simple/// VIP virtual IP// HAProxy Heartbeatreturn this.restTemplate.getForObject("http://microservice-provider-user/simple/" + id, User.class);}public User findByIdFailback(Long id) {User user = new User();user.setId(0L);return user;}}

完成上述配置后,再次启动microservice-consumer-movie服务消费者,如果microservice-consumer-user服务提供者正常运行,服务消费者返回正常数据;如果microservice-consumer-user服务提供者出现故障,服务消费者则调用findByIdFailback方法,返回UserId为0的数据。
另外,hystrix还提供了服务监控功能,运行http://localhost:8010/hystrix.stream(8010为服务消费者服务运行端口)可以监控microservice-consumer-movie服务消费者的接口调用状态,但返回的监控数据为json数据,不适合我们查看,因此需要我们搭建hystrix-dashboard服务,把json数据整理为图形化数据,因此需要我们做如下配置:
1.需要我们在pom添加hystrix-dashboard依赖:

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

2.需要我们在main程序class添加@EnableHystrixDashboard注解:

@SpringBootApplication
@EnableHystrixDashboard
public class EurekaApplication {
    public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}

完成上述配置后,运行http://localhost:8030/hystrix,输入监控的stream和title,点击Monitor Stream,便会出现图形化的监控页面。
hystrix-dashboard
我们不断刷新http://localhost:8010/movie/1接口,图形化页面便会时时显示接口的各项监控参数。

  相关解决方案