7.0 KiB
本地开发环境 Feign 配置指南
📋 问题描述
在本地开发环境测试时,Feign Client 调用失败,报错:
Couldn't resolve host: wms-basic-service
🔍 原因分析
K8s Service 名称无法在本地解析
wms-basic-service是 Kubernetes Service 的名称- 这个名称只能在 K8s 集群内部通过 CoreDNS 解析
- 本地开发环境(localhost)无法解析 K8s 服务名
✅ 解决方案
方案一:配置本地服务地址(推荐)
1. 修改 application-dev.yml
在入库服务的 application-dev.yml 中已添加 Feign 配置:
# Feign 客户端配置(本地开发环境使用 localhost)
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 10000
loggerLevel: BASIC
# 本地开发环境服务地址配置
wms-basic:
url: http://localhost:8001
wms-inventory:
url: http://localhost:8004
wms-schedule:
url: http://localhost:8005
2. 启动所有需要的服务
确保以下服务已在本地启动:
# 基础服务 - 端口 8001
cpte-wms-service/cpte-wms-basic-service
# 入库服务 - 端口 8002
cpte-wms-service/cpte-wms-inbound-service
# 出库服务 - 端口 8003
cpte-wms-service/cpte-wms-outbound-service
# 库存服务 - 端口 8004
cpte-wms-service/cpte-wms-inventory-service
# 调度服务 - 端口 8005
cpte-wms-service/cpte-wms-schedule-service
3. 测试 Feign 调用
现在可以通过 Feign Client 正常调用其他服务了:
@Autowired
private BasicServiceClient basicServiceClient;
// 调用基础服务
Result<Map<String, Object>> result = basicServiceClient.getItemById("item123");
方案二:使用 Host 文件映射(不推荐)
修改本地 Host 文件,将 K8s 服务名映射到 localhost:
Windows: C:\Windows\System32\drivers\etc\hosts
Linux/Mac: /etc/hosts
127.0.0.1 wms-basic-service
127.0.0.1 wms-inventory-service
127.0.0.1 wms-schedule-service
缺点:
- 需要修改系统文件,可能需要管理员权限
- 所有服务都映射到 localhost,无法区分不同服务
- 不便于多环境管理
🎯 Feign Client 配置说明
配置优先级
Feign Client 的 URL 配置优先级如下:
-
配置文件指定(最高优先级)
feign.client.wms-basic.url: http://localhost:8001 -
@FeignClient 注解的 url 属性默认值
@FeignClient( name = "wms-basic-service", url = "${feign.client.wms-basic.url:http://wms-basic-service:80}" ) -
服务发现(如果使用了 Nacos/Eureka)
- 通过服务名自动发现
环境隔离配置
开发环境 (application-dev.yml)
feign:
client:
wms-basic:
url: http://localhost:8001
wms-inventory:
url: http://localhost:8004
wms-schedule:
url: http://localhost:8005
测试环境 (application-test.yml)
feign:
client:
wms-basic:
url: http://test-wms-basic:80
wms-inventory:
url: http://test-wms-inventory:80
wms-schedule:
url: http://test-wms-schedule:80
生产环境/K8s (application-k8s.yml)
feign:
client:
# 不配置 url,使用 K8s Service 名称(通过 CoreDNS 解析)
wms-basic:
# 默认值:http://wms-basic-service:80
wms-inventory:
# 默认值:http://wms-inventory-service:80
wms-schedule:
# 默认值:http://wms-schedule-service:80
🧪 测试方法
1. 使用 Swagger/Knife4j 测试
启动入库服务后,访问:
http://localhost:8002/doc.html
找到 Feign 调用相关的接口进行测试。
2. 使用 Postman 测试
# 调用入库服务接口
POST http://localhost:8002/api/wms/inbound/test
# 请求体
{
"itemId": "item123",
"quantity": 100
}
3. 使用 curl 测试
curl -X POST http://localhost:8002/api/wms/inbound/test \
-H "Content-Type: application/json" \
-d '{"itemId":"item123","quantity":100}'
4. 查看 Feign 日志
配置日志级别查看 Feign 调用详情:
logging:
level:
org.cpte.feign.client: DEBUG
feign: DEBUG
日志输出示例:
DEBUG: [BasicServiceClient] ---> GET http://localhost:8001/api/wms/basic/item/item123
DEBUG: [BasicServiceClient] <--- 200 OK (150ms)
DEBUG: [BasicServiceClient] {"code":200,"message":"success","result":{...}}
⚠️ 常见问题
Q1: Connection refused
错误: ConnectException: Connection refused
原因: 目标服务未启动
解决:
# 检查服务是否启动
netstat -an | grep 8001
# 启动基础服务
cd cpte-wms-service/cpte-wms-basic-service
mvn spring-boot:run
Q2: Read timed out
错误: ReadTimeoutException: Read timed out
原因: 服务响应超时
解决: 增加超时时间
feign:
client:
config:
default:
connectTimeout: 10000 # 连接超时 10 秒
readTimeout: 30000 # 读取超时 30 秒
Q3: Couldn't resolve host
错误: UnknownHostException: Couldn't resolve host
原因: 服务地址配置错误
解决: 检查配置文件中的 URL 是否正确
feign:
client:
wms-basic:
url: http://localhost:8001 # 确保地址和端口正确
📊 服务端口列表
| 服务名称 | 端口 | 说明 |
|---|---|---|
| wms-basic-service | 8001 | 基础服务 |
| wms-inbound-service | 8002 | 入库服务 |
| wms-outbound-service | 8003 | 出库服务 |
| wms-inventory-service | 8004 | 库存服务 |
| wms-schedule-service | 8005 | 调度服务 |
🚀 快速开始
1. 启动所有服务
# 终端 1 - 基础服务
cd cpte-wms-service/cpte-wms-basic-service
mvn spring-boot:run
# 终端 2 - 入库服务
cd cpte-wms-service/cpte-wms-inbound-service
mvn spring-boot:run
# 终端 3 - 库存服务
cd cpte-wms-service/cpte-wms-inventory-service
mvn spring-boot:run
# 终端 4 - 调度服务
cd cpte-wms-service/cpte-wms-schedule-service
mvn spring-boot:run
2. 访问 Swagger 文档
基础服务:http://localhost:8001/doc.html
入库服务:http://localhost:8002/doc.html
出库服务:http://localhost:8003/doc.html
库存服务:http://localhost:8004/doc.html
调度服务:http://localhost:8005/doc.html
3. 测试 Feign 调用
在入库服务的 Swagger 中测试调用基础服务的接口。
📖 相关文档
🎉 总结
✅ 本地开发环境:使用 localhost + 端口号配置 Feign Client URL
✅ K8s 环境:使用 K8s Service 名称(通过 CoreDNS 自动解析)
✅ 配置隔离:通过不同环境的配置文件(dev/test/k8s)实现环境隔离
✅ 灵活切换:通过配置文件即可切换不同环境,无需修改代码
现在可以在本地正常测试 Feign 调用了!🎊