一. 综述
在微服务架构中,业务会被拆分成一个个服务,服务间可以彼此调用。为了保证服务的高可用性,单个服务通常会被集群部署,但是由于网络等原因,服务并不能保证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接口的形式
-
在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>
-
消费者端在配置文件中开启feign对Hystrix的支持(新版本默认是关闭)
# 开启feign对hytrix的支持 feign: hystrix: enabled: true
-
为原本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(); }
-
新建
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
进行区分,不然启动报错 -
其他不变,跟Feign工程搭建的项目内容一致
-
测试,启动三个服务提供者,二个Eureka注册中心,以及消费端,正常情况下,三个服务轮询访问。
现在关闭一个服务提供者,访问,其他两个服务正常,轮询到关闭的服务时,控制台显示:
-
至此,简单的Feign集成Hystrix进行服务降级,完成