一、Spring Cloud OpenFeign简介

OpenFeign是一个声明式、模板化的HTTP客户端。它使得写Http客户端变得更简单。使用Feign,只需要用JAX-RS或Spring MVC注解创建可以实现的动态接口。

微服务之间的调用本质还是http请求,如果对于每个请求都需要写请求代码,增加请求参数,同时对请求结果做处理,就会存在大量重复工作,而feign非常优雅的帮助我们解决了这个问题,只需要定义一个interface,fegin就知道http请求的时候参数应该如何设置。

同时,feign也集成了ribbon,只要在微服务中依赖了ribbon,feign默认会使用ribbon定义的负载均衡策略。

最重要的是,feign并不是仅仅只能使用在有eureka或者ribbon的微服务系统中,任何系统中,只要涉及到http调用第三方服务,都可以使用feign,帮我们解决http请求的代码重复编写。

二、准备工作

依赖
创建一个feign-service模块,并添加相关依赖:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

配置

server:
  port: 8501
spring:
  application:
    name: feign-service
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8001/eureka/
feign:
  hystrix:
    enabled: true

在启动类中添加@EnableFeignClients注解,以启用feign进行远程调用:

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class FeignServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignServiceApplication.class, args);
    }
}

三、启动Feign客户服务端

在feign-service模块中添加一个TestService,添加@FeignClient注解

@FeignClient(value = "eureka-client", fallback = TestFallbackService.class)
public interface TestService {
    @GetMapping("/test/test")
    Object test();
}

@FeignClient 的常用参数:

  • value 对应要调用的服务名称
  • fallback 服务调用失败时的回调

同时为其成员方法添加SpringMvc注解,指定要请求的接口路径,这里test方法的效果跟 restTemplate.getForObject("http://eureka-client/test/test", Object.class) 类似

注意到fallback参数指定了TestFallbackService作为其失败时的回调,我们创建一个TestFallbackService实现TestService即可:

@Component
public class TestFallbackService implements TestService {
    @Override
    public Object test() {
        Map<String, Object> map = new HashMap<>();
        map.put("code", "-1");
        map.put("message", "failed");
        map.put("data", "");
        return map;
    }
}

在控制器中调用:

@RestController
@RequestMapping("/test")
public class TestController {
    @Autowired
    private TestService testService;

    @GetMapping("/test")
    public Object test() {
        return testService.test();
    }
}

访问路径:http://localhost:8501/test/test

  • 负载均衡测试:启动eureka-service,feign-service,和两个eureka-client服务,可测试其负载均衡
  • 服务降级测试:只启动eureka-service和feign-service,就可以测试其服务降级

四、日志打印

Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节。

日志级别:

  • NONE 默认的,不显示任何日志;
  • BASIC 仅记录请求方法、URL、响应状态码及执行时间;
  • HEADERS 除了BASIC中定义的信息之外,还有请求和响应的头信息;
  • FULL 除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。

添加Feign的日志配置:

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

配置TestService的日志级别为debug:

logging:
  level:
    com.example.cloud.service.TestService: debug

五、Feign的常用配置

feign:
  hystrix:
    enabled: true #在Feign中开启Hystrix断路器
  compression:
    request:
      enabled: false #是否对请求进行GZIP压缩
      mime-types: text/xml,application/xml,application/json #指定压缩的请求数据类型
      min-request-size: 2048 #超过该大小的请求会被压缩
    response:
      enabled: false #是否对响应进行GZIP压缩
logging:
  level: #修改日志级别
    com.example.cloud.service.UserService: debug
  • Feign中的Ribbon配置:在Feign中配置Ribbon可以直接使用Ribbon的配置。
  • Feign中的Hystrix配置:在Feign中配置Hystrix可以直接使用Hystrix的配置。

参考资料