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.yml 或 application.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 客户端单独设置日志级别(覆盖全局配置),可通过 @FeignClient 的 configuration 属性指定自定义配置类。
步骤 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)

浙公网安备 33010602011771号