• 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)


    在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用。springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使用feign)。有时为了提高系统的健壮性,某些访问量大的服务模块还会做集群部署。但是服务之间的调用不可能百分之百成功的,如果出现超时、异常会导致服务无法提供功能。这时如果有大量请求访问异常服务,就会造成系统资源耗尽,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。在实际工作中,复杂的系统往往有成百上千个服务模块,某个功能模块出现异常,不能影响其它功能的正常运行,所以熔断器Hystrix就派上用场了。

    一、Hystrix简介:

    Hystrix由Netfilix API团队研发于2011年,2012年开始在Hystrix公司内部推广和使用,Hystrix在Netflix中久经沙场,现在已经是一个非常成熟的系统,而最近流行的微服务架构和Spring Cloud,让Hystrix成为了配套的基础设施,在国内也逐渐流行起来。

    hystrix的出现即为解决服务雪崩效应,它通过四个方面的机制来解决这个问题

    1. 隔离(线程池隔离和信号量隔离):限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。

    2. 降级:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。

    3. 熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。

    4. 缓存:提供了请求缓存、请求合并实现。

    如果想要了解更多的Hystrix的底层及实现原理,可以参考相关文章学习,本系列主要讲解如何快速在工作中使用Hystrix。

    二、环境准备:

    最终目录结构:

     

    本系列文章,都是层层递进的,本章内容在前面搭建好的项目框架上进行开发讲解,对搭建springcloud的多模块子项目框架不清楚的同学可以参考一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目 

    工作中,我们基本上都是使用feign进行服务调用的,所以本章只讲解Feign中使用断路器,对上一章feign工程搭建有兴趣的可以参考:一起来学Spring Cloud | 第四章:服务消费者 ( Feign )

    三、Feign中使用断路器:

    1. 在上章的springcloud-feign-client工程的application.properties配置文件中,加入配置:feign.hystrix.enabled=true

    server.port=9600
    spring.application.name=springcloud-feign-client
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
    feign.hystrix.enabled=true

    2. 在上章的springcloud-feign-client工程中,新增一个FeignRemoteService类的实现类,命名为:HystrixFeignRemoteCallBack,做为出现接口异常时的回调方法

    package com.haly.romote.hystrix;
    
    import org.springframework.stereotype.Component;
    
    import com.haly.romote.FeignRemoteService;
    
    @Component
    public class HystrixFeignRemoteCallBack implements FeignRemoteService{
    
    	@Override
    	public String hello(String name) {
    		// TODO Auto-generated method stub
    		return name + ",Due error,enter Hystrix";
    	}
    
    }

    3. 在上章的springcloud-feign-client工程中,新增一个FeignRemoteService类中加入回调实现类的注解配置

    package com.haly.romote;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import com.haly.romote.hystrix.HystrixFeignRemoteCallBack;
    
    @FeignClient(value = "springcloud-eureka-client",fallback = HystrixFeignRemoteCallBack.class)
    public interface FeignRemoteService {
    
        @RequestMapping(value = "/hello",method = RequestMethod.GET)
        public String hello(@RequestParam(value = "name") String name);
        
    }
    

    4. 运行项目

    ① 先启动springcloud-eureka-server模块,开启eureka注册中心

    ② 启动springcloud-eureka-client模块,开启提供远程服务功能,并且提供接口能力 /hello

    ③ 启动springcloud-feign-client模块,开启消费模块,用来调用springcloud-eureka-client模块中的/hello接口

    Eureka上的注册信息,如下图:

    打开浏览器,输入网址:http://localhost:9600/getHello?name=young码农,运行结果如下:

    我们模仿生产环境,服务提供者宕机(或者返回超时),这里我们手动停掉springcloud-eureka-client服务

    输入网址:http://localhost:9600/getHello?name=young码农

    本章我们只是在回调接口中,返回一个字符串,工作中,有些场景会做一些业务逻辑处理(比如调用短信发送接口,出现异常会在记录一条异常日志,后面来处理这些异常)。

    工作中我们会遇到很多特殊场景,特别在访问量过大,业务较复杂的时候,会出现一些奇奇怪怪的问题,所以Feign,Hystrix有许多配置项可以使用,我们可以根据相应业务配进行合理配置

  • 相关阅读:
    python 枚举enum
    python lambda 三元表达式
    python修改类属性
    python获取引用对象的个数
    python 返回实例对象个数
    python __del__() 清空对象
    python面向对象:继承
    python面向对象:多态
    Docker容器和K8s添加Health Check
    mkfs.xfs: /dev/vdb appears to contain a partition table (dos)
  • 原文地址:https://www.cnblogs.com/haly/p/10905469.html
Copyright © 2020-2023  润新知