Spring Cloud(Dalston.SR5)--Feign 与 Hystrix 断路器整合
- 创建项目
要使 Feign 与 Hystrix 进行整合,我们需要增加 Feign 和 Hystrix 的依赖,修改 POM.xml 中增加以下依赖项如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.lixue</groupId>
<artifactId>spring-cloud-hystrix-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-cloud-hystrix-client</name>
<description>DemoprojectforSpringBoot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/><!--lookupparentfromrepository-->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 增加配置
还需要在 src/main/resources/application.yml 中,开启 Feign 的配置,如下:
#配置应用名称
spring:
application:
name:spring-cloud-hystrix-client
#服务端口
server:
port:8077
#启用feign的hystrix支持
feign:
hystrix:
enabled:true
#设置eureka服务注册中心的地址,如果多个以逗号分割
eureka:
client:
service-url:
defaultZone:http://eurekaserver01:9000/eureka/,http://eurekaserver02:9000/eureka/
- 创建 Feign 客户端
创建 Feign 客户端接口,增加回退的类实现,在 @FeignClient 注解中,设置 fallback 属性,如下:
package org.lixue;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name="HELLOWORLD-PROVIDER",fallback=HelloWorldFeignClient.HelloWorldFallback.class)
public interface HelloWorldFeignClient{
@RequestMapping(path="/speaks",method=RequestMethod.GET)
String speak(@RequestParam(name="names")Stringname);
@Component
class HelloWorldFallback implements HelloWorldFeignClient{
@Override
public String speak(String name){
return"speakfallbackisname="+name;
}
}
}
- 创建调用类
只需要使用 @Autowired 注解标注 HelloWorldFeignClient 实例进行自动注入,然后调用 HelloWorldFeignClient 实例的方法即完成调用,如下:
package org.lixue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@RestController
public class InvokerController{
@Autowired
private HelloWorldFeignClient helloWorldFeignClient;
@RequestMapping(method=RequestMethod.GET,path="/speakFeign")
public String speakFeign(@RequestParam("name")String name){
return helloWorldFeignClient.speak(name);
}
}
- 启动类
增加 @EnableCircuitBreaker 和 @EnableFeignClients 注解,启用 Feign 和 Hystrix 功能,如下:
package org.lixue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@EnableFeignClients
@ServletComponentScan
public class SpringCloudHystrixClientApplication{
public static void main(String[]args){
SpringApplication.run(SpringCloudHystrixClientApplication.class,args);
}
}
- 测试验证
由于我们使用了 Ribbon 因此首先启动 eureka-server 和 service-provider 服务,然后启动该项目,访问 http://localhost:8077/speak?name=abc 可以看到能正常返回信息,如下:
Hello World abc Port=8080
此时,关闭 service-provider 服务,然后在访问地址 http://localhost:8077/speak?name=abc 可以看到,由于服务已经不可用,因此执行了该方法的回退返回,返回如下:
speak fallback is name=abc
- 配置说明
Feign 与 Hystrix 整合使用时,会自动帮我们生成 CommandKey,格式为:Feign 客户端接口名称#方法名() ,生成的 GroupKey 为 @FeignClient 注解的 name 属性,例如,上面示例生成的 CommandKey 为 HelloWorldFeignClient#speak() ,Groupkey 为 HELLOWORLD-PROVIDER,如果需要针对该 Feign 客户端设置 Hystrix 的配置属性,在 application.yml 中增加配置如下:
#设置Hystrix的属性
hystrix:
command:
HelloWorldFeignClient#speak():
execution:
isolation:
thread:
timeoutInMilliseconds:200
如果需要设置默认全局属性,则修改 application.yml 配置如下:
#设置Hystrix的属性
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds:200