Hystrix (服务熔断,服务降级)

Hystrix

1.1 什么是服务雪崩

多个微服务之间调用的时候,加入微服务A调用微服务B和微服务C,而微服务B,C又要调用其他的微服务,这就是"扇出",如果扇出的链路上某个微服务的响应时间过长或者不可用,那么对于微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,也就是"雪崩效应"。

1.2 什么是Hystrix

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出故障的情况下,不会导致整体服务失败,避免级联故障,从而提高分布式系统的弹性

“断路器” 本身就是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,会向调用方返回一个服务预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间,不必要的占用,从而避免了故障在分布式系统中的蔓延,甚至雪崩。

1.3 Hystrix能用来做什么
  • 服务降级

  • 服务熔断

  • 服务限流

1.4 什么是服务熔断
  • 服务熔断是应对雪崩效应的一种微服务链路保护机制

  • 当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的相应信息,在SpringCloud中熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的情况,当失败的调用达到一定的阈值,(5秒内20次失败)就会启动熔断机制,注解是:@HystrixCommand

1.5 demo演示

导入依赖

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

服务端 (Provider)添加注解

@RestController
public class DeptController {

    @Autowired
    private DeptService deptService;


    @GetMapping("/dept/get/{id}")
    @HystrixCommand(fallbackMethod = "hystrixGet")
    public Dept get(@PathVariable("id") Long id){
        Dept dept = deptService.queryById(id);

        if (dept==null){
            throw new RuntimeException("id=>"+id+",不存在该用户,或者信息无法找到~");
        }

        return dept;
    }
    
    
    
    

    //备选方法
    public Dept hystrixGet(@PathVariable("id") Long id){
        return new Dept()
                .setDeptno(id)
                .setDname("id=>"+id+"没有对应的信息,null--@Hystrix")
                .setDb_source("no this database in MySQL");
    }


}

在主启动类,添加对熔断的支持

@EnableCircuitBreaker 
2.1 什么是服务降级

服务降级,就是整体的资源不够用了,那么要适当地关掉一些服务

例如有超多请求访问服务A,但是访问B C的人很少,那么为了资源更加高效的利用,那么就可以让访问BC 的很少的人也去访问A,先停调BC ,等度过这个时期,再正常开启

那么这个其实是由客户端相关的,在客户访问的时候,我们可以返回客户信息,告知服务已停掉

2.2 基本操作

编写一个类,实现FallbalkFactory接口

重写一个方法,返回类型是Feign的那个接口 ,并重写方法(方法中返回用户的提示信息)

@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory {
    @Override
    public DeptClientService create(Throwable throwable) {
        return new DeptClientService() {

            @Override
            public Dept queryById(Long id) {
                return new Dept()
                        .setDeptno(id)
                        .setDname("id=>"+id+"没有对应的信息,客户端提供了降级的信息,这个服务现在已经被关闭")
                        .setDb_source("没有数据~");
            }

            @Override
            public List<Dept> queryAll() {
                return null;
            }

            @Override
            public boolean addDept(Dept dept) {
                return false;
            }

        };
    }
}

我们要给Feign那个接口添加一些操作,能够调用降级的操作

@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)

然后在客户端(Consumer) 修改配置文件,开启熔断降级

# 开启降级feign.hystrix
feign:
  hystrix:
    enabled: true

2.3 服务熔断和服务降级的简单比较

服务熔断:服务端,某个服务超时或异常,引起熔断

服务降级:客户端,从整体网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用,用户依然可以发起请求,但是该请求不再走我们的服务器,此时在客户端我们可以准备一个FallBackFactory,这时我们可以返回一个默认信息,如:服务已停掉,不足是整体的服务水平下降!但是也是可以用的!比直接挂掉强

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值