SpringCloud-OpenFeign

基本使用

依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

spring-cloud-starter-openfeign本身已经包含了Ribbon

启动配置
增加 @EnableFeignClients 注解

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

定义微服务接口

@Component
@FeignClient("PAYMENT-SERVICE")
public interface IUserService {

    @GetMapping("/provider/user/{id}")
    CommonResult<User> getById(@PathVariable("id") Long id);
}

@FeignClient指定接口对应的微服务
@GetMapping对应PAYMENT-SERVICE微服务具体controller接口

超时设置

OpenFeign默认等待1s,超时就报错

#设置 feign 客户端超时时间,单位毫秒,优先级比ribbon高
feign:
  client:
    config:
      default:
        readTimeout: 1000
        connectTimeout: 1000
      PAYMENT-SERVICE:
        readTimeout: 5000
        connectTimeout: 3000
#设置 ribbon 客户端超时时间,单位毫秒,默认1s
ribbon:
  ReadTimeout: 5000
  ConnectTimeout: 3000

两种设置方式,feign客户端设置优先级比ribbon高,如果通过ribbon设置的话需要注意大小写

feign客户端设置的时候,feign.client.config.xxx,其中xxx表示具体服务,对应 @FeignClient的name或者contextId

日志配置

设置Feign客户端的日志级别
在 OpenFeign(通常与 Spring Cloud 结合使用)中,日志级别的设置用于控制 Feign 客户端在请求/响应过程中的日志输出详细程度。Feign 支持 4 种日志级别,可根据业务需求灵活配置。以下是具体设置方法和步骤:

Feign 日志级别的类型

Feign 定义了 4 种日志级别(按输出详细程度从低到高排序):

级别 描述
NONE 无日志输出(默认值):不记录任何请求/响应信息。
BASIC 记录请求方法、URL、状态码和执行时间(基础信息)。
HEADERS BASIC 基础上,额外记录请求和响应的头信息(Headers)。
FULL 最详细日志:记录请求/响应的完整信息(方法、URL、头、参数、体等)。

一般配置

通过 Spring Boot 的配置文件(application.ymlapplication.properties),可以对所有 Feign 客户端统一设置日志级别。

1. 配置文件方式(推荐)

application.yml 中添加以下配置:

# 全局配置(所有 Feign 客户端)
feign:
  client:
    config:
      default:  # "default" 表示全局配置,也可替换为具体 Feign 客户端的名称(如 @FeignClient(name = "user-service") 中的 name)
        loggerLevel: full  # 可选值:none, basic, headers, full
  • 说明
    • default 表示对所有未显式指定配置的 Feign 客户端生效;若需针对某个具体客户端(如 user-service),可将 default 替换为客户端名称。
    • loggerLevel 控制日志级别,根据需求选择 full(最详细)或 headers(常用)等。

2. Java 配置类方式(全局配置)

若需要更细粒度的控制(如结合其他 Feign 配置),可通过 Java 配置类实现:

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
  • 注意:此配置需确保被 Spring 扫描到(如放在 @SpringBootApplication同级或子包下)。

针对指定微服务配置

若需为某个特定的 Feign 客户端单独设置日志级别(覆盖全局配置),可通过 @FeignClientconfiguration 属性指定自定义配置类。

步骤 1:定义指定服务专属配置类

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 专属配置类(可标注 @Configuration,但需避免被全局扫描重复加载)
public class UserFeignClientConfig {

    @Bean
    Logger.Level userFeignLoggerLevel() {
        return Logger.Level.HEADERS;  // 仅对当前客户端生效
    }
}

步骤 2:在 Feign 客户端接口中引用配置

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

// 通过 configuration 指定专属配置类
@FeignClient(
    name = "user-service", 
    url = "${user.service.url}", 
    configuration = UserFeignClientConfig.class  // 引入专属配置
)
public interface UserFeignClient {

    @GetMapping("/users/{id}")
    String getUserById(Long id);
}

验证日志输出

配置完成后,需确保日志框架(如 Logback、Log4j2)已正确输出 Feign 的日志。以下是关键验证步骤:

1. 检查日志框架配置

logback-spring.xml(或 log4j2-spring.xml)中,确保 Feign 相关包的日志级别设置为 DEBUG(Feign 日志通过 SLF4J 输出,底层需开启 DEBUG 级别):

<!-- logback-spring.xml 示例 -->
<configuration>
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 开启 Feign 客户端的 DEBUG 日志(关键!) -->
    <logger name="io.github.openfeign" level="DEBUG" />

    <!-- 根日志级别 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>
  • 说明name="io.github.openfeign" 对应 Feign 的包路径,设置 level="DEBUG" 确保日志输出。

2. 观察日志输出

启动应用并调用 Feign 客户端接口,控制台应输出类似以下日志(以 FULL 级别为例):

10:15:30.123 [http-nio-8080-exec-1] DEBUG feign.Client - [UserFeignClient#getUserById] ---> GET http://user-service/users/123 HTTP/1.1
10:15:30.125 [http-nio-8080-exec-1] DEBUG feign.Client - [UserFeignClient#getUserById] ---> END HTTP
10:15:30.234 [http-nio-8080-exec-1] DEBUG feign.Client - [UserFeignClient#getUserById] <--- HTTP/1.1 200 OK
10:15:30.235 [http-nio-8080-exec-1] DEBUG feign.Client - [UserFeignClient#getUserById] <--- Headers: [content-type:"application/json", ...]
10:15:30.236 [http-nio-8080-exec-1] DEBUG feign.Client - [UserFeignClient#getUserById] <--- Body: {"id":123,"name":"张三"...}

拦截器配置

定义拦截器

public class AuthRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("x-request-id", "ltia");
    }
}

如果加@Component 放入IOC容器就会自动注册拦截器,就不用@Bean处理了

注册拦截器

@Bean
public AuthRequestInterceptor authRequestInterceptor() {
    return new AuthRequestInterceptor();
}

检测效果:

[http-nio-80-exec-1] DEBUG m.y.s.s.service.IUserService - [IUserService#getById] ---> GET http://PAYMENT-SERVICE/provider/user/findById/1 HTTP/1.1
[http-nio-80-exec-1] DEBUG m.y.s.s.service.IUserService - [IUserService#getById] x-request-id: ltia
[http-nio-80-exec-1] DEBUG m.y.s.s.service.IUserService - [IUserService#getById] ---> END HTTP (0-byte body)
posted @ 2025-08-12 18:18  一只盐桔鸡  阅读(20)  评论(0)    收藏  举报