首页 > 其他 > 详细

Hystrix的服务熔断和服务降级

时间:2019-11-13 15:01:32      阅读:934      评论:0      收藏:0      [点我收藏+]

一、服务熔断

  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;
            }
        };
    }
}

 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的消费者,然后进行测试

技术分享图片

 

 

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

当我们关闭此服务后

技术分享图片

 

 

 思考:

  虽然我们关闭了这个服务,但我们并没有让调用此方法的服务的进程等待,阻塞。我们返回了一个可处理的备选响应。保证了整体资源的运行。

 

 

 

 

 

 

 

Hystrix的服务熔断和服务降级

原文:https://www.cnblogs.com/guanyuehao0107/p/11848286.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!