天天看点

Hystrix断路器1. Hystrix2.服务熔断3. 服务降级

目录

1. Hystrix

2.服务熔断

3. 服务降级

1. Hystrix

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

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

服务雪崩

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

对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源的紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
           

功能: 服务降级,服务熔断,服务限流,监控...

2.服务熔断

应对雪崩的一种微服务链路保护机制,快速返回错误的相应信息.

相关注解@HystrixCommand

使用方法-> 在controller上加上@HystrixCommand注解, 一旦服务调用失败并抛出错误后会自动调用标注好的fallBackMethod方法进行处理

/**
     * 在feign接口处写熔断处理 可以与主方法解耦. --> 后续修改
     * @param id
     * @return
     */
    @RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
    //一旦调用服务方法失败并抛出了错误信息,会自动调用HystricxComamand标注好的fallbackMethod中指定的方法
    @HystrixCommand(fallbackMethod = "processHystrix_Get")
    public Dept get(@PathVariable("id") Long id) {
        Dept dept = deptService.get(id);
        if (null == dept) {
            throw new RuntimeException("该id" + id + "没有对应的信息");
        }
        return dept;
    }

    public Dept processHystrix_Get(@PathVariable("id") Long id) {
        return new Dept().setDeptno(id).setDname("id:" + id + "没有对应的信息,[email protected]")
                .setDb_source("no this database in MySQL");
    }
           

然后在主启动类上添加@EnableCircuitBreaker表示开启熔断机制

注意: 这种方式需要在每一个接口上进行处理, 耦合度太高. 我们可以把熔断处理放在客户端,对service接口统一处理.实现与服务提供端的解耦.

如果服务端无法访问或者出现异常,客户端就提示相应熔断处理信息. 这就是所谓的服务降级.

3. 服务降级

整体资源不够用了,关闭某些服务,待缓冲后再开启.

期间调用被关闭的服务需要做降级处理. 快速返回相应信息.

步骤:

1 .根据DeptClientService接口,新建一个实现FallBackFactory接口的类

//@Component 不要忘记添加
//主业务与熔断方法解耦
@Component
public class DeptClientServiceFallBackFactory implements FallbackFactory<DeptClientService> {
    @Override
    public DeptClientService create(Throwable throwable) {

        return new DeptClientService() {

            @Override
            public boolean add(DeptEntity deptEntity) {
                return false;
            }

            @Override
            public DeptEntity findById(Long deptNo) {
               return new DeptEntity().setDeptNo(deptNo)
                        .setDeptName("该deptNo没有对应的信息,Consumer客户端提供的降级信息,此刻服务provider已经关闭")
                        .setDbSource("没有这个数据库");
            }

            @Override
            public List findAll() {
                return null;
            }
        };
    }
}
           

2.在Feign客户端接口(service)层(FeignClientService)修改@FeignClient注解

@FeignClient(value = "STUDY-SPRINGCLOUD-DEPT",fallbackFactory = DeptClientServiceFallBackFactory.class)
           

3. 在Feign客户端application.properties中开启hystrix

feign.hystrix.enable=true;
           

这样就实现了在feign客户端做熔断处理. 避免了在服务提供者处写很多处理与业务逻辑杂糅在一起.

当客户端无法成功调用服务端某个接口的时候,就会调用FallBackFactory中指定的方法.

继续阅读