附录 A 各微服务完整 application.yml 配置汇总
A.1 使用说明
本附录用于集中查看 KnowHub 各个后端服务的 application.yml 配置。
需要特别注意:本附录给出的是"脱敏推荐版配置"。也就是说,配置结构基于当前真实项目整理,但数据库密码、JWT 密钥、AI API Key 等敏感内容都改成了环境变量占位形式。
不要把真实密码、真实 .env、真实 API Key 写进教材、README 或 Git 仓库。
推荐规则:
text
application.yml:只写环境变量占位和安全默认值
.env.example:只写示例值
.env:写本机真实值,但不提交 Git
生产环境:使用服务器环境变量、配置中心或密钥管理系统注入
A.2 Gateway:rag-gateway-service
Gateway 是外部统一入口,负责路由、JWT 鉴权、白名单和用户信息透传。
文件位置:
text
rag-gateway-service/src/main/resources/application.yml
脱敏推荐版:
yaml
server:
port: 9000
spring:
application:
name: rag-gateway-service
cloud:
nacos:
discovery:
server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
gateway:
server:
webflux:
routes:
- id: rag-auth-admin-service
uri: lb://rag-auth-service
predicates:
- Path=/admin/users,/admin/users/**
- id: rag-knowledge-admin-service
uri: lb://rag-knowledge-service
predicates:
- Path=/admin/knowledge-bases,/admin/knowledge-bases/**,/admin/documents,/admin/documents/**,/admin/qa-logs,/admin/qa-logs/**
- id: rag-task-admin-service
uri: lb://rag-task-service
predicates:
- Path=/admin/index-tasks,/admin/index-tasks/**
- id: rag-auth-service
uri: lb://rag-auth-service
predicates:
- Path=/auth/**,/auth-internal/**
filters:
- RewritePath=/auth-internal/(?<segment>.*), /internal/${segment}
- id: rag-knowledge-service
uri: lb://rag-knowledge-service
predicates:
- Path=/kb/**,/knowledge-internal/**
filters:
- RewritePath=/knowledge-internal/(?<segment>.*), /internal/${segment}
- id: rag-task-service
uri: lb://rag-task-service
predicates:
- Path=/tasks/**,/task-internal/**
filters:
- RewritePath=/task-internal/(?<segment>.*), /internal/${segment}
rag:
security:
jwt:
secret: ${RAG_JWT_SECRET:replace-with-long-random-secret}
issuer: ${RAG_JWT_ISSUER:rag-platform}
expire-duration: ${RAG_JWT_EXPIRE_DURATION:2h}
gateway:
auth:
enabled: ${RAG_GATEWAY_AUTH_ENABLED:true}
whitelist:
- /auth/register
- /auth/login
- /auth-internal/**
- /knowledge-internal/**
- /task-internal/**
- /doc.html
- /webjars/**
- /swagger-ui/**
- /v3/api-docs/**
- /favicon.ico
检查重点:
text
1. Gateway 端口固定为 9000。
2. /auth/** 转发到 auth-service。
3. /kb/** 转发到 knowledge-service。
4. /tasks/** 转发到 task-service。
5. /admin/** 分别转发到对应后端服务。
6. RAG_JWT_SECRET 生产环境必须替换。
A.3 认证服务:rag-auth-service
auth-service 负责注册、登录、JWT 签发、当前用户查询和后台用户管理。
文件位置:
text
rag-auth-service/src/main/resources/application.yml
脱敏推荐版:
yaml
server:
port: 9101
spring:
application:
name: rag-auth-service
datasource:
url: ${RAG_MYSQL_URL:jdbc:mysql://127.0.0.1:3306/rag_demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true}
username: ${RAG_MYSQL_USERNAME:root}
password: ${RAG_MYSQL_PASSWORD:change-me}
driver-class-name: com.mysql.cj.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
global-config:
banner: false
logging:
level:
com.luo.ragauth: info
knife4j:
enable: true
rag:
security:
jwt:
secret: ${RAG_JWT_SECRET:replace-with-long-random-secret}
issuer: ${RAG_JWT_ISSUER:rag-platform}
expire-duration: ${RAG_JWT_EXPIRE_DURATION:2h}
检查重点:
text
1. auth-service 端口为 9101。
2. 数据库连接走 RAG_MYSQL_URL。
3. 数据库密码必须走 RAG_MYSQL_PASSWORD。
4. JWT 配置要和 Gateway 保持一致。
5. 服务要注册到同一个 Nacos。
A.4 知识库服务:rag-knowledge-service
knowledge-service 是 KnowHub 中配置最多的服务,负责知识库、文档、切片、向量检索、RAG 问答、Redis 缓存、Sentinel 限流和 AI 降级。
文件位置:
text
rag-knowledge-service/src/main/resources/application.yml
脱敏推荐版:
yaml
server:
port: 9102
spring:
application:
name: rag-knowledge-service
# 排除不需要的 OpenAI 自动配置(仅保留 Chat 和 Embedding),减少启动时间和不必要的 Bean 创建
# 注意:以下类名基于 Spring AI 1.0.x 版本,升级到更高版本时需确认类名是否变化
# 如升级后类名变更导致启动失败,可临时删除此行排除,等确认新类名后再恢复
autoconfigure:
exclude:
- org.springframework.ai.model.openai.autoconfigure.OpenAiAudioSpeechAutoConfiguration
- org.springframework.ai.model.openai.autoconfigure.OpenAiAudioTranscriptionAutoConfiguration
- org.springframework.ai.model.openai.autoconfigure.OpenAiImageAutoConfiguration
- org.springframework.ai.model.openai.autoconfigure.OpenAiModerationAutoConfiguration
servlet:
multipart:
max-file-size: 20MB
max-request-size: 20MB
datasource:
url: ${RAG_MYSQL_URL:jdbc:mysql://127.0.0.1:3306/rag_demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true}
username: ${RAG_MYSQL_USERNAME:root}
password: ${RAG_MYSQL_PASSWORD:change-me}
driver-class-name: com.mysql.cj.jdbc.Driver
# knowledge-service 在文档上传成功后通过 RabbitTemplate 向 RabbitMQ 投递索引消息
# 详见第 9 章和第 22 章。
rabbitmq:
host: ${RABBITMQ_HOST:127.0.0.1}
port: ${RABBITMQ_PORT:5672}
username: ${RABBITMQ_USERNAME:knowhub}
password: ${RABBITMQ_PASSWORD:change-me}
listener:
simple:
prefetch: 1
retry:
enabled: false
data:
redis:
host: ${RAG_REDIS_HOST:127.0.0.1}
port: ${RAG_REDIS_PORT:6379}
password: ${RAG_REDIS_PASSWORD:}
database: ${RAG_REDIS_DATABASE:0}
cloud:
nacos:
discovery:
server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
ai:
openai:
api-key: ${OPENAI_CHAT_API_KEY:replace-with-your-chat-key}
base-url: ${OPENAI_CHAT_BASE_URL:https://api.example.com}
chat:
api-key: ${OPENAI_CHAT_API_KEY:replace-with-your-chat-key}
base-url: ${OPENAI_CHAT_BASE_URL:https://api.example.com}
options:
model: ${OPENAI_CHAT_MODEL:replace-with-chat-model}
temperature: ${OPENAI_CHAT_TEMPERATURE:0.2}
embedding:
api-key: ${OPENAI_EMBEDDING_API_KEY:replace-with-your-embedding-key}
base-url: ${OPENAI_EMBEDDING_BASE_URL:https://embedding.example.com}
options:
model: ${OPENAI_EMBEDDING_MODEL:text-embedding-v4}
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
global-config:
banner: false
# Feign 用于 knowledge-service 调用 task-service(创建索引任务、查询任务状态、重试任务)
# 不涉及跨知识库的数据查询,仅用于任务管理相关的 RPC 调用
feign:
client:
config:
default:
connect-timeout: 3000
read-timeout: 5000
logging:
level:
com.luo.ragknowledge: info
knife4j:
enable: true
rag:
# rag.mq 配置必须和 task-service 中的同名配置一致。
# 如果 exchange/queue/routing-key 不一致,索引任务将永远处于 WAITING 状态。
mq:
index-exchange: ${RAG_MQ_INDEX_EXCHANGE:rag.index.exchange}
index-queue: ${RAG_MQ_INDEX_QUEUE:rag.index.queue}
index-routing-key: ${RAG_MQ_INDEX_ROUTING_KEY:rag.index.document}
storage:
local-dir: ${RAG_STORAGE_LOCAL_DIR:D:/rag/rag-platform/uploads}
max-file-size: ${RAG_STORAGE_MAX_FILE_SIZE:20MB}
chunking:
max-length: ${RAG_CHUNKING_MAX_LENGTH:800}
overlap-length: ${RAG_CHUNKING_OVERLAP_LENGTH:120}
vector:
enabled: ${RAG_VECTOR_ENABLED:true}
url: ${RAG_VECTOR_URL:jdbc:postgresql://127.0.0.1:5432/rag_vector}
username: ${RAG_VECTOR_USERNAME:postgres}
password: ${RAG_VECTOR_PASSWORD:change-me}
driver-class-name: org.postgresql.Driver
dimension: ${RAG_VECTOR_DIMENSION:1024}
top-k: ${RAG_VECTOR_TOP_K:5}
similarity-threshold: ${RAG_VECTOR_SIMILARITY_THRESHOLD:0.30}
task:
lock:
enabled: ${RAG_INDEX_TASK_LOCK_ENABLED:false}
key-prefix: ${RAG_INDEX_TASK_LOCK_KEY_PREFIX:rag:index-task:lock:}
ttl: ${RAG_INDEX_TASK_LOCK_TTL:30m}
status-cache:
enabled: ${RAG_DOCUMENT_INDEX_TASK_CACHE_ENABLED:true}
key-prefix: ${RAG_DOCUMENT_INDEX_TASK_CACHE_KEY_PREFIX:rag:document:index-task:}
ttl: ${RAG_DOCUMENT_INDEX_TASK_CACHE_TTL:1m}
ai:
chat:
fallback:
enabled: ${RAG_AI_CHAT_FALLBACK_ENABLED:true}
timeout: ${RAG_AI_CHAT_FALLBACK_TIMEOUT:5s}
answer: ${RAG_AI_CHAT_FALLBACK_ANSWER:当前 AI 服务暂时不可用,请稍后重试。}
sentinel:
chat-flow:
enabled: ${RAG_SENTINEL_CHAT_FLOW_ENABLED:true}
resource: ${RAG_SENTINEL_CHAT_FLOW_RESOURCE:knowledgeChat}
qps: ${RAG_SENTINEL_CHAT_FLOW_QPS:1}
kb:
owner-cache:
enabled: ${RAG_KB_OWNER_CACHE_ENABLED:true}
key-prefix: ${RAG_KB_OWNER_CACHE_KEY_PREFIX:rag:kb:owner:}
ttl: ${RAG_KB_OWNER_CACHE_TTL:30m}
检查重点:
text
1. knowledge-service 端口为 9102。
2. MySQL、Redis、Nacos、pgvector、AI 模型都要配置正确。
3. OPENAI_CHAT_API_KEY 和 OPENAI_EMBEDDING_API_KEY 不能硬编码。
4. RAG_VECTOR_DIMENSION 必须和 embedding 模型输出维度一致。
5. top-k 和 similarity-threshold 会影响检索结果。
6. Sentinel QPS 和 AI fallback timeout 会影响问答稳定性。
7. 当前本地存储路径仍通过 RAG_STORAGE_LOCAL_DIR 配置;成书版 MinIO 接入时应继续补 MinIO 客户端配置。
A.5 任务服务:rag-task-service
task-service 负责索引任务状态、重试入口和任务可靠性扫描。
文件位置:
text
rag-task-service/src/main/resources/application.yml
脱敏推荐版:
yaml
server:
port: 9103
spring:
application:
name: rag-task-service
datasource:
url: ${RAG_MYSQL_URL:jdbc:mysql://127.0.0.1:3306/rag_demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true}
username: ${RAG_MYSQL_USERNAME:root}
password: ${RAG_MYSQL_PASSWORD:change-me}
driver-class-name: com.mysql.cj.jdbc.Driver
rabbitmq:
host: ${RABBITMQ_HOST:127.0.0.1}
port: ${RABBITMQ_PORT:5672}
username: ${RABBITMQ_USERNAME:knowhub}
password: ${RABBITMQ_PASSWORD:change-me}
listener:
simple:
# 每次只取一条消息,处理完再取下一条,避免单个消费者堆积消息。
prefetch: 1
# 不做消息层自动重试,由索引任务状态机的 retry 机制统一管理。
retry:
enabled: false
data:
redis:
host: ${RAG_REDIS_HOST:127.0.0.1}
port: ${RAG_REDIS_PORT:6379}
password: ${RAG_REDIS_PASSWORD:}
database: ${RAG_REDIS_DATABASE:0}
cloud:
nacos:
discovery:
server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
global-config:
banner: false
knife4j:
enable: true
logging:
level:
com.luo.ragtask: info
rag:
# rag.mq 和 knowledge-service 中的同名配置必须一致,否则生产者投递的消息无法被消费者接收。
mq:
index-exchange: ${RAG_MQ_INDEX_EXCHANGE:rag.index.exchange}
index-queue: ${RAG_MQ_INDEX_QUEUE:rag.index.queue}
index-routing-key: ${RAG_MQ_INDEX_ROUTING_KEY:rag.index.document}
task:
# task-service 消费索引消息时,如开启 Redis 分布式锁,需要连接和 knowledge-service 相同的 Redis。
lock:
enabled: ${RAG_INDEX_TASK_LOCK_ENABLED:false}
key-prefix: ${RAG_INDEX_TASK_LOCK_KEY_PREFIX:rag:index-task:lock:}
ttl: ${RAG_INDEX_TASK_LOCK_TTL:30m}
reliability:
enabled: ${RAG_TASK_RELIABILITY_ENABLED:true}
timeout-minutes: ${RAG_TASK_RELIABILITY_TIMEOUT_MINUTES:30}
scan-fixed-delay-ms: ${RAG_TASK_RELIABILITY_SCAN_FIXED_DELAY_MS:60000}
max-retry-count: ${RAG_TASK_RELIABILITY_MAX_RETRY_COUNT:3}
检查重点:
text
1. task-service 端口为 9103。
2. task-service 和 knowledge-service 必须连接同一个 MySQL 业务库。
3. Nacos 地址必须和 Gateway、auth-service、knowledge-service 一致。
4. timeout-minutes、scan-fixed-delay-ms 和 max-retry-count 决定任务超时扫描和重试边界。
5. task-service 和 knowledge-service 的 rag.mq 配置(交换器名、队列名、路由键)必须一致,并且连接同一个 RabbitMQ。
A.6 环境变量速查
下面是后端服务常用环境变量分组。
MySQL
text
RAG_MYSQL_URL
RAG_MYSQL_USERNAME
RAG_MYSQL_PASSWORD
MYSQL_ROOT_PASSWORD
MYSQL_DATABASE
PostgreSQL + pgvector
text
RAG_VECTOR_ENABLED
RAG_VECTOR_URL
RAG_VECTOR_USERNAME
RAG_VECTOR_PASSWORD
RAG_VECTOR_DIMENSION
RAG_VECTOR_TOP_K
RAG_VECTOR_SIMILARITY_THRESHOLD
POSTGRES_DB
POSTGRES_USER
POSTGRES_PASSWORD
Redis
text
RAG_REDIS_HOST
RAG_REDIS_PORT
RAG_REDIS_PASSWORD
RAG_REDIS_DATABASE
RabbitMQ
text
RABBITMQ_HOST
RABBITMQ_PORT
RABBITMQ_USERNAME
RABBITMQ_PASSWORD
RAG_MQ_INDEX_EXCHANGE
RAG_MQ_INDEX_QUEUE
RAG_MQ_INDEX_ROUTING_KEY
Nacos
text
NACOS_SERVER_ADDR
NACOS_PORT
NACOS_GRPC_PORT
NACOS_RAFT_PORT
JWT
text
RAG_JWT_SECRET
RAG_JWT_ISSUER
RAG_JWT_EXPIRE_DURATION
RAG_GATEWAY_AUTH_ENABLED
AI 模型
text
OPENAI_CHAT_API_KEY
OPENAI_CHAT_BASE_URL
OPENAI_CHAT_MODEL
OPENAI_CHAT_TEMPERATURE
OPENAI_EMBEDDING_API_KEY
OPENAI_EMBEDDING_BASE_URL
OPENAI_EMBEDDING_MODEL
文件、切片、缓存、限流与降级
text
RAG_STORAGE_LOCAL_DIR
RAG_STORAGE_MAX_FILE_SIZE
RAG_CHUNKING_MAX_LENGTH
RAG_CHUNKING_OVERLAP_LENGTH
RAG_KB_OWNER_CACHE_ENABLED
RAG_KB_OWNER_CACHE_KEY_PREFIX
RAG_KB_OWNER_CACHE_TTL
RAG_DOCUMENT_INDEX_TASK_CACHE_ENABLED
RAG_DOCUMENT_INDEX_TASK_CACHE_KEY_PREFIX
RAG_DOCUMENT_INDEX_TASK_CACHE_TTL
RAG_INDEX_TASK_LOCK_ENABLED
RAG_INDEX_TASK_LOCK_KEY_PREFIX
RAG_INDEX_TASK_LOCK_TTL
RAG_SENTINEL_CHAT_FLOW_ENABLED
RAG_SENTINEL_CHAT_FLOW_RESOURCE
RAG_SENTINEL_CHAT_FLOW_QPS
RAG_AI_CHAT_FALLBACK_ENABLED
RAG_AI_CHAT_FALLBACK_TIMEOUT
RAG_AI_CHAT_FALLBACK_ANSWER
任务可靠性
text
RAG_TASK_RELIABILITY_ENABLED
RAG_TASK_RELIABILITY_TIMEOUT_MINUTES
RAG_TASK_RELIABILITY_SCAN_FIXED_DELAY_MS
RAG_TASK_RELIABILITY_MAX_RETRY_COUNT
A.6.5 .env.example 完整模板
下面这份内容可以保存为 .env.example。实际部署时,应另存为 .env,并根据本机或服务器环境修改所有密码、Key 和地址。
.env 已在 .gitignore 中排除,不要提交到 Git 仓库。跨机器部署时,优先只修改 .env 中的 IP 地址和密码,不要直接修改各服务的 application.yml。
env
# ========= MySQL =========
RAG_MYSQL_URL=jdbc:mysql://127.0.0.1:3306/rag_demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
RAG_MYSQL_USERNAME=root
RAG_MYSQL_PASSWORD=your-mysql-password
MYSQL_ROOT_PASSWORD=your-root-password
# ========= PostgreSQL/pgvector =========
RAG_VECTOR_ENABLED=true
RAG_VECTOR_URL=jdbc:postgresql://127.0.0.1:5432/rag_vector
RAG_VECTOR_USERNAME=postgres
RAG_VECTOR_PASSWORD=your-pg-password
RAG_VECTOR_DIMENSION=1024
RAG_VECTOR_TOP_K=5
RAG_VECTOR_SIMILARITY_THRESHOLD=0.30
# ========= Redis =========
RAG_REDIS_HOST=127.0.0.1
RAG_REDIS_PORT=6379
RAG_REDIS_PASSWORD=
RAG_REDIS_DATABASE=0
# ========= RabbitMQ =========
RABBITMQ_HOST=127.0.0.1
RABBITMQ_PORT=5672
RABBITMQ_USERNAME=knowhub
RABBITMQ_PASSWORD=your-rabbitmq-password
RAG_MQ_INDEX_EXCHANGE=rag.index.exchange
RAG_MQ_INDEX_QUEUE=rag.index.queue
RAG_MQ_INDEX_ROUTING_KEY=rag.index.document
# ========= Nacos =========
NACOS_SERVER_ADDR=127.0.0.1:8848
# ========= JWT =========
RAG_JWT_SECRET=your-random-secret-at-least-32-characters
RAG_JWT_ISSUER=rag-platform
RAG_JWT_EXPIRE_DURATION=2h
RAG_GATEWAY_AUTH_ENABLED=true
# ========= AI Model =========
OPENAI_CHAT_API_KEY=your-chat-api-key
OPENAI_CHAT_BASE_URL=https://api.openai.com
OPENAI_CHAT_MODEL=gpt-4o
OPENAI_CHAT_TEMPERATURE=0.2
OPENAI_EMBEDDING_API_KEY=your-embedding-api-key
OPENAI_EMBEDDING_BASE_URL=https://api.openai.com
OPENAI_EMBEDDING_MODEL=text-embedding-v4
# ========= Storage & Chunking =========
RAG_STORAGE_LOCAL_DIR=D:/rag/rag-platform/uploads
RAG_STORAGE_MAX_FILE_SIZE=20MB
RAG_CHUNKING_MAX_LENGTH=800
RAG_CHUNKING_OVERLAP_LENGTH=120
# ========= Cache & Lock =========
RAG_KB_OWNER_CACHE_ENABLED=true
RAG_KB_OWNER_CACHE_KEY_PREFIX=rag:kb:owner:
RAG_KB_OWNER_CACHE_TTL=30m
RAG_DOCUMENT_INDEX_TASK_CACHE_ENABLED=true
RAG_DOCUMENT_INDEX_TASK_CACHE_KEY_PREFIX=rag:document:index-task:
RAG_DOCUMENT_INDEX_TASK_CACHE_TTL=1m
RAG_INDEX_TASK_LOCK_ENABLED=false
RAG_INDEX_TASK_LOCK_KEY_PREFIX=rag:index-task:lock:
RAG_INDEX_TASK_LOCK_TTL=30m
# ========= Sentinel & Fallback =========
RAG_SENTINEL_CHAT_FLOW_ENABLED=true
RAG_SENTINEL_CHAT_FLOW_RESOURCE=knowledgeChat
RAG_SENTINEL_CHAT_FLOW_QPS=1
RAG_AI_CHAT_FALLBACK_ENABLED=true
RAG_AI_CHAT_FALLBACK_TIMEOUT=5s
RAG_AI_CHAT_FALLBACK_ANSWER=当前 AI 服务暂时不可用,请稍后重试。
# ========= Task Reliability =========
RAG_TASK_RELIABILITY_ENABLED=true
RAG_TASK_RELIABILITY_TIMEOUT_MINUTES=30
RAG_TASK_RELIABILITY_SCAN_FIXED_DELAY_MS=60000
RAG_TASK_RELIABILITY_MAX_RETRY_COUNT=3
A.7 配置检查清单
部署或演示前,可以按下面顺序检查:
text
1. 四个服务是否连接同一个 Nacos。
2. Gateway 和 auth-service 的 JWT secret 是否一致。
3. auth、knowledge、task 是否连接同一个 MySQL。
4. knowledge-service 是否能连接 Redis。
5. knowledge-service 是否能连接 PostgreSQL/pgvector。
6. RAG_VECTOR_DIMENSION 是否等于 embedding 模型输出维度。
6.5 knowledge-service 和 task-service 是否连接同一个 RabbitMQ,rag.mq 下的 exchange、queue、routing-key 是否一致。
7. AI chat 和 embedding 的 base-url、model、api-key 是否正确。
8. 前端请求地址是否指向 Gateway 9000。
9. 真实 .env 是否未提交 Git。
10. application.yml 中是否仍有硬编码密码或真实 API Key。
附录 A 的目标不是解释每个技术点,而是让读者在部署和排查时能快速对照配置。