# OpenFeign 使用 OkHttp 作为底层请求框架配置指南
## 项目概述
本项目是基于芋道云(yudao-cloud)的微服务架构项目,使用 Spring Cloud OpenFeign 进行服务间通信。本指南将详细说明如何将 OkHttp 配置为 OpenFeign 的底层 HTTP 客户端。
## 当前项目状态分析
### 1. 现有依赖配置
项目已经在 `yudao-framework/yudao-spring-boot-starter-rpc/pom.xml` 中包含了 `feign-okhttp` 依赖:
```xml
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
```
### 2. 现有 Feign 配置
项目中存在多个 RpcConfiguration 类,用于配置不同模块的 Feign 客户端:
- `yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/framework/rpc/config/RpcConfiguration.java`
- 其他各模块的 RpcConfiguration 类
## 配置步骤
### 步骤 1:创建 OkHttp 自定义配置类
在 `yudao-framework/yudao-spring-boot-starter-rpc` 模块中创建 OkHttp 自定义配置类:
**文件路径:** `yudao-framework/yudao-spring-boot-starter-rpc/src/main/java/cn/iocoder/yudao/framework/rpc/config/OkHttpCustomConfiguration.java`
```java
package cn.iocoder.yudao.framework.rpc.config;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.util.concurrent.TimeUnit;
/**
* OkHttp 自定义配置类
* 用于自定义 OpenFeign 的 OkHttp 客户端配置
*
* 注意:Spring Cloud OpenFeign 已经内置了 OkHttp 的自动配置,
* 这里只是提供自定义的 OkHttpClient Bean 来覆盖默认配置
*
* @author 芋道源码
*/
@Configuration
@ConditionalOnClass(OkHttpClient.class)
@ConditionalOnProperty(name = "spring.cloud.openfeign.okhttp.enabled", havingValue = "true", matchIfMissing = true)
public class OkHttpCustomConfiguration {
/**
* 自定义 OkHttpClient Bean
* 使用 @Primary 注解确保优先使用这个配置
*/
@Bean
@Primary
public OkHttpClient customOkHttpClient() {
return new OkHttpClient.Builder()
// 连接超时时间:10秒
.connectTimeout(10, TimeUnit.SECONDS)
// 读取超时时间:60秒
.readTimeout(60, TimeUnit.SECONDS)
// 写入超时时间:60秒
.writeTimeout(60, TimeUnit.SECONDS)
// 连接池配置
.connectionPool(new ConnectionPool(
10, // 最大空闲连接数
5, // 连接保持时间(分钟)
TimeUnit.MINUTES
))
// 重试配置
.retryOnConnectionFailure(true)
// 跟随重定向
.followRedirects(true)
.followSslRedirects(true)
.build();
}
}
```
### 步骤 2:创建 Feign 客户端扫描配置
**文件路径:** `yudao-framework/yudao-spring-boot-starter-rpc/src/main/java/cn/iocoder/yudao/framework/rpc/config/FeignClientScanConfiguration.java`
```java
package cn.iocoder.yudao.framework.rpc.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
/**
* Feign 客户端扫描配置
* 使用包扫描的方式自动发现和注册 Feign 客户端
*
* @author 芋道源码
*/
@Configuration
@ConditionalOnClass(name = "org.springframework.cloud.openfeign.FeignClient")
@EnableFeignClients(basePackages = {
"cn.iocoder.yudao.module.**.api", // 扫描所有模块的 api 包
"cn.iocoder.yudao.framework.**.api" // 扫描框架的 api 包
})
public class FeignClientScanConfiguration {
}
```
### 步骤 3:创建自动配置类
**文件路径:** `yudao-framework/yudao-spring-boot-starter-rpc/src/main/java/cn/iocoder/yudao/framework/rpc/config/YudaoRpcAutoConfiguration.java`
```java
package cn.iocoder.yudao.framework.rpc.config;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Import;
/**
* 芋道 RPC 自动配置类
* 自动配置 OpenFeign 和 OkHttp 相关组件
*
* @author 芋道源码
*/
@AutoConfiguration
@ConditionalOnClass(name = "org.springframework.cloud.openfeign.FeignClient")
@Import({OkHttpCustomConfiguration.class, FeignClientScanConfiguration.class})
public class YudaoRpcAutoConfiguration {
}
```
### 步骤 4:创建 Spring Boot 自动配置文件
**文件路径:** `yudao-framework/yudao-spring-boot-starter-rpc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`
```
cn.iocoder.yudao.framework.rpc.config.YudaoRpcAutoConfiguration
```
### 步骤 5:更新应用配置文件
在 `yudao-server/src/main/resources/application.yaml` 中添加 Feign OkHttp 配置:
```yaml
# Spring Cloud OpenFeign 配置
spring:
cloud:
openfeign:
okhttp:
enabled: true # 启用 OkHttp 作为底层 HTTP 客户端
client:
config:
default:
connect-timeout: 10000 # 连接超时时间(毫秒)
read-timeout: 60000 # 读取超时时间(毫秒)
logger-level: basic # 日志级别
httpclient:
hc5:
enabled: false # 禁用 Apache HttpClient 5
http2client:
enabled: false # 禁用 HTTP/2 客户端
```
### 步骤 6:添加 OkHttp 版本管理(可选)
在 `yudao-dependencies/pom.xml` 中添加 OkHttp 版本管理:
```xml
<!-- OkHttp 相关 -->
<okhttp.version>4.12.0</okhttp.version>
```
并在 dependencies 部分添加:
```xml
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp.version}</version>
</dependency>
```
## 配置说明
### 1. 自动配置生效条件
- `spring.cloud.openfeign.okhttp.enabled=true`(默认为 true)
- 项目中存在 `feign-okhttp` 依赖
- 项目中存在 `@FeignClient` 注解
- 不存在其他 HTTP 客户端(如 Apache HttpClient 5、HTTP/2 客户端)
### 2. 超时配置
- **连接超时**:10秒
- **读取超时**:60秒
- **写入超时**:60秒
### 3. 连接池配置
- **最大空闲连接数**:10
- **连接保持时间**:5分钟
- **重试机制**:启用
### 4. 日志配置
- **日志级别**:basic(记录请求方法、URL、响应状态码和执行时间)
## 验证配置
### 1. 启动应用
启动 `yudao-server` 应用,查看控制台日志,确认 OkHttp 配置生效。
### 2. 测试 Feign 调用
通过现有的 Feign 客户端接口进行测试,例如:
- `AdminUserApi`
- `FileApi`
- `ConfigApi`
### 3. 监控连接
可以通过 Spring Boot Actuator 监控 HTTP 连接池状态。
## 注意事项
1. **依赖冲突**:确保项目中不存在其他 HTTP 客户端依赖冲突
2. **性能调优**:根据实际业务需求调整连接池和超时参数
3. **日志监控**:建议在生产环境中调整日志级别为 `none` 或 `headers`
4. **版本兼容**:确保 OkHttp 版本与 Spring Cloud OpenFeign 版本兼容
## 故障排除
### 1. 配置不生效
- 检查 `spring.cloud.openfeign.okhttp.enabled` 配置
- 确认 `feign-okhttp` 依赖已正确引入
- 检查是否启用了其他 HTTP 客户端(如 Apache HttpClient 5)
- 查看自动配置类是否正确加载
### 2. 连接超时
- 调整 `connect-timeout` 和 `read-timeout` 参数
- 检查网络连接状态
- 查看目标服务是否正常运行
### 3. 性能问题
- 调整连接池参数
- 监控连接使用情况
- 考虑使用连接复用
## 重要说明
### 1. Spring Cloud OpenFeign 内置支持
Spring Cloud OpenFeign 已经内置了 OkHttp 的自动配置支持,我们只需要:
- 启用 OkHttp 配置:`spring.cloud.openfeign.okhttp.enabled=true`
- 禁用其他 HTTP 客户端(如 Apache HttpClient 5)
- 提供自定义的 OkHttpClient Bean(可选)
### 2. 包扫描方式
使用 `@EnableFeignClients(basePackages = {...})` 进行包扫描,自动发现所有 `@FeignClient` 注解的接口,无需手动指定每个客户端类。
### 3. 配置优先级
- Spring Cloud OpenFeign 的自动配置优先级最高
- 我们的自定义 OkHttpClient Bean 使用 `@Primary` 注解确保优先使用
- 应用配置文件中的参数会覆盖代码中的默认值
## 总结
通过以上配置,项目将使用 OkHttp 作为 OpenFeign 的底层 HTTP 客户端,提供更好的性能和更灵活的配置选项。配置完成后,所有现有的 Feign 客户端将自动使用 OkHttp 进行 HTTP 请求,无需修改现有的 Feign 接口代码。