189 lines
6.1 KiB
Markdown
189 lines
6.1 KiB
Markdown
|
|
# Feign 启动错误修复说明
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
启动微服务时报错:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Field basicServiceClient in org.cpte.example.FeignServiceExample required a bean of type
|
|||
|
|
'org.cpte.feign.client.BasicServiceClient' that could not be found.
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 原因分析
|
|||
|
|
|
|||
|
|
这个错误是因为 Spring 容器无法找到 Feign Client 的 Bean。虽然我们创建了 Feign Client 接口,但是**没有在启动类上添加 `@EnableFeignClients` 注解**来启用 Feign 客户端扫描。
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
在所有微服务的启动类上添加 `@EnableFeignClients` 注解:
|
|||
|
|
|
|||
|
|
### 1. 入库服务 (WmsInboundApplication)
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@SpringBootApplication(scanBasePackages = {"org.jeecg", "org.cpte", "org.cpte.modules"})
|
|||
|
|
@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class})
|
|||
|
|
@ImportAutoConfiguration(JustAuthAutoConfiguration.class)
|
|||
|
|
@EnableFeignClients(basePackages = {"org.cpte.feign.client"}) // 新增这行
|
|||
|
|
public class WmsInboundApplication extends SpringBootServletInitializer {
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 基础服务 (WmsBasicApplication)
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@SpringBootApplication(scanBasePackages = {"org.jeecg","org.cpte","org.cpte.modules"})
|
|||
|
|
@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class})
|
|||
|
|
@ImportAutoConfiguration(JustAuthAutoConfiguration.class)
|
|||
|
|
@EnableFeignClients(basePackages = {"org.cpte.feign.client"}) // 新增这行
|
|||
|
|
public class WmsBasicApplication extends SpringBootServletInitializer {
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 出库服务 (WmsOutboundApplication)
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@SpringBootApplication(scanBasePackages = {"org.jeecg", "org.cpte", "org.cpte.modules"})
|
|||
|
|
@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class})
|
|||
|
|
@ImportAutoConfiguration(JustAuthAutoConfiguration.class)
|
|||
|
|
@EnableFeignClients(basePackages = {"org.cpte.feign.client"}) // 新增这行
|
|||
|
|
public class WmsOutboundApplication extends SpringBootServletInitializer {
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 库存服务 (WmsInventoryApplication)
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@SpringBootApplication(scanBasePackages = {"org.jeecg", "org.cpte", "org.cpte.modules"})
|
|||
|
|
@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class})
|
|||
|
|
@ImportAutoConfiguration(JustAuthAutoConfiguration.class)
|
|||
|
|
@EnableFeignClients(basePackages = {"org.cpte.feign.client"}) // 新增这行
|
|||
|
|
public class WmsInventoryApplication extends SpringBootServletInitializer {
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5. 调度服务 (WmsScheduleApplication)
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@SpringBootApplication(scanBasePackages = {"org.jeecg", "org.cpte", "org.cpte.modules"})
|
|||
|
|
@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class})
|
|||
|
|
@ImportAutoConfiguration(JustAuthAutoConfiguration.class)
|
|||
|
|
@EnableFeignClients(basePackages = {"org.cpte.feign.client"}) // 新增这行
|
|||
|
|
public class WmsScheduleApplication extends SpringBootServletInitializer {
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## @EnableFeignClients 说明
|
|||
|
|
|
|||
|
|
### 作用
|
|||
|
|
`@EnableFeignClients` 是 Spring Cloud OpenFeign 提供的注解,用于启用 Feign 客户端扫描。它会自动扫描指定包下的所有 Feign Client 接口,并为它们创建代理 Bean。
|
|||
|
|
|
|||
|
|
### 常用配置
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@EnableFeignClients(
|
|||
|
|
basePackages = {"org.cpte.feign.client"}, // 指定 Feign Client 所在的包
|
|||
|
|
defaultConfiguration = FeignClientConfiguration.class, // 默认配置类(可选)
|
|||
|
|
clients = { // 指定具体的 Feign Client(可选,不指定则扫描所有)
|
|||
|
|
BasicServiceClient.class,
|
|||
|
|
InventoryServiceClient.class,
|
|||
|
|
ScheduleServiceClient.class
|
|||
|
|
}
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 配置位置
|
|||
|
|
- **启动类上**:全局启用 Feign(推荐)
|
|||
|
|
- **配置类上**:局部启用 Feign
|
|||
|
|
|
|||
|
|
## 验证方法
|
|||
|
|
|
|||
|
|
启动服务后,查看日志确认 Feign Client 已成功注册:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看启动日志
|
|||
|
|
kubectl logs deployment/wms-inbound-service -n wms-system | grep -i feign
|
|||
|
|
|
|||
|
|
# 或者本地启动查看控制台输出
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
如果看到类似以下日志,说明 Feign Client 已成功注册:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
INFO: Created Feign client for interface: org.cpte.feign.client.BasicServiceClient
|
|||
|
|
INFO: Created Feign client for interface: org.cpte.feign.client.InventoryServiceClient
|
|||
|
|
INFO: Created Feign client for interface: org.cpte.feign.client.ScheduleServiceClient
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
### 1. 包扫描路径
|
|||
|
|
确保 `basePackages` 指定的包路径包含所有的 Feign Client 接口:
|
|||
|
|
- `org.cpte.feign.client.BasicServiceClient`
|
|||
|
|
- `org.cpte.feign.client.InventoryServiceClient`
|
|||
|
|
- `org.cpte.feign.client.ScheduleServiceClient`
|
|||
|
|
|
|||
|
|
### 2. 依赖配置
|
|||
|
|
确保 `pom.xml` 中已添加 OpenFeign 依赖:
|
|||
|
|
|
|||
|
|
```xml
|
|||
|
|
<dependency>
|
|||
|
|
<groupId>org.springframework.cloud</groupId>
|
|||
|
|
<artifactId>spring-cloud-starter-openfeign</artifactId>
|
|||
|
|
<version>4.1.3</version>
|
|||
|
|
</dependency>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 配置类
|
|||
|
|
建议创建 Feign 配置类来统一管理 Feign 的配置:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@Configuration
|
|||
|
|
public class FeignClientConfiguration {
|
|||
|
|
|
|||
|
|
@Bean
|
|||
|
|
public Logger.Level feignLoggerLevel() {
|
|||
|
|
return Logger.Level.BASIC;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Bean
|
|||
|
|
public Request.Options options() {
|
|||
|
|
return new Request.Options(5000, TimeUnit.MILLISECONDS,
|
|||
|
|
10000, TimeUnit.MILLISECONDS,
|
|||
|
|
true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. Fallback 降级
|
|||
|
|
为每个 Feign Client 配置 FallbackFactory,提高系统可用性:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@FeignClient(
|
|||
|
|
name = "wms-basic-service",
|
|||
|
|
url = "${feign.client.wms-basic.url:http://wms-basic-service:80}",
|
|||
|
|
fallbackFactory = BasicServiceFallbackFactory.class
|
|||
|
|
)
|
|||
|
|
public interface BasicServiceClient {
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 相关文件
|
|||
|
|
|
|||
|
|
- 入库服务启动类:`cpte-wms-service/cpte-wms-inbound-service/src/main/java/org/cpte/WmsInboundApplication.java`
|
|||
|
|
- 基础服务启动类:`cpte-wms-service/cpte-wms-basic-service/src/main/java/org/cpte/WmsBasicApplication.java`
|
|||
|
|
- 出库服务启动类:`cpte-wms-service/cpte-wms-outbound-service/src/main/java/org/cpte/WmsOutboundApplication.java`
|
|||
|
|
- 库存服务启动类:`cpte-wms-service/cpte-wms-inventory-service/src/main/java/org/cpte/WmsInventoryApplication.java`
|
|||
|
|
- 调度服务启动类:`cpte-wms-service/cpte-wms-schedule-service/src/main/java/org/cpte/WmsScheduleApplication.java`
|
|||
|
|
|
|||
|
|
## 参考文档
|
|||
|
|
|
|||
|
|
- [Feign 使用指南](cpte-wms-service/FEIGN_USAGE.md)
|
|||
|
|
- [K8s 部署文档](K8S_DEPLOYMENT.md)
|
|||
|
|
- [架构总览](ARCHITECTURE_OVERVIEW.md)
|