Hystrix的简单介绍与使用

Hystrix 是 Netflix 针对微服务分布式系统采用的熔断保护中间件,相当于电路中的保险丝。

在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix 是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix 通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。

在微服务架构下,很多服务都相互依赖,如果不能对依赖的服务进行隔离,那么服务本身也有可能发生故障,Hystrix 通过 HystrixCommand 对调用进行隔离,这样可以阻止故障的连锁效应,能够让接口调用快速失败并迅速恢复正常,或者回退并优雅降级。

Hystrix 的简单使用

首先创建一个Spring Boot 模块,然后添加如下依赖:

创建成功后,添加如下配置,将Hystrix 注册到 Eureka 上:

spring.application.name=hystrix
server.port=3000
eureka.client.service-url.defaultZone=http://localhost:1111/eureka

然后在项目启动类上添加如下注解,开启断路器,同时提供一个RestTemplate :

//@SpringBootApplication
//@EnableCircuitBreaker
@SpringCloudApplication //【组合注解】@SpringCloudApplication = @SpringBootApplication + @EnableCircuitBreaker
public class HystrixApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class, args);
    }
 
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
 
}

接下来提供Hystrix 接口:

@Service
public class HelloService {
 
    @Autowired
    RestTemplate restTemplate;
 
    /**
     * 在这个方法中,将发起一个远程调用,去调用provider中提供的 /hello接口
     * 但是调用这个方法可能会失败,
     *
     * 所以在方法上面添加 @HystrixCommand ,配置fallbackMethod 属性,这个属性表示该方法调用失败时的临时替代方法
     * 【专业术语:服务降级】 */
    @HystrixCommand(fallbackMethod = "error")//如果希望直接抛出异常,不做服务降级 。则再加上ignoreExceptions配置(fallbackMethod = "error",ignoreExceptions = ArithmeticException.class)
    public String hello(){
        return restTemplate.getForObject("http://provider/hello",String.class);
    }
 
   /**
     * 这个方法名要和 fallbackMethod一致
     * 方法返回值也要一致 【比如这里都是String类型,error也要一致】
     * 此处 调用 备案方案 ,比如数据库崩了,就要去查缓存
     *
     * **下面也可以继续写HystrixCommand调用error2 ,然后error2再去调用其它的方法,方法一样,依次往下,这就是【服务降级】
     * **越往下,数据的获取能力越来越容易,准确性可能降低,但不会让系统挂掉。
     * **这就是Hystrix 的作用: 1. 降级  2. 容错。  避免雪崩  。
     *
     * @return
     */
    //@HystrixCommand(fallbackMethod = "error2")
    public String error(){
        return "error";
    }
 
}
@RestController
public class HelloController {
    @Autowired
    HelloService helloService;
    
    @GetMapping("/hello")
    public String hello(){
        return helloService.hello();
    }
 
}

启动Eureka 服务,启动两个provider实例(打两个包),启动一个consumer,访问consumer 去调用两个provider接口(负载均衡方式),访问成功之后然后突然关闭一个provider服务,再去刷新请求consumer,会有短时间的报错。(原因是一个provider掉线,它自己要把掉线的消息告诉Eureka,Eureka再把provider掉线的消息告诉consumer,在这个过程中肯定是有延迟的,在consumer没收到provider掉线的消息之前就有可能会去访问已经掉线的provider,这时就会有异常抛出。Hystrix在这里其实就是解决很短时间内的问题,consumer访问掉线的provider时不让弹出错误页面就行)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李多肉同学

长得好看的人一般都喜欢发红包

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值