SpringCloud的学习-Hystrix熔断器(4)

Hystrix
分布式系统中服务与服务之间相互依赖,一种不可避免的情况就是当某些服务出现故障时,依赖于它们的其他服务出现远程调度的线程阻塞,在高并发的情况下,可能在几秒钟内就会使整个服务处于线程负载饱和状态,从而从一个服务不可用扩散到整个服务不可用,既雪崩效应.Hystrix是Netflix公司开源的一个项目,它提供了熔断器功能,能够阻止分布式系统中的联动故障.
Hystrix的设计原则.
  a.防止单个服务的故障耗尽整个服务的线程资源.
  b.快速失败机制,如果某个服务出现故障,则调用该服务的请求快速失败,而不是线程等待.
  c.提供回退方案,在请求发生故障时,执行设定好的回退方案.
  d.通过隔离服务的访问点来阻止联动故障,防止故障扩散到其他服务,从而提高整个分布式系统的可用性.

Hystrix的工作机制
首先,当服务的某个API接口的失败次数在一定时间内小于设定的阀值时,熔断器处于关闭状态,该API接口正常提供服务.当API接口处理请求的失败次数大于设定的阀值时,Hystrix判定该API接口出现故障,打开熔断器,这时请求该API接口会执行快速失败逻辑(即fallback回退逻辑),请求的线程不会处于阻塞状态.处于打开状态的熔断器,一段时间后会处于半打开的状态,并将一定数量的请求执行正常逻辑.剩余的请求会执行快速失败,若执行正常逻辑的请求失败了,则熔断器继续打开;若成功了,则将熔断器关闭.这样熔断器就具有了自我修复的能力.

接下来我会以ribbon和feign两种方法进行熔断。

Ribbon

打开ribbo端,在Pom文件中添加配置

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

在程序启动类中添加注解

@EnableHystrix
@EnableHystrixDashboard

修改HelloService类,在hiService方法上加上@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法,熔断方法直接返回了一个字符串,字符串为"hi,"+name+",sorry,error!",代码如下:

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;
    @HystrixCommand(fallbackMethod = "aaa")
    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HC/hi?name="+name,String.class);
    }
    public  String aaa(String name){
    return "hi,"+name+",sorry";

    }

}

关闭之前的Client端,访问http://localhost:8769/hi?name=ha 将会显示如下:

hi,ha,sorry

Feign
Feign的起步依赖中已经加入了Hystrix的依赖(可以在maven中点击feign的依赖查看),所以在Feign中使用Hystrix不需要引入任何的依赖,只需要在application.yml中配置开启Hystrix的功能,如下:

feign:
  hystrix:
    enabled: true

Idea会显示Cannot resolve configuration property 'feign.hystrix.enabled’more…
实际上是生效了的,不用担心

在FeignClient的SchedualServiceHi接口的注解中加上fallback的指定类

@FeignClient(value = "service-hc",fallback = SchedualServiceHiHystric.class)

SchedualServiceHiHystric作为熔断器的逻辑处理类,需要实现SchedualServiceHi接口,并需要在hi方法中写下处理熔断的具体逻辑,最后别忘了加上@Component注解,将该类交给Spring来管理.

@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry"+name;
    }
}

启动工程,访问http://localhost:8772/hi?name=ha 将显示:

sorryha

其实挺简单的,跟着做就可以完成了。

参考文章:https://blog.csdn.net/forezp/article/details/81040990
https://blog.csdn.net/fly_zhaohy/article/details/80669026

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值