hystrix服务熔断和降级

    科技2024-01-27  90

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

    熔断机制是应对雪崩效应的一种微服务链路保户机制,当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的相应信息。当检测当该节点微服务调用响应正常后恢复调用链路,熔断机制的注解是@HystrixCommand

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

    使用步骤:   1、导入maven依赖

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

    2、在调用方法@HystrixCommand注解

    注意:

    当查询数据库时,User是存在的,则正常返回,当不存在时User为null,我自定义了一个异常

    此时该方法出现异常,就会通过 @HystrixCommand(fallbackMethod =“hystrix_GET” ),找到下面的备选响应

    //正常的功能方法 @GetMapping("/product/findone/{id}") @HystrixCommand(fallbackMethod ="hystrix_GET" ) //去找备选响应,进行服务降级 public User findById(@PathVariable("id") Integer id) { User user = userService.findById(id); if (null == user){ throw new RuntimeException("该"+id+"没有对应信息"); } return user; } //备选响应,服务降级 public User hystrix_GET(@PathVariable("id") Integer id){ return new User(id,"该ID:"+id+"没有对应的数据","Hystrix服务降级"); }

    3、启动类上加@EnableCircuitBreaker注解,开启服务熔断机制

    @SpringBootApplication @MapperScan("com.ghh.mapper") @EnableEurekaClient @EnableCircuitBreaker //开启服务熔断机制 public class ProductStart_8003 { public static void main(String[] args) { SpringApplication.run(ProductStart_8003.class,args); } }

    4、运行页面

    5,向调用方返回一个符合预期的、可处理的备选响应的

    此时:spring强调业务逻辑,处理异常信息,要分离,上面的方法会发生方法膨胀,耦合太严重,最终业务主逻辑和

    熔断的处理方式,在接口绑定,实现与主逻辑解耦

    二、服务降级   服务降级处理是在客户端实现完成的,与服务端没有关系

    整体资源快不够了,忍痛将某些服务单元先关掉,关闭后还要返回一些可处理的备选方法,待渡过难关,再开启回来,

    使用步骤:

    1、在api层创建一个一个降级服务,并实现FallbackFactory接口,且泛型为Feign的调用接口

    切记,必须在类上方加上@Component注解,

    @Component public class UserClientService implements FallbackFactory<UserService> { //Feign调用的接口 @Override public UserService create(Throwable throwable) { //构建匿名 return new UserService() { @Override public User findById(Integer id) { return new User(id,"该ID:"+id+"没有对应的数据","Hystrix此服务以关闭"); } @Override public List<User> findAll() { return null; } }; } }

    @Component public class UserClientService implements FallbackFactory { //Feign调用的接口 @Override public UserService create(Throwable throwable) { //构建匿名 return new UserService() { @Override public User findById(Integer id) { return new User(id,“该ID:”+id+“没有对应的数据”,“Hystrix此服务以关闭”); } @Override public List findAll() { return null; } }; } }

    2、在api的接口中(此处我的分布式项目中使用的是Feign的调用方法)

    @FeignClient(value = "MICROSERVICE-PRODUCT",fallbackFactory = UserClientService.class) //指明服务关闭后,会返回方法的类的字节码 public interface UserService { @GetMapping("/product/findone/{id}") public User findById(@PathVariable("id") Integer id); @GetMapping("/product/list") public List<User> findAll(); }

    3、在消费者模块的配置文件yml中

    feign: #开启服务熔断服务降级 hystrix: enabled: true  4、测试

    开启eureka的集群,提供者,Feign的消费者,然后进行测试

    当我们的整体资源不快够用,需要关闭提供该服务,又不想整体资源因依赖这个服务而发生级联效应,我们使用了上面的技术进行了服务降级处理,

    当我们关闭此服务后

    总结:   分布式项目中,有数十个依赖关系,每个依赖关系在某些时候不可避免地失败,

    服务雪崩:当A调用微服务B,B调C,和其他微服务,这是扇出,当扇出链路上某个微服务调用响应时间过长或者不可用,对微服务的A的调用就会占用越来越多的系统资源,导致系统崩溃,所谓的雪崩效应

    服务熔断:一般是某个服务异常引起的,相当于“保险丝”,当某个异常条件被触发,直接熔断整个服务,不是等到此服务超时

    服务降级:降级一般是从整体负荷考虑,当某个服务熔断之后,服务器将不再被调用,客户端可自己准备一个本地的fallback回调,返回一个缺省值,虽然服务水平下降,当能用,比直接挂掉要强

    springcloud是spring,采用AOP的思想,异常处理信息,我们某个服务的功能是每个方法,我们还可以使用AOP直接在api层通过接口设置服务降级

    Processed: 0.010, SQL: 8