【SpringCloud】熔断器Hystix是什么,以及怎么使用呢

一、Hystix是什么呢

Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。
熔断器Hystrix是容错管理工具,作用是通过隔离、控制服务从而对延迟和故障提供更强大的容错能力,避免整个系统被拖垮。

二、Hystix有什么作用呢

复杂分布式架构通常都具有很多依赖,当一个应用高度耦合其他服务时非常危险且容易导致失败,这种失败很容易伤害服务的调用者,最后导致一个接一个的连续错误,应用本身就处在被拖垮的风险中,最后失去控制,就像在一个高流量的网站中,某个单一的后端一旦发生延迟,将会在数秒内导致所有应用资源被耗尽。
当在系统高峰时期,大量对微服务的调用可能会堵塞远程服务器的线程池,如果这个线程池没有和主应用服务器的线程池隔离,就会导致整个服务器挂机。
Hystrix使用自己的线程池,这样和主应用服务器线程池隔离,如果调用花费很长时间,就停止调用,不同的命令或命令组能够被配置使用他们各自的线程池,可以隔离不同的服务。

三、Hystix的工作机制

熔断机制的原理,像家里的电路熔断器,如果电路发生短路能立刻熔断电路,避免发生灾难。在分布式系统中应用这一模式之后,服务调用放可以自己进行判断某些服务反应慢或者存在大量超时的情况时,能够自动熔断,防止整个系统被拖垮。
Hystrix可以实现弹性容错,当情况好转之后,可以自动重连。

正常工作的情况下,客户端请求调用服务API接口,当有服务出现异常时,直接进行失败回滚,服务降级处理。
【SpringCloud】熔断器Hystix是什么,以及怎么使用呢_第1张图片

系统特别繁忙时,一些次要服务暂时中断,优先保证主要服务的畅通,一切资源优先让给主要服务来使用,在双十一、618时,京东天猫都会采用这样的策略

四、熔断器Hystix怎么用呢

修改消费者consumer-demo

(1)引入Hystix依赖


            org.springframework.cloud
            spring-cloud-starter-netflix-hystrix

(2)修改user服务的Dao,并在原方法上添加注解@HystrixCommand,并声明一个失败时的回滚处理函数

@HystrixCommand(fallbackMethod = “queryUserByIdFallback”)的含义:声明一个失败回滚处理函数queryUserByIdFallback,当queryUserById执行超时(默认是1000毫秒),就会执行fallback函数,返回错误提示。

@Slf4j
@Component
public class UserDao {
    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "queryUserByIdFallback")
    public User queryUserById(Long id){
        long begin=System.currentTimeMillis();
        String url="http://producer-service/user/"+id;
         User user = restTemplate.getForObject(url, User.class);
         long end=System.currentTimeMillis();
         //记录访问用时
        log.info("访问用时:{}",end-begin);
        return user;
    }

    public User queryUserByIdFallback(Long id){
        User user = new User();
        user.setId(id);
        user.setUsername("用户信息查询出现异常!");
        return user;
    }
}

修改服务提供者producer-demo

(3)修改UserService ,随机休眠一段时间,以触发熔断

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public User selectUserById(Long id) throws InterruptedException {
        // 为了演示超时现象,我们在这里然线程休眠,时间随机 0~2000毫秒
        Thread.sleep(new Random().nextInt(2000));
        User user = userMapper.selectByPrimaryKey(id);
        return user;
    }
}

修改消费者consumer-demo

(4)然后在消费者的启动类上添加@EnableHystrix注解,代表开启Hystrix功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ConsumerDemoApplication {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        // 这次我们使用了OkHttp客户端,只需要注入工厂即可
        return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
    }
    public static void main(String[] args) {
        SpringApplication.run(ConsumerDemoApplication.class, args);
    }
}

(5)启动测试

在这里插入图片描述

【SpringCloud】熔断器Hystix是什么,以及怎么使用呢_第2张图片

注意:
Ribbon超时时间设置的是1000ms,Hystix的超时时间默认也是1000ms,如果这俩个的时间一样,会导致重试机制不被触发,所以Ribbon的超时时间一定要小于Hystix的超时时间。

可以通过hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds进行设置Hystrix的超时时间

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000 # 设置Hystrix的超时时间为6000ms,默认是1000ms

注意:
本节的代码是建立在上一篇博客《【SpringCloud】负载均衡Ribbon是什么,又该怎么用呢?(链接地址:https://blog.csdn.net/cxh6863/article/details/105856317)》的基础上的

你可能感兴趣的:(SpringCloud)