SpringCloud学习(六)Feign中使用Hystrix进行服务熔断

一. 综述
在微服务架构中,业务会被拆分成一个个服务,服务间可以彼此调用。为了保证服务的高可用性,单个服务通常会被集群部署,但是由于网络等原因,服务并不能保证100%可用。如果某个服务出现了问题,那么调用这个服务就会出现线程阻塞,如果此时又有大量的请求涌入,Servlet容器的线程资源就会被迅速消耗殆尽,最终导致服务瘫痪。服务与服务之间的依赖,导致了故障会传播,以致于会对整个微服务系统造成影响,导致整个服务瘫痪,这种现象叫做雪崩现象。
简单的说Hystrix就是当服务出现异常或者调用超时时,立即返回预定好的结果,避免多请求的情况下线程阻塞给系统带来的影响,以提高系统的整体弹性。
二. 使用

使用的版本:spring-cloud-openfeign 2.1.0.RELEASE,spring-cloud-starter-netflix-hystrix 2.1.0.RELEASE
SpringCloud版本:Greenwich.RELEASE

Hystrix可以用在服务消费者端也可以用在服务的提供者端,当在具体的方法上添加@HystrixCommand(fallbackMethod="xxxx")注解,即为该方法指定降级方法,当它发生异常或者调用超时时,就会去执行fallbackMethod指定的方法。

这里介绍如何在Feign中使用Hystrix进行服务降级,Feign使用的是实现接口的方式
具体可以看:SpringCloud学习(五)Feign的使用方式(二)——服务提供者实现Feign接口的形式

  1. 在feign-interface(feign公共接口)和consume(消费者)模块引入Hystrix依赖

    	<!-- hystrix熔断 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
                <!-- 这里会自动引入版本,类似parent标签继承 -->
            </dependency> 
    
        <dependencyManagement>
            <dependencies>
                <!-- <scope>import</scope>解决单继承问题,类似parent标签, -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Greenwich.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
  2. 消费者端在配置文件中开启feign对Hystrix的支持(新版本默认是关闭)

    # 开启feign对hytrix的支持
    feign:
      hystrix:
        enabled: true
    
  3. 为原本Feign接口中的@FeignClient注解添加fallback属性,表示降级时将要去执行的类

    package feign.webservice;
    
    import com.fei.common.constant.ServerContant;
    import com.fei.common.model.employee.EmployeeModel;
    import feign.hystrix.EmployeeFallBack;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import java.util.List;
    
    /**
     * @Author: xiaoshijiu
     * @Date: 2019/7/4
     * @Description: 员工feign接口
     * @FeignClient: name表示为哪个服务配置feign申明式服务调用,fallback表示服务出现异常或者超时时去执行的类
     */
    @FeignClient(name = ServerContant.SERVER_PROVIDER, fallback = EmployeeFallBack.class)
    @RequestMapping("/feign/empl")
    public interface EmployeeWebService {
    
        /**
         * 查询所有员工
         * @return 员工模型列表
         */
        @RequestMapping(value = "/list", method = RequestMethod.GET)
        List<EmployeeModel> list();
    
    }
    
  4. 新建EmployeeFallBack类,实现EmployeeWebService接口,并将其加入IOC容器中

    package feign.hystrix;
    
    import java.util.List;
    import com.fei.common.log.Loggable;
    import org.springframework.stereotype.Component;
    import com.fei.common.model.employee.EmployeeModel;
    import feign.webservice.EmployeeWebService;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * @Author: xiaoshijiu
     * @Date: 2019/7/7
     * @Description: Feign接口,服务降级操作(服务出现异常或者超过设定时间,即执行该降级方法)
     * @注意:这个实际是需要被加入到IOC容器中的,实现接口也会继承她的Requestmapping,所以这里要重写一下区分开,不然启动报错
     */
    @Component
    @RequestMapping("/fallback/empl")
    public class EmployeeFallBack implements EmployeeWebService, Loggable {
    
        @Override
        public List<EmployeeModel> list() {
            getLog().error("服务提供异常,进行了服务降级处理");
            return null;
        }
    }
    

    这样就实现了:Feign接口中的任一方法出现问题,都能找得到相应的降级方法

    注意1:这里为了降低耦合度,我还是把该类建在了feign-interface模块中(feign公共接口模块),那要想将其加入到IOC容器中,消费端就需要额外扫描一下所在包(因为SpringBoot默认是扫描主启动类所在包及其子包)
    需要注意的是,在主启动类上再加上@ComponentScan(basePackages = { "feign.hystrix" })注解,则默认的包扫描规则将不再生效,可以在其他标注了@Configuration的地方配置@ComponentScan(basePackages = { "feign.hystrix"}),亲试有效

    注意2:实现接口也会继承她的RequestMapping,所以这里要重写一下RequestMapping进行区分,不然启动报错

  5. 其他不变,跟Feign工程搭建的项目内容一致

  6. 测试,启动三个服务提供者,二个Eureka注册中心,以及消费端,正常情况下,三个服务轮询访问。
    现在关闭一个服务提供者,访问,其他两个服务正常,轮询到关闭的服务时,控制台显示:
    在这里插入图片描述

  7. 至此,简单的Feign集成Hystrix进行服务降级,完成

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值