SpringCloud Hystrix使用

目录


Hystrix简介


  • Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。

Hystrix能做什么


  • 在通过第三方客户端访问(通常是通过网络)依赖服务出现高延迟或者失败时,为系统提供保护和控制
  • 在分布式系统中防止级联失败
  • 快速失败(Fail fast)同时能快速恢复
  • 提供失败回退(Fallback)和优雅的服务降级机制
  • 提供近实时的监控、报警和运维控制手段

Hystrix 设计原则


  • 防止单个依赖耗尽容器(例如 Tomcat)内所有用户线程
  • 降低系统负载,对无法及时处理的请求快速失败(fail fast)而不是排队
  • 提供失败回退,以在必要时让失效对用户透明化
  • 使用隔离机制(例如『舱壁』/『泳道』模式,熔断器模式等)降低依赖服务对整个系统的影响
  • 针对系统服务的度量、监控和报警,提供优化以满足近实时性的要求
  • 在 Hystrix 绝大部分需要动态调整配置并快速部署到所有应用方面,提供优化以满足快速恢复的要求
  • 能保护应用不受依赖服务的整个执行过程中失败的影响,而不仅仅是网络请求

Hystrix 使用


1.配置依赖

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

2.入口程序上增加@EnableCircuitBreaker注解

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) })
public class MicroserviceConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(MicroserviceConsumerApplication.class, args);
    }
}

3.配置文件配置hystrix默认超时时间,默认即为5000,如无特殊需求不要更改

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000

基于Fegin的熔断


1.首先开启对全局Hystrix的支持,旧版中默认是开启,现在的版本则是默认false

  • feign.hystrix.enabled = true

2.为feignClient添加fallback

@FeignClient(name = "microservice-provider", fallback = HystrixClientFallback.class)
public interface UserFeignClient {

    @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
    public User findById(@PathVariable("id") Long id); 
}

3.fallback 类要继承feignClient接口,并实现方法。如果feign访问其它微服务失败,则调用fallback 对应的方法返回默认值。

public class HystrixClientFallback implements UserFeignClient  {
    @Override
    public User findById(Long id) {
        User user = new User();
        user.setId(0L);
        return user;
    }
}

controller 中实现熔断


  • @HystrixCommand 指定融断方法 注意熔断器的方法一定和原方法的名称保持一致
  • 下面的isolation表示findByFeginId与 findByIdFallback 在同一线程。不配置表示默认两个方法在不同的线程,其中findByIdFallback在隔离线程。
  • findByFeginId方法如果访问失败,则调用fallbackMethod 方法取值
 @SuppressWarnings("SpringJavaAutowiringInspection")
 @Autowired
 private UserFeignClient userFeignClient;

@HystrixCommand(fallbackMethod = "findByIdFallback",commandProperties = @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"))
@GetMapping("/movief/{id}")
public User findByFeginId(@PathVariable Long id) {
    return userFeignClient.findById(id);
}

public User findByIdFallback(Long id) {
    User user = new User();
    user.setId(6L);
    return user;
}

Feign 采用FallbackFactory 实现熔断


1.feignClient

@FeignClient(name = "microservice-provider", fallbackFactory = HystrixClientFactory.class)
public interface UserFeignClient {

    @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
    public User findById(@PathVariable("id") Long id); // 两个坑:1. @GetMapping不支持   2. @PathVariable得设置value

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public User postUser(@RequestBody User user);
}

2.fallbackFactory实现

  • 使用fallbackFactory的好处是可以添加自定义的日志
  • create返回的是实现feignClient接口的对象实例,这里简单借用一下上面基于Fegin的熔断的HystrixClientFallback方法
@Component
public class HystrixClientFactory implements FallbackFactory<UserFeignClient> {

    private static final Logger LOGGER = LoggerFactory.getLogger(HystrixClientFactory.class);

    @Override
    public UserFeignClient create(Throwable throwable) {
        HystrixClientFactory.LOGGER.info("fallback; reason was: {}", throwable.getMessage());
        return new HystrixClientFallback();
    }
}

局部关闭Hystrix支持


  • Feign 默认支持Hystrix。Feign.Builder: HystrixFeign.Builder
  • 关闭Hystrix的支持只需要修改feignClient的配置文件中的feignBuilder配置,如下:
 @Bean
  @Scope("prototype")
  public Feign.Builder feignBuilder() {
    return Feign.builder();
  }

查看Hystrix状态


http://localhost:8032/hystrix.stream 查看Hystrix信息 http://localhost:8032/health 查看监控状态

使用Hystrix DashBoard查看Hystrix信息


  • 由于Hystrix返回的信息是文本数据,不容易直观查看,需要进行整理分析。DashBoard就是对Hystrix信息的图形展现工具。

1.新建一个springboot项目
2.添加依赖

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

3.入口程序上增加@EnableHystrixDashboard注解

@EnableHystrixDashboard
@SpringBootApplication
public class HystrixDashBoardApplication {

    public static void main(String[] args) {
        SpringApplication.run(HystrixDashBoardApplication.class, args);
    }
}

4.配置端口

server.port= 8060

猜你喜欢

转载自blog.csdn.net/u014296316/article/details/80818706