首先在pom文件中添加坐标。
<!-- openfeign坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Hystrix坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
接着, 在启动类上使用 @ EnableHystrix 激活Hystrix , 使用@EnableFeignClients激活openFeign
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients //开启openFeign
@EnableHystrix //开启Hystrix
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class , args);
}
}
配置application.yml , 控制消费者向注册中心发送拉取服务的时间间隔。 控制feign支持请求传输的文本压缩。
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/ #注册中心地址
register-with-eureka: false #是否将自己注册到注册中心, 默认是true
registry-fetch-interval-seconds: 10 #表示Erueka Client 间隔多久去服务器拉取注册信息 , 默认30秒
server:
port: 9090
spring:
application:
name: consumer-server
#feign请求支持文本压缩传输
feign:
compression:
request:
enable: true
mime-types: text/xml,application/xml,application/json
min-request-size: 2048
response:
enable: true
useGzipDecoder: true
hystrix:
enabled: true
新建IFeignProvider包,包中定义发送请求的接口。
package com.consumer.FeignInterface;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
//绑定 消费者的服务名称
@FeignClient(value = "PROVIDER-SERVER" , fallback = IFeignProvider.HystrixClientFallback.class )
public interface IFeignProvider {
//请求PROVIDER-SERVER服务提供者的getInfo()方法
@RequestMapping(method = RequestMethod.GET , value = "/providerServer/demo/privider")
public String getProviderInfo();
//使用托底方法时,必须要将方法实现@Bean 或者 @Component
@Component
static class HystrixClientFallback implements IFeignProvider {
@Override
public String getProviderInfo()
{
return "这是一个托底方法,无法发送合格的响应时返回托底方法的数据。";
}
}
}
在这里, @FeignClient中value指定的服务名称必须在注册中心中存在并且有心跳, 如果注册中心中该服务被保护起来, 则项目无法启动, 会报错:无法连接到PROVIDER-SERVER 服务。 托底方法由HystrixClientFallback类来实现, HystrixClientFallback类继承了IFeignProvider接口,意味着HystrixClientFallback类必须实现IFeignProvider接口的所有方法。
就是说, 托底类中必须对接口的每个方法都进行托底数据的处理。 最重要的, 官网上一笔带过的一句话: 托底类必须被@Bean注解。 这个很重要,不然会报错。后者也可以使用@Component注解,总之托底类一定要交给spring管理。
最后写Controller层。示例代码如下:
package com.consumer.controller;
import com.consumer.FeignInterface.IFeignProvider;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("feign")
public class FeignController {
@Autowired
IFeignProvider iFeignProvider;
// @HystrixCommand(fallbackMethod = "getDefaultInfo")
@GetMapping("/getInfo")
public String getInfo()
{
String str = iFeignProvider.getProviderInfo();
System.out.println(str + " ----------------------------------------- ");
return str;
}
public String getDefaultInfo()
{
return "由fallbackMethod指定的托底方法";
}
}
第一次,项目所依赖的服务启动, 请求该接口, 返回数据正常。
第二次, 关掉项目依赖的服务, 请求该接口, 返回托底数据。
如果不进行托底配置, 当服务挂掉的情况下, 会报错请求超时。