Cpte-Boot/cpte-wms-service/LOCAL_DEV_FEIGN_CONFIG.md

7.0 KiB
Raw Blame History

本地开发环境 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 配置优先级如下:

  1. 配置文件指定(最高优先级)

    feign.client.wms-basic.url: http://localhost:8001
    
  2. @FeignClient 注解的 url 属性默认值

    @FeignClient(
        name = "wms-basic-service",
        url = "${feign.client.wms-basic.url:http://wms-basic-service:80}"
    )
    
  3. 服务发现(如果使用了 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 调用了!🎊