# Knife4j Doc Starter 使用说明
基于 Knife4j 4.x + OpenAPI 3 规范的接口文档增强解决方案。
## 特性
- 基于 OpenAPI 3 规范
- 支持 Spring Cloud Gateway 网关聚合文档
- 支持 JWT 等安全认证配置
- 支持接口分组管理
- 支持中文界面
- 支持配置文件管理服务列表
## 快速开始
### 1. 微服务中使用
在需要暴露 API 文档的微服务的 `pom.xml` 中添加依赖:
```xml
cn.hfln.framework
knife4j-doc-spring-boot-starter
${project.version}
```
在 `application.yml` 中添加配置:
```yaml
lnxx:
knife4j:
doc:
enable: true
base-package: com.your.package # 接口所在包路径
title: 服务名称
description: 服务描述
version: ${project.version}
enable-security: true # 是否启用安全认证
```
### 2. Gateway 网关中使用
#### 2.1 添加依赖
在网关项目的 `pom.xml` 中添加依赖:
```xml
cn.hfln.framework
knife4j-doc-spring-boot-starter
${project.version}
```
#### 2.2 网关配置
在网关的 `application.yml` 中添加如下配置:
```yaml
lnxx:
knife4j:
doc:
# 基础配置
enable: false # 禁用普通模式
title: "微服务 API 文档聚合"
description: "统一管理所有微服务的 API 文档"
version: "1.0.0"
# 网关配置
gateway:
enable: true # 启用网关模式
services: # 配置需要聚合的服务列表
# 用户服务
- name: "用户服务"
url: "/v3/api-docs" # 注意:这里不需要服务名称前缀
description: "用户注册、登录、权限管理等相关接口"
# 订单服务
- name: "订单服务"
url: "/v3/api-docs" # 注意:这里不需要服务名称前缀
description: "订单创建、查询、状态管理等相关接口"
# 商品服务
- name: "商品服务"
url: "/v3/api-docs" # 注意:这里不需要服务名称前缀
description: "商品信息、库存、分类管理等相关接口"
# 支付服务
- name: "支付服务"
url: "/v3/api-docs" # 注意:这里不需要服务名称前缀
description: "支付处理、退款、对账等相关接口"
# 通知服务
- name: "通知服务"
url: "/v3/api-docs" # 注意:这里不需要服务名称前缀
description: "短信、邮件、推送通知等相关接口"
```
#### 2.3 网关路由配置
确保网关能正确路由到各个微服务,**关键是要配置 StripPrefix 过滤器**:
```yaml
spring:
cloud:
gateway:
routes:
# 用户服务路由
- id: user-service
uri: lb://user-service
predicates:
- Path=/user-service/**
filters:
- StripPrefix=1 # 移除路径前缀,将 /user-service/v3/api-docs 转换为 /v3/api-docs
# 订单服务路由
- id: order-service
uri: lb://order-service
predicates:
- Path=/order-service/**
filters:
- StripPrefix=1 # 移除路径前缀
# 商品服务路由
- id: product-service
uri: lb://product-service
predicates:
- Path=/product-service/**
filters:
- StripPrefix=1 # 移除路径前缀
# 支付服务路由
- id: payment-service
uri: lb://payment-service
predicates:
- Path=/payment-service/**
filters:
- StripPrefix=1 # 移除路径前缀
# 通知服务路由
- id: notification-service
uri: lb://notification-service
predicates:
- Path=/notification-service/**
filters:
- StripPrefix=1 # 移除路径前缀
```
### 3. 访问文档
- 单个服务文档地址:`http://服务地址:端口/doc.html`
- 网关聚合文档地址:`http://网关地址:端口/swagger-ui/index.html`
- 网关 API 文档:`http://网关地址:端口/v3/api-docs/swagger-config`
## 配置说明
### 微服务配置
| 配置项 | 说明 | 默认值 |
|-------|------|--------|
| lnxx.knife4j.doc.enable | 是否启用文档 | true |
| lnxx.knife4j.doc.base-package | 接口扫描包路径 | - |
| lnxx.knife4j.doc.title | 文档标题 | API 文档 |
| lnxx.knife4j.doc.description | 文档描述 | - |
| lnxx.knife4j.doc.version | 文档版本 | 1.0.0 |
| lnxx.knife4j.doc.enable-security | 是否启用安全认证 | false |
| lnxx.knife4j.doc.name | 联系方式姓名 | - |
| lnxx.knife4j.doc.url | 联系方式网站 | - |
| lnxx.knife4j.doc.email | 联系方式邮箱 | - |
### 网关配置
| 配置项 | 说明 | 默认值 |
|-------|------|--------|
| lnxx.knife4j.doc.gateway.enable | 是否启用网关模式 | false |
| lnxx.knife4j.doc.gateway.services | 需要聚合的服务列表 | - |
#### 服务配置参数
| 配置项 | 说明 | 必填 |
|-------|------|------|
| name | 服务名称 | 是 |
| url | 服务的 API 文档路径(不需要服务名称前缀) | 是 |
| description | 服务描述 | 否 |
## 路径配置说明
### 网关路由工作原理
1. **客户端请求**:`http://gateway:8080/user-service/v3/api-docs`
2. **网关路由**:匹配到 `user-service` 路由
3. **StripPrefix 过滤**:移除 `/user-service` 前缀
4. **转发请求**:`http://user-service:8081/v3/api-docs`
### 配置示例对比
#### ❌ 错误配置(会导致 404)
```yaml
# 网关路由配置
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user-service/**
filters:
- StripPrefix=1
# Swagger 聚合配置
lnxx:
knife4j:
doc:
gateway:
services:
- name: "用户服务"
url: "/user-service/v3/api-docs" # ❌ 错误:包含服务名称
```
#### ✅ 正确配置
```yaml
# 网关路由配置
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user-service/**
filters:
- StripPrefix=1
# Swagger 聚合配置
lnxx:
knife4j:
doc:
gateway:
services:
- name: "用户服务"
url: "/v3/api-docs" # ✅ 正确:不包含服务名称
```
## 动态配置
如果需要动态配置服务列表,可以:
### 1. 从注册中心动态获取
```java
@Autowired
private DiscoveryClient discoveryClient;
private List buildServiceUrls() {
List serviceUrls = new ArrayList<>();
discoveryClient.getServices().forEach(serviceId -> {
serviceUrls.add(new ServiceUrl(
serviceId + "服务",
"/v3/api-docs", // 注意:这里不需要服务名称前缀
serviceId + "相关接口"
));
});
return serviceUrls;
}
```
### 2. 从数据库配置
```java
@Autowired
private ServiceConfigRepository repository;
private List buildServiceUrls() {
return repository.findAll().stream()
.map(config -> new ServiceUrl(
config.getName(),
"/v3/api-docs", // 注意:这里不需要服务名称前缀
config.getDescription()
))
.collect(Collectors.toList());
}
```
## 注意事项
1. **网关模式与普通模式不能同时启用**
2. **确保网关能正确路由到各个微服务**
3. **各个微服务需要单独配置 Knife4j 文档功能**
4. **网关中的配置主要用于聚合,不生成自己的 API 文档**
5. **服务 URL 路径不需要包含服务名称前缀**
6. **网关路由必须配置 StripPrefix 过滤器**
7. **建议在生产环境关闭或限制文档访问**
## 常见问题
### 1. 文档无法访问
- 检查服务是否正常启动
- 检查网关路由配置是否正确
- 检查安全认证配置
### 2. 网关聚合失败(404 错误)
- 检查微服务的文档地址是否可访问
- 检查网关路由配置是否正确
- 检查网络连通性
- 检查服务列表配置是否正确
- **检查是否配置了 StripPrefix 过滤器**
- **检查服务 URL 是否包含服务名称前缀**
### 3. 认证失败
- 检查认证配置是否正确
- 确认 Token 格式是否正确
- 检查认证服务是否正常
### 4. 服务列表为空
- 检查配置文件中的服务配置是否正确
- 检查网关模式是否已启用
- 检查服务 URL 路径是否正确
### 5. 静态资源无法加载
- 检查 webjars 依赖是否正确引入
- 检查资源路径配置是否正确
## 版本说明
- 基于 Knife4j 4.x
- 支持 Spring Boot 2.6.x 及以上版本
- 支持 Spring Cloud 2021.x 及以上版本
- 支持 OpenAPI 3 规范
## 示例项目
完整的配置示例可以参考 `application-gateway.yml` 文件。