Spring Cloud 之五:Feign使用Hystrix

  系列目录(持续更新。。。)

Spring Cloud之一:注册与发现-Eureka工程的创建

Spring Cloud之二:服务提供者注册到Eureka Server

Spring Cloud之三:Eureka Server添加认证

Spring Cloud之四:使用Feign实现微服务间的交互


目录

Hystrix干什么用的?

Feign中使用Hystrix的降级

 1、在IUserFeignClient增加代码

2、在IUserFeignClient增加fallbackFactory参数

3、IUserFeignClient完整代码

4、pom增加阿里云hystrix依赖

5、yml配置文件开启hystrix

 6、测试


注意:该篇的实现是基于本系列使用的spring cloud版本,由于spring cloud版本众多,一些yml配置和pom包的引用可能会有所差异。

Hystrix干什么用的?

首先,总结下我们前面构建的项目:

项目 端口
eureka-pass
7200 服务发现与注册中心
user 7101 微服务:用户模块
order 7102 微服务:订单模块

基于上面的项目,上篇中我们在订单模块(order)里面使用Feign调用了用户模块(user)里面的接口。

但是,如果用户模块(user)因为某种原因响应慢或者模块服务挂了,导致无法及时响应订单模块(order)的请求,这时候订单模块(order)就会一直等待用户模块(user)的响应(一定时间后可能最终失败),这样就导致程序缓慢。这种情况是致命的,严重的情况可能会造成系统的崩溃。

举个例子:我们要向A模块请求一个接口,A模块请求B模块,B模块请求C模块,如下:

        A->B->C

这时候如果C模块无法正常响应B模块,B模块也就无法正常响应A模块,这样也就导致了系统的级联故障。

Hystrix就是为了解决上述问题的一个工具类库,它是一个容错库,用于防止级联故障,从而提升系统的可用性。

Hystrix具备如下功能:

1、防止单个接口异常导致整个微服务故障。
2、快速失败,如果服务出现故障,服务的请求快速失败,线程不会等待。
3、服务降级(FallBack),降级简单说就是“退而求其次”,访问不了,就自己设定一个返回方案,下面主要通过阐述这个功能来带大家入门。
4、熔断机制,防止故障的扩散,导致整个服务瘫痪。
5、服务监控,提供了Hystrix Bashboard仪表盘,实时监控熔断器状态

Feign中使用Hystrix的降级

那么,我们如何整合Hystrix呢?其实,上篇我们使用的Feign本身就已经集成了Hystrix功能。

在上一篇文章中,我们在订单模块(order)集成了Feign,项目机构如下:

Spring Cloud 之五:Feign使用Hystrix_第1张图片

通过Feign接口调用异常或超时需要触发降级,有两种方式来实现降级

1、通过 @FeignClient(fallback=…)来指定托底类

2、通过@FeignClient(fallbackFactory=…)来指定托底类

这两种方式的区别在于第1种没办法打印出异常日志的,而第二种是可以打印出异常日志的。推荐使用第2种方式,下面将演示第2种方式的实现(第一种方式在最后的完整代码里,我也会体现)。

 1、在IUserFeignClient增加代码

class UserFallbackFactory implements FallbackFactory {
    private static final Logger LOGGER= LoggerFactory.getLogger(UserFallbackFactory.class);

    @Override
    public IUserFeignClient create(Throwable cause){
        return new IUserFeignClient() {
            @Override
            public String getInfo() {
                                
                //记录日记
                UserFallbackFactory.LOGGER.error("调用异常:"+cause);
                
                return "我已经挂了";
            }

        };
    }


}

2、在IUserFeignClient增加fallbackFactory参数

Spring Cloud 之五:Feign使用Hystrix_第2张图片

3、IUserFeignClient完整代码

下面的代码是第1、2步骤后,IUserFeignClient文件的最终代码

package cn.laocheng.user.feignClient;

import cn.laocheng.user.model.TestModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

fallback方式
//@FeignClient(name="user",fallback = UserFallback.class)
//fallbackFactory方式
@FeignClient(name="user",fallbackFactory = UserFallbackFactory.class)
public interface IUserFeignClient {

    /**
     * feign调用无参数的Get请求
     * @return
     */
    @RequestMapping(value = "/getInfo",method = RequestMethod.GET)
    public String getInfo();

}

//@Component
//class UserFallback implements IUserFeignClient{
//    public String getInfo() {
//
//        return "我已经挂了";
//    }
//}


@Component
class UserFallbackFactory implements FallbackFactory {
    private static final Logger LOGGER= LoggerFactory.getLogger(UserFallbackFactory.class);

    @Override
    public IUserFeignClient create(Throwable cause){
        return new IUserFeignClient() {
            @Override
            public String getInfo() {

                //记录日记
                UserFallbackFactory.LOGGER.error("调用异常:"+cause);

                return "我已经挂了";
            }

        };
    }


}

4、pom增加阿里云hystrix依赖

我们这里使用的是阿里云hystrix,所以要增加下面的依赖

        
            org.springframework.cloud
            spring-cloud-starter-netflix-hystrix
            2.2.6.RELEASE
        

5、yml配置文件开启hystrix

feign:
  circuitbreaker:
    enabled: true

 6、测试

依次启动下列三个项目

项目 端口
eureka-pass
7200 服务发现与注册中心
user 7101 微服务:用户模块
order 7102 微服务:订单模块

访问:http://localhost:7101/getInfo

浏览器显示:

 这个其实在上篇已经演示过。

停止user模块

重新访问:http://localhost:7101/getInfo

浏览器显示

Spring Cloud 之五:Feign使用Hystrix_第3张图片

 

你可能感兴趣的:(Spring,Cloud,spring,cloud,hystrix,微服务)