SpringCloud组件:Feign整合Hystrix实现熔断
2019-03-01 本文已影响0人
淡若S悠然
Hystrix简述
Netflix
开源了Hystrix
组件,实现了断路器
模式,SpringCloud
对这一组件进行了整合。在微服务架构中,一个请求需要调用多个服务是非常常见的。
- 雪崩效应
多个微服务之间进行复杂的通信时,如果有一个服务出现问题,就会引发雪崩效应,导致整个系统瘫痪。Spring Cloud Hystrix
提供了一个类似于保险丝的作用,当服务不可用的时候,Hystrix
打开断路器,不再进行服务通信,从而保证自身服务的可用性。 - 服务降级
服务降级就是在系统高并发的情况下,可以将一些边缘服务进行降级(服务暂停),将资源优先供给核心服务的处理。
构建项目
因为熔断只是作用在消费方(服务调用方)这一端,因此我们根据SpringCloud组件:创建你的第一个Feign客户端文章,改动tairan-spring-cloud-feign-api
和tairan-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修改
- 开启
Feign
对Hystrix
的支持,在application.yml
文件中添加如下配置:
feign:
# Dalston SR1(待定)之后的版本默认关闭hystrix对feign的支持,如果想要使用fallback功能这里必须启用
hystrix:
enabled: true
- 入口类修改
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);
}
}
运行测试
- 启动服务注册中心
tairan-spring-cloud-eureka
- 启动服务提供方
tairan-spring-cloud-feign-provider
- 启动服务消费方
tairan-spring-cloud-feign-consumer
- 访问
tairan-spring-cloud-feign-consumer
工程的/feign-hello
接口,链接:http://localhost:8080/feign-hello,查看访问结果- 关闭服务提供方
tairan-spring-cloud-feign-provider
- 访问
tairan-spring-cloud-feign-consumer
工程的/feign-hello
接口,链接:http://localhost:8080/feign-hello,查看访问结果
执行4操作后,访问链接http://localhost:8080/feign-hello后,接口返回结果如下所示:
执行5操作后,访问链接http://localhost:8080/feign-hello后,接口返回结果如下所示:
根据返回结果说明熔断成功。
源码位置
本章源码已经上传到淡若悠然
,请结合源码进行学习,感谢阅读。