SpringCloud组件:Feign整合Hystrix实现熔断

2019-03-01  本文已影响0人  淡若S悠然

Hystrix简述

Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。在微服务架构中,一个请求需要调用多个服务是非常常见的。

构建项目

因为熔断只是作用在消费方(服务调用方)这一端,因此我们根据SpringCloud组件:创建你的第一个Feign客户端文章,改动tairan-spring-cloud-feign-apitairan-spring-cloud-feign-consumer两个项目少量代码即可。

因为Feign中已经依赖了Hystrix,所以在Maven配置上不用做任何改动。

关于单独引入Hystrix依赖,网上有的文章说引入的依赖是spring-cloud-starter-hystrix,其实官方不在推荐使用,推荐使用spring-cloud-starter-netflix-hystrix

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

tairan-spring-cloud-feign-api修改

1. 创建HelloServiceHystrix

创建HelloServiceHystrix类,并实现HelloService接口,代码如下:

package com.tairan.chapter.feign.api.hystrix;

import com.tairan.chapter.feign.api.HelloService;
import org.springframework.stereotype.Component;

/**
 * 当HelloService中的Feign调用失败或超时时,会调用该实现类的方法
 * 需要注意的是fallback指定的类一定要添加@Component将其加入到Spring容器
 */
@Component
public class HelloServiceHystrix implements HelloService {
    @Override
    public String getMessage() throws Exception {
        return "Get Message Failed!";
    }
}

注意:fallback指定的类一定要添加@Component将其加入到Spring容器

2. 修改HelloService接口

修改HelloService接口,在FeignClient注解中添加fallback,指定Hystrix熔断异常回调类HelloServiceHystrix,代码如下:

package com.tairan.chapter.feign.api;

import com.tairan.chapter.feign.api.hystrix.HelloServiceHystrix;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(value = "tairan-spring-cloud-feign-provider", fallback = HelloServiceHystrix.class)
public interface HelloService {

    @RequestMapping("/hello")
    String getMessage() throws Exception;

}

tairan-spring-cloud-feign-consumer修改

  1. 开启FeignHystrix的支持,在application.yml文件中添加如下配置:
feign:
  # Dalston SR1(待定)之后的版本默认关闭hystrix对feign的支持,如果想要使用fallback功能这里必须启用
  hystrix:
    enabled: true
  1. 入口类修改SpringBootApplication扫描路径,可以扫描到Hystrix熔断类,即tairan-spring-cloud-feign-api中的HelloServiceHystrix类,代码如下所示:
@SpringBootApplication(scanBasePackages = "com.tairan.chapter.feign")
@EnableDiscoveryClient
// 通过@EnableFeignClients注解开启Spring Cloud Feign的支待功能。
@EnableFeignClients("com.tairan.chapter.feign.api")
public class TairanSpringCloudFeignConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(TairanSpringCloudFeignConsumerApplication.class, args);
    }

}

运行测试

  1. 启动服务注册中心tairan-spring-cloud-eureka
  2. 启动服务提供方tairan-spring-cloud-feign-provider
  3. 启动服务消费方tairan-spring-cloud-feign-consumer
  4. 访问tairan-spring-cloud-feign-consumer工程的/feign-hello接口,链接:http://localhost:8080/feign-hello,查看访问结果
  5. 关闭服务提供方tairan-spring-cloud-feign-provider
  6. 访问tairan-spring-cloud-feign-consumer工程的/feign-hello接口,链接:http://localhost:8080/feign-hello,查看访问结果

执行4操作后,访问链接http://localhost:8080/feign-hello后,接口返回结果如下所示:


执行5操作后,访问链接http://localhost:8080/feign-hello后,接口返回结果如下所示:
根据返回结果说明熔断成功。

源码位置

本章源码已经上传到淡若悠然,请结合源码进行学习,感谢阅读。

码云地址(本章源码):https://gitee.com/litairan/tairan-spring-cloud

上一篇下一篇

猜你喜欢

热点阅读