Feign简介

相比RestTemplate,Feign是更好更方便的远程访问工具。

一,基本使用

加依赖

<!-- eureka客户端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Feign依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

按开关

在入口类上添加注解:

@EnableFeignClients

添加配置

如果没有添加eureka配置的需要添加此配置:

eureka:
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka/

代码

//调用方接口定义
//这里的name="house"表示被调用方的服务名称
@FeignClient(name="house", path = "house", fallback = HouseFeignServiceFallback.class)
public interface HouseFeignService {

    @GetMapping("/{id}")
    public House getHouse(@PathVariable int id);

}

//被调用方代码
@RestController
@RequestMapping("/house")
public class HouseWithReqMappingController {

    @GetMapping("/{id}")
    public House getHouse(@PathVariable int id) {
        System.out.println("======================");
        House house = new House();
        house.setId(1);
        house.setName("房屋with_mapping");
        return house;
    }
}

两者之间的对应关系如下图中红色标识: 调用和被调用放配置关系

二,负载均衡

负载均衡使用ribbon来实现,所以修改负载均衡和上一节ribbon的修改方法一样。

//注意,需要放在被@Configuration修饰的类中
@Bean
public IRule myRule() {
    return new RandomRule();
}

三,Feign的服务降级

Feign也支持服务降级,本质上它就是使用上节课学习的Hystrix来实现的。

修改Feign接口

添加降级类,降级类会在发生异常时接管处理。

@FeignClient(name="house", fallback = HouseFeignServiceFallback.class)

新建降级fallback类

降级类要实现上面定义的接口,并实现降级方法,另外注意在降级类上添加@Service注解,以纳入spring管理

@Service
public class OrderServiceCallback implements OrderServiceFeign{
    @Override
    public Integer getOrderNumberOfUser(Long id) {
        return 22;
    }

    @Override
    public Map postOrderNumberOfUser(Long id) {
        Map result = new HashMap();
        result.put("number",23);

        return result;
    }
}

改配置

因为feign也是使用hystrix实现的降级,且默认没有打开降级支持,所以这里需要打开hystrix功能:

feign:
  hystrix:
    enabled: true

四,打开日志

打开Feign调用日志,方便查找问题。

//注意,需要放在被@Configuration修饰的类中
@Bean
Logger.Level feignLogLevel() {
    return Logger.Level.FULL;
}

同时,需要配置yml文件中的日志等级。

logging:
  level:
    org.example.service: debug

五,常用配置

压缩

客户端

feign:
  hystrix:
    enabled: true
  compression:
    response:
      enabled: true
    request:
      enabled: true
      min-request-size: 2048  # 超过2M则进行压缩

超时配置

在Feign配置超时时,真正的超时降级受两个地方的配置约束:

feign:
  client:
    config:
      default:
        read-timeout: 10000   # feign配置的读超时配置
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 30000   #hystrix配置的超时配置