Hystrix 服务熔断和降级

Hystrix


Hystrix是一个用于分布式系统的延迟和容错的开源库。在分布式系统里,许多依赖不可避免的调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障监控(类似熔断保险丝),向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延。乃至雪崩。

何为服务雪崩

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

一:服务熔断

注解: @HystrixCommand(fallbackMethod = "") //调用失败回调方法 
       @EnableCircuitBreaker  //添加熔断支持

pom文件

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

启动类

@SpringBootApplication
@EnableEurekaClient   //在服务启动后自动注册到Eureka中
@EnableDiscoveryClient  //服务发现
@EnableCircuitBreaker  //添加熔断支持
public class HystrixDeptProvider_8001 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(HystrixDeptProvider_8001.class,args);
    }
}
@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 + "用户不存在" + "hystrixGet");
    }}

二:服务降级

客户端application.yml

server:
  port: 80
#Eureka配置
eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#开启降级feign.hystrix
feign:
  hystrix:
    enabled: true

interface DeptClientService

@Component
@FeignClient(value = "SPRINGCLOUD-PRIOVIDER-DEPT",fallbackFactory =
        DeptClientServiceFactory.class) //fallbackFactory
public interface DeptClientService {
    
    
    @PostMapping("/dept/add")
    public boolean addDept(Dept dept);
    @GetMapping("/dept/get/{id}")
    public Dept queryById(@PathVariable("id")Long id);
    @GetMapping("/dept/all")
    public List<Dept> queryAll();
}

FallbackFactory

@Component
public class DeptClientServiceFactory implements FallbackFactory {
    
    
    @Override
    public Object create(Throwable throwable) {
    
    
        return new DeptClientService() {
    
    
            @Override
            public boolean addDept(Dept dept) {
    
    
                return false;
            }
            @Override
            public Dept queryById(Long id) {
    
    
                return new Dept().setDeptno(id).setDname("id>=" + id +
                        "没有对应信息,客户端提供降级的信息,这个服务已经被关闭").setDb_source(
                        "没有信息");
            }
            @Override
            public List<Dept> queryAll() {
    
    
                return null;
            }
        };
    }
}

服务熔断: 服务器端,某个服务超时或者异常,引起熔断;
服务降级: 客户端 从整体网站请求负载考虑,当某个服务熔断或者关闭后,服务将不再被调用,此时准备FallbackFactory 返回默认值,保证客户端有些功能还能用;缺点服务体验下降;

猜你喜欢

转载自blog.csdn.net/weixin_44313584/article/details/109616780