@llryiop/avatar-boot-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +309 -0
  2. package/bin/cli.js +3 -0
  3. package/docs/plans/2026-03-12-avatar-boot-cli-design.md +73 -0
  4. package/docs/plans/2026-03-12-avatar-boot-cli-plan.md +681 -0
  5. package/package.json +28 -0
  6. package/src/index.js +78 -0
  7. package/src/prompts.js +78 -0
  8. package/src/template.js +37 -0
  9. package/src/transform.js +172 -0
  10. package/src/utils.js +34 -0
  11. package/templates/.claude/rules/architecture-redlines.md +146 -0
  12. package/templates/.claude/rules/code-review-standards.md +137 -0
  13. package/templates/.claude/rules/coding-standards.md +56 -0
  14. package/templates/.claude/rules/git-commit.md +59 -0
  15. package/templates/.claude/rules/layered-architecture.md +201 -0
  16. package/templates/.claude/rules/mybatis-plus.md +263 -0
  17. package/templates/.claude/rules/tech-stack.md +41 -0
  18. package/templates/.claude/rules/version.md +467 -0
  19. package/templates/.claude/settings.local.json +18 -0
  20. package/templates/.claude/skills/ai-tool-guide/SKILL.md +314 -0
  21. package/templates/.claude/skills/api-design/SKILL.md +200 -0
  22. package/templates/.claude/skills/api-doc-generator/SKILL.md +380 -0
  23. package/templates/.claude/skills/api-service-module-creator/SKILL.md +1114 -0
  24. package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +243 -0
  25. package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +437 -0
  26. package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +580 -0
  27. package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +572 -0
  28. package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +901 -0
  29. package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +594 -0
  30. package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +586 -0
  31. package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +662 -0
  32. package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +1007 -0
  33. package/templates/.claude/skills/changelog-generator/SKILL.md +114 -0
  34. package/templates/.claude/skills/code-review/SKILL.md +239 -0
  35. package/templates/.claude/skills/crud-generator/SKILL.md +824 -0
  36. package/templates/.claude/skills/database-design/SKILL.md +377 -0
  37. package/templates/.claude/skills/deployment-config/SKILL.md +277 -0
  38. package/templates/.claude/skills/incident-analysis/SKILL.md +241 -0
  39. package/templates/.claude/skills/integration-test-generator/SKILL.md +496 -0
  40. package/templates/.claude/skills/prompt-engineering/SKILL.md +249 -0
  41. package/templates/.claude/skills/requirement-management/SKILL.md +244 -0
  42. package/templates/.claude/skills/security-audit/SKILL.md +330 -0
  43. package/templates/.claude/skills/test-case-design/SKILL.md +257 -0
  44. package/templates/.claude/skills/testing-workflow/SKILL.md +68 -0
  45. package/templates/.claude/skills/troubleshooting/SKILL.md +240 -0
  46. package/templates/CLAUDE.md +173 -0
  47. package/templates/README.md +303 -0
  48. package/templates/avatar-scaffold-api/pom.xml +41 -0
  49. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/api/LoginFeignClient.java +40 -0
  50. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/constant/LoginConstant.java +21 -0
  51. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/LoginRequest.java +17 -0
  52. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/RefreshTokenRequest.java +14 -0
  53. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/LoginResponse.java +31 -0
  54. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/TokenInfoResponse.java +25 -0
  55. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/enums/LoginTypeEnum.java +23 -0
  56. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginException.java +23 -0
  57. package/templates/avatar-scaffold-service/k8s-app/Dockerfile +14 -0
  58. package/templates/avatar-scaffold-service/k8s-app/Dockerfile-arm64 +14 -0
  59. package/templates/avatar-scaffold-service/packaging/assembly.xml +16 -0
  60. package/templates/avatar-scaffold-service/pom.xml +150 -0
  61. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/Application.java +21 -0
  62. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/config/LoginConfig.java +20 -0
  63. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/controller/LoginController.java +37 -0
  64. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/converter/LoginConverter.java +54 -0
  65. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/feign/DemoFeign.java +21 -0
  66. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserLoginEntity.java +33 -0
  67. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserTokenEntity.java +39 -0
  68. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/mapper/UserLoginMapper.java +20 -0
  69. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/LoginService.java +22 -0
  70. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/impl/LoginServiceImpl.java +43 -0
  71. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/utils/LoginUtils.java +31 -0
  72. package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +29 -0
  73. package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +61 -0
  74. package/templates/avatar-scaffold-service/src/main/resources/application-prod.yaml +28 -0
  75. package/templates/avatar-scaffold-service/src/main/resources/application-test.yaml +28 -0
  76. package/templates/avatar-scaffold-service/src/main/resources/application.yaml +12 -0
  77. package/templates/pom.xml +98 -0
@@ -0,0 +1,901 @@
1
+ ---
2
+ name: avatar-boot-nacos-config
3
+ description: Avatar Boot Nacos 配置完整参考 - 服务发现、配置中心和 Spring Cloud Alibaba 集成。当用户提到 Nacos、服务发现、配置中心、配置管理、Spring Cloud Alibaba、服务注册、动态配置时使用此技能,或当用户正在编辑涉及 Nacos 设置的 application.yml/application.properties 文件时触发。当用户询问微服务配置、环境隔离(使用命名空间的 dev/test/prod)、共享配置或排查 Nacos 连接问题时也应触发。此技能提供配置示例、生成完整配置文件、验证最佳实践并提供故障排查指导。
4
+ ---
5
+
6
+ # Avatar Boot Nacos 配置参考
7
+
8
+ Avatar Boot 应用中配置 Nacos 服务发现和配置管理的完整指南。
9
+
10
+ ## 快速开始
11
+
12
+ ### ⚠️ 重要:Spring Cloud Alibaba 2023.x 配置要求
13
+
14
+ **Spring Cloud Alibaba 2023.x 强制要求**使用 `spring.config.import` 声明 Nacos 配置源,否则会报错:
15
+ - `No spring.config.import property has been defined`
16
+ - `dataId must be specified`
17
+
18
+ ### 最小配置
19
+
20
+ **application.yml** (主配置):
21
+ ```yaml
22
+ spring:
23
+ application:
24
+ name: my-service # 必填:服务名称
25
+
26
+ server:
27
+ port: 8080
28
+ ```
29
+
30
+ **application-dev.yml** (环境配置):
31
+ ```yaml
32
+ spring:
33
+ config:
34
+ import:
35
+ - optional:nacos:${spring.application.name}.yaml?group=DEFAULT_GROUP&refreshEnabled=true
36
+
37
+ cloud:
38
+ nacos:
39
+ server-addr: 127.0.0.1:8848 # 必填:Nacos 服务器地址
40
+ namespace: ${NACOS_NAMESPACE:dev}
41
+ username: ${NACOS_USERNAME:nacos}
42
+ password: ${NACOS_PASSWORD:nacos}
43
+
44
+ config:
45
+ enabled: true
46
+ file-extension: yaml
47
+ group: DEFAULT_GROUP
48
+
49
+ discovery:
50
+ enabled: true
51
+ register-enabled: true
52
+ ephemeral: true
53
+ ```
54
+
55
+ ### 添加依赖
56
+
57
+ ```xml
58
+ <dependency>
59
+ <groupId>com.iflytek.avatar.boot</groupId>
60
+ <artifactId>avatar-boot-starter-nacos</artifactId>
61
+ </dependency>
62
+ ```
63
+
64
+ 版本由 `avatar-boot-dependency` BOM 管理 - 永远不要显式指定版本。
65
+
66
+ ## 配置方式
67
+
68
+ ### ⚠️ Spring Cloud Alibaba 2023.x 唯一推荐方式
69
+
70
+ **必须使用 `spring.config.import`**,这是 Spring Cloud Alibaba 2023.x 的强制要求。
71
+
72
+ #### 正确的配置格式
73
+
74
+ ```yaml
75
+ spring:
76
+ application:
77
+ name: avatar-demo-service
78
+
79
+ config:
80
+ import:
81
+ # 应用配置
82
+ - optional:nacos:${spring.application.name}.yaml?group=DEFAULT_GROUP&refreshEnabled=true
83
+ # 共享配置
84
+ - optional:nacos:common-database.yaml?group=SHARED_GROUP&refreshEnabled=true
85
+ - optional:nacos:common-redis.yaml?group=SHARED_GROUP&refreshEnabled=true
86
+
87
+ cloud:
88
+ nacos:
89
+ server-addr: 127.0.0.1:8848
90
+ namespace: ${NACOS_NAMESPACE:}
91
+ username: ${NACOS_USERNAME:nacos}
92
+ password: ${NACOS_PASSWORD:nacos}
93
+
94
+ config:
95
+ enabled: true
96
+ file-extension: yaml
97
+ group: DEFAULT_GROUP
98
+
99
+ discovery:
100
+ enabled: true
101
+ register-enabled: true
102
+ ephemeral: true
103
+ group: DEFAULT_GROUP
104
+ metadata:
105
+ version: 1.0.0
106
+ environment: ${spring.profiles.active:dev}
107
+ ```
108
+
109
+ **格式说明**:
110
+ - `optional:` - 配置不存在时不会导致启动失败(推荐)
111
+ - `nacos:` - 指定配置源类型
112
+ - `{dataId}` - 配置文件的 Data ID,可使用变量 `${spring.application.name}`
113
+ - `?group=XXX` - 指定配置分组(必需)
114
+ - `&refreshEnabled=true` - 启用配置自动刷新
115
+
116
+ #### ❌ 常见错误
117
+
118
+ ```yaml
119
+ # 错误 1: 缺少 spring.config.import
120
+ spring:
121
+ cloud:
122
+ nacos:
123
+ config:
124
+ enabled: true # ❌ 会报错: No spring.config.import property has been defined
125
+
126
+ # 错误 2: 空的 dataId
127
+ spring:
128
+ config:
129
+ import:
130
+ - "nacos:" # ❌ 会报错: dataId must be specified
131
+
132
+ # 错误 3: 变量未解析
133
+ spring:
134
+ config:
135
+ import:
136
+ - "optional:nacos:${spring.applicyaml" # ❌ 缺少 group 参数
137
+
138
+ # 错误 4: 位置错误
139
+ spring:
140
+ cloud:
141
+ nacos:
142
+ config:
143
+ import: # ❌ 应该在 spring.config.import,不是这里
144
+ - "nacos:xxx"
145
+
146
+ # 错误 5: spring.application.name 定义位置错误
147
+ spring:
148
+ config:
149
+ activate:
150
+ on-profile: dev # ❌ 不应该在主配置文件中
151
+ application:
152
+ name: my-service
153
+ ```
154
+
155
+ #### ✅ 推荐的配置结构
156
+
157
+ **application.yml** (主配置 - 所有环境共享):
158
+ ```yaml
159
+ spring:
160
+ application:
161
+ name: avatar-demo-service # 必须在主配置文件中定义
162
+
163
+ server:
164
+ port: 8080
165
+ ```
166
+
167
+ **application-dev.yml** (开发环境):
168
+ ```yaml
169
+ spring:
170
+ config:
171
+ import:
172
+ - optional:nacos:${spring.application.name}.yaml?group=DEFAULT_GROUP&refreshEnabled=true
173
+ - optional:nacos:common-database.yaml?group=SHARED_GROUP&refreshEnabled=true
174
+
175
+ cloud:
176
+ nacos:
177
+ server-addr: 172.29.242.247:8848
178
+ namespace: dev
179
+ username: ${NACOS_USERNAME:nacos}
180
+ password: ${NACOS_PASSWORD:nacos}
181
+ config:
182
+ enabled: true
183
+ file-extension: yaml
184
+ group: DEFAULT_GROUP
185
+ discovery:
186
+ enabled: true
187
+ register-enabled: true
188
+ ephemeral: true
189
+ group: DEFAULT_GROUP
190
+ ```
191
+
192
+ **application-prod.yml** (生产环境):
193
+ ```yaml
194
+ spring:
195
+ config:
196
+ import:
197
+ - optional:nacos:${spring.application.name}.yaml?group=DEFAULT_GROUP&refreshEnabled=true
198
+ - optional:nacos:common-database.yaml?group=SHARED_GROUP&refreshEnabled=true
199
+
200
+ cloud:
201
+ nacos:
202
+ server-addr: nacos-prod.example.com:8848
203
+ namespace: prod
204
+ username: ${NACOS_USERNAME} # 从环境变量读取
205
+ password: ${NACOS_PASSWORD}
206
+ config:
207
+ enabled: true
208
+ file-extension: yaml
209
+ group: DEFAULT_GROUP
210
+ discovery:
211
+ enabled: true
212
+ register-enabled: true
213
+ ephemeral: true
214
+ group: DEFAULT_GROUP
215
+ ```
216
+
217
+ ## 配置详解
218
+
219
+ ### 服务发现配置
220
+
221
+ ```yaml
222
+ spring:
223
+ cloud:
224
+ nacos:
225
+ discovery:
226
+ enabled: true # 启用服务发现
227
+ register-enabled: true # 注册此服务
228
+ ephemeral: true # 临时实例(推荐用于云原生)
229
+ group: DEFAULT_GROUP # 服务分组
230
+ cluster-name: DEFAULT # 集群名称
231
+ weight: 1.0 # 服务权重(0.01-100.0)
232
+
233
+ # 网络设置
234
+ prefer-ip-address: true # 使用 IP 而非主机名
235
+ # ip: 192.168.1.100 # 手动指定 IP(未设置时自动检测)
236
+ # port: 8080 # 手动指定端口(未设置时使用 server.port)
237
+ # network-interface: eth0 # 多网卡场景
238
+
239
+ # 健康检查
240
+ heart-beat-interval: 5000 # 心跳间隔(毫秒)
241
+ heart-beat-timeout: 15000 # 心跳超时(毫秒)
242
+ ip-delete-timeout: 30000 # IP 删除超时(毫秒)
243
+
244
+ # 元数据 - 用于路由/监控的自定义标签
245
+ metadata:
246
+ version: 1.0.0
247
+ environment: ${spring.profiles.active:dev}
248
+ region: cn-east
249
+ team: backend
250
+ ```
251
+
252
+ **实例类型:**
253
+ - **临时实例(Ephemeral)**: `ephemeral: true` - 推荐用于云原生
254
+ - 下线时自动删除
255
+ - 维护成本低
256
+ - 适用于:容器、自动扩缩容
257
+
258
+ - **持久化实例(Persistent)**: `ephemeral: false` - 传统部署
259
+ - 下线后仍保留
260
+ - 需要手动清理
261
+ - 适用于:虚拟机、固定 IP
262
+
263
+ ### 配置中心配置
264
+
265
+ ```yaml
266
+ spring:
267
+ cloud:
268
+ nacos:
269
+ config:
270
+ enabled: true # 启用配置中心
271
+ file-extension: yaml # 配置格式:yaml/properties/json/xml
272
+ group: DEFAULT_GROUP # 配置分组
273
+ refresh-enabled: true # 启用自动刷新
274
+
275
+ # 超时和重试
276
+ timeout: 3000 # 连接超时(毫秒)
277
+ config-long-poll-timeout: 46000 # 长轮询超时(毫秒)
278
+ config-retry-time: 2000 # 重试间隔(毫秒)
279
+ max-retry: 10 # 最大重试次数
280
+
281
+ # 远程同步
282
+ enable-remote-sync-config: false
283
+ ```
284
+
285
+ ### 多环境配置
286
+
287
+ 使用 **命名空间(namespaces)** 实现环境隔离:
288
+
289
+ ```yaml
290
+ ---
291
+ # 开发环境
292
+ spring:
293
+ config:
294
+ activate:
295
+ on-profile: dev
296
+ cloud:
297
+ nacos:
298
+ server-addr: 127.0.0.1:8848
299
+ namespace: dev-namespace-id
300
+ config:
301
+ group: DEV_GROUP
302
+ discovery:
303
+ group: DEV_GROUP
304
+
305
+ ---
306
+ # 测试环境
307
+ spring:
308
+ config:
309
+ activate:
310
+ on-profile: test
311
+ cloud:
312
+ nacos:
313
+ server-addr: nacos-test.example.com:8848
314
+ namespace: test-namespace-id
315
+ config:
316
+ group: TEST_GROUP
317
+ discovery:
318
+ group: TEST_GROUP
319
+
320
+ ---
321
+ # 生产环境
322
+ spring:
323
+ config:
324
+ activate:
325
+ on-profile: prod
326
+ cloud:
327
+ nacos:
328
+ server-addr: nacos-prod.example.com:8848
329
+ namespace: prod-namespace-id
330
+ username: ${NACOS_USERNAME} # 从环境变量读取
331
+ password: ${NACOS_PASSWORD}
332
+ config:
333
+ group: PROD_GROUP
334
+ discovery:
335
+ group: PROD_GROUP
336
+ ```
337
+
338
+ ## Nacos 配置文件命名规则
339
+
340
+ Nacos 按以下顺序自动加载配置:
341
+
342
+ 1. **应用配置**: `${spring.application.name}.${file-extension}`
343
+ - 示例:`my-service.yaml`
344
+
345
+ 2. **应用+环境配置**: `${spring.application.name}-${profile}.${file-extension}`
346
+ - 示例:`my-service-dev.yaml`
347
+
348
+ 3. **扩展配置**: 通过 `extension-configs` 指定
349
+
350
+ 4. **共享配置**: 通过 `shared-configs` 指定
351
+
352
+ **优先级(从高到低):**
353
+ 1. 应用+环境配置
354
+ 2. 应用配置
355
+ 3. 扩展配置
356
+ 4. 共享配置
357
+
358
+ ## 代码使用模式
359
+
360
+ ### 使用 RestTemplate 进行服务发现
361
+
362
+ ```java
363
+ @Configuration
364
+ public class RestTemplateConfig {
365
+
366
+ @Bean
367
+ @LoadBalanced // 启用服务名解析
368
+ public RestTemplate restTemplate() {
369
+ return new RestTemplate();
370
+ }
371
+ }
372
+
373
+ @Service
374
+ public class UserService {
375
+
376
+ @Autowired
377
+ private RestTemplate restTemplate;
378
+
379
+ public User getUser(Long id) {
380
+ // 通过服务名调用(而非 IP:端口)
381
+ return restTemplate.getForObject(
382
+ "http://user-service/users/" + id,
383
+ User.class
384
+ );
385
+ }
386
+ }
387
+ ```
388
+
389
+ ### 使用 @Value 实现动态配置
390
+
391
+ ```java
392
+ @RestController
393
+ @RefreshScope // 配置热更新必需
394
+ public class ConfigController {
395
+
396
+ @Value("${app.feature.enabled:false}")
397
+ private boolean featureEnabled;
398
+
399
+ @GetMapping("/config")
400
+ public String getConfig() {
401
+ return "Feature enabled: " + featureEnabled;
402
+ }
403
+ }
404
+ ```
405
+
406
+ ### 使用 @ConfigurationProperties 实现动态配置
407
+
408
+ ```java
409
+ @Component
410
+ @ConfigurationProperties(prefix = "app")
411
+ @RefreshScope // 配置热更新必需
412
+ @Data
413
+ public class AppConfig {
414
+ private String name;
415
+ private String version;
416
+ private Feature feature;
417
+
418
+ @Data
419
+ public static class Feature {
420
+ private boolean enabled;
421
+ private int maxUsers;
422
+ }
423
+ }
424
+ ```
425
+
426
+ **对应的 Nacos 配置**(Data ID: `my-service.yaml`):
427
+
428
+ ```yaml
429
+ app:
430
+ name: My Service
431
+ version: 1.0.0
432
+ feature:
433
+ enabled: true
434
+ maxUsers: 100
435
+ ```
436
+
437
+ ### 监听配置变更
438
+
439
+ ```java
440
+ @Component
441
+ public class ConfigChangeListener {
442
+
443
+ @EventListener
444
+ public void onRefresh(RefreshScopeRefreshedEvent event) {
445
+ log.info("配置已刷新");
446
+ }
447
+
448
+ @EventListener
449
+ public void onEnvironmentChange(EnvironmentChangeEvent event) {
450
+ log.info("环境已变更: {}", event.getKeys());
451
+ }
452
+ }
453
+ ```
454
+
455
+ ## 最佳实践
456
+
457
+ ### 1. 环境隔离策略
458
+
459
+ **使用命名空间隔离环境:**
460
+ - 开发环境:`dev-namespace`
461
+ - 测试环境:`test-namespace`
462
+ - 生产环境:`prod-namespace`
463
+
464
+ **使用分组隔离业务域:**
465
+ - 用户服务:`USER_GROUP`
466
+ - 订单服务:`ORDER_GROUP`
467
+ - 支付服务:`PAYMENT_GROUP`
468
+
469
+ ### 2. 配置管理策略
470
+
471
+ - **公共配置**:使用 `shared-configs` 实现跨应用设置
472
+ - **业务配置**:使用应用专属配置
473
+ - **敏感配置**:使用环境变量或加密配置
474
+
475
+ ### 3. 元数据使用
476
+
477
+ 添加有用的元数据用于路由和监控:
478
+
479
+ ```yaml
480
+ spring:
481
+ cloud:
482
+ nacos:
483
+ discovery:
484
+ metadata:
485
+ version: ${project.version}
486
+ environment: ${spring.profiles.active}
487
+ region: cn-east
488
+ team: backend
489
+ git-commit: ${git.commit.id.abbrev}
490
+ ```
491
+
492
+ **使用场景:**
493
+ - **灰度发布**:根据版本路由
494
+ - **流量控制**:根据区域路由
495
+ - **监控告警**:按团队分组
496
+
497
+ ### 4. 配置刷新策略
498
+
499
+ - 对需要热更新的 Bean 使用 `@RefreshScope`
500
+ - 监听 `RefreshScopeRefreshedEvent` 实现自定义刷新逻辑
501
+ - 某些配置(如线程池大小)可能需要重启
502
+
503
+ ### 5. 健康检查配置
504
+
505
+ ```yaml
506
+ management:
507
+ endpoints:
508
+ web:
509
+ exposure:
510
+ include: health,info,nacos-config,nacos-discovery
511
+ endpoint:
512
+ health:
513
+ show-details: always
514
+ health:
515
+ nacos:
516
+ enabled: true
517
+ ```
518
+
519
+ 访问健康检查:
520
+ ```bash
521
+ curl http://localhost:8080/actuator/health
522
+ ```
523
+
524
+ ## 故障排查指南
525
+
526
+ ### 问题 0:Logback Appender 冲突错误
527
+
528
+ **症状**:启动时出现以下错误:
529
+ ```
530
+ |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[CONFIG_LOG_FILE] - 'File' option has the same value "C:\Users\xxx/logs/nacos/config.log" as that given for appender [CONFIG_LOG_FILE] defined earlier.
531
+ |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[CONFIG_LOG_FILE] - Collisions detected with FileAppender/RollingAppender instances defined earlier. Aborting.
532
+ ```
533
+
534
+ **原因**:Nacos 客户端会加载自己的 Logback 配置,创建文件日志 appender(CONFIG_LOG_FILE、NAMING_LOG_FILE、REMOTE_LOG_FILE),与应用的 Logback 配置冲突。
535
+
536
+ **解决方案**:
537
+
538
+ 1. **在 Application 启动类中禁用 Nacos 文件日志**(推荐):
539
+
540
+ ```java
541
+ @SpringBootApplication
542
+ public class Application {
543
+
544
+ public static void main(String[] args) {
545
+ // 禁用 Nacos 客户端的文件日志输出,解决 Logback appender 冲突问题
546
+ // 参考: https://github.com/alibaba/spring-cloud-alibaba/issues/4004
547
+ // 参考: https://github.com/alibaba/spring-cloud-alibaba/issues/3995
548
+ System.setProperty("nacos.logging.default.config.enabled", "false");
549
+ System.setProperty("nacos.logging.config", "");
550
+
551
+ SpringApplication.run(Application.class, args);
552
+ }
553
+ }
554
+ ```
555
+
556
+ 2. **在 application.yml 中设置 Nacos 日志级别**(可选):
557
+
558
+ ```yaml
559
+ logging:
560
+ level:
561
+ com.alibaba.nacos: ERROR # 减少 Nacos 日志输出
562
+ ```
563
+
564
+ 3. **不要引用不存在的 logback 配置文件**:
565
+
566
+ ```yaml
567
+ # ❌ 错误:引用不存在的文件
568
+ logging:
569
+ config: classpath:logback-spring.xml # 如果文件不存在会导致问题
570
+
571
+ # ✅ 正确:不指定或确保文件存在
572
+ logging:
573
+ level:
574
+ com.alibaba.nacos: ERROR
575
+ ```
576
+
577
+ **关键点**:
578
+ - 必须在 `SpringApplication.run()` **之前**设置系统属性
579
+ - 这会禁用 Nacos 的文件日志,Nacos 日志只会输出到控制台
580
+ - 通过 `logging.level.com.alibaba.nacos` 控制 Nacos 日志级别
581
+
582
+ **参考资料**:
583
+ - [Spring Cloud Alibaba Issue #4004](https://github.com/alibaba/spring-cloud-alibaba/issues/4004)
584
+ - [Spring Cloud Alibaba Issue #3995](https://github.com/alibaba/spring-cloud-alibaba/issues/3995)
585
+
586
+ ### 问题 1:服务未注册
587
+
588
+ **症状**:服务未出现在 Nacos 控制台
589
+
590
+ **诊断步骤:**
591
+ 1. 检查 Nacos 服务器地址:`telnet nacos-server 8848`
592
+ 2. 启用调试日志:
593
+ ```yaml
594
+ logging:
595
+ level:
596
+ com.alibaba.nacos: DEBUG
597
+ com.alibaba.cloud.nacos: DEBUG
598
+ ```
599
+ 3. 验证 `spring.cloud.nacos.discovery.register-enabled=true`
600
+ 4. 检查应用名称已设置:`spring.application.name`
601
+
602
+ **常见原因:**
603
+ - 服务器地址错误
604
+ - 网络/防火墙阻止端口 8848
605
+ - Nacos 服务器未运行
606
+ - 认证失败(用户名/密码错误)
607
+
608
+ ### 问题 2:配置未加载
609
+
610
+ **症状**:应用无法从 Nacos 加载配置
611
+
612
+ **常见错误信息**:
613
+ - `No spring.config.import property has been defined`
614
+ - `dataId must be specified`
615
+ - `illegal URI: http://${nacos.server-addr}/...`
616
+
617
+ **诊断步骤:**
618
+ 1. ✅ **检查 spring.config.import 是否存在**
619
+ ```yaml
620
+ spring:
621
+ config:
622
+ import:
623
+ - optional:nacos:${spring.application.name}.yaml?group=DEFAULT_GROUP&refreshEnabled=true
624
+ ```
625
+
626
+ 2. ✅ **检查 spring.config.import 位置是否正确**
627
+ - 必须在顶层 `spring:` 下
628
+ - 不能在 `spring.cloud.nacos:` 下
629
+
630
+ 3. ✅ **检查 spring.application.name 是否在主配置文件中定义**
631
+ ```yaml
632
+ # application.yml (主配置)
633
+ spring:
634
+ application:
635
+ name: my-service # 必须在这里定义
636
+ ```
637
+
638
+ 4. ✅ **检查 dataId 格式是否正确**
639
+ ```yaml
640
+ # ✅ 正确
641
+ - optional:nacos:my-service.yaml?group=DEFAULT_GROUP&refreshEnabled=true
642
+
643
+ # ❌ 错误
644
+ - "nacos:" # 缺少 dataId
645
+ - "optional:nacos:${spring.application.name}.yaml" # 缺少 group 参数
646
+ ```
647
+
648
+ 5. 验证 Data ID 在 Nacos 控制台中存在
649
+ 6. 检查命名空间 ID 正确
650
+ 7. 验证分组名称匹配
651
+ 8. 确认文件扩展名匹配:`file-extension: yaml`
652
+
653
+ **解决方案示例:**
654
+
655
+ ```yaml
656
+ # application.yml (主配置)
657
+ spring:
658
+ application:
659
+ name: my-service
660
+
661
+ # application-dev.yml (环境配置)
662
+ spring:
663
+ config:
664
+ import:
665
+ - optional:nacos:${spring.application.name}.yaml?group=DEFAULT_GROUP&refreshEnabled=true
666
+
667
+ cloud:
668
+ nacos:
669
+ server-addr: 127.0.0.1:8848
670
+ namespace: dev
671
+ config:
672
+ enabled: true
673
+ file-extension: yaml
674
+ group: DEFAULT_GROUP
675
+ ```
676
+
677
+ ### 问题 3:配置未刷新
678
+
679
+ **症状**:Nacos 中的配置更改未在应用中更新
680
+
681
+ **诊断步骤:**
682
+ 1. 验证 `spring.cloud.nacos.config.refresh-enabled=true`
683
+ 2. 检查 Bean 上有 `@RefreshScope` 注解
684
+ 3. 在日志中查找刷新事件
685
+ 4. 先用 `@Value` 测试(比 `@ConfigurationProperties` 简单)
686
+
687
+ **常见原因:**
688
+ - 缺少 `@RefreshScope` 注解
689
+ - 配置无法注入(静态字段、构造函数注入)
690
+ - 某些配置不支持热更新(需要重启)
691
+
692
+ ### 问题 4:服务调用失败
693
+
694
+ **症状**:`http://service-name/path` 返回错误
695
+
696
+ **诊断步骤:**
697
+ 1. 验证目标服务已在 Nacos 中注册
698
+ 2. 检查 RestTemplate 上有 `@LoadBalanced` 注解
699
+ 3. 验证服务名称正确(区分大小写)
700
+ 4. 先测试直接 IP:端口调用
701
+ 5. 检查网络连接
702
+
703
+ **常见原因:**
704
+ - 缺少 `@LoadBalanced` 注解
705
+ - 服务名拼写错误
706
+ - 目标服务未注册
707
+ - 网络/防火墙问题
708
+
709
+ ### 问题 5:认证失败
710
+
711
+ **症状**:"403 Forbidden" 或 "401 Unauthorized"
712
+
713
+ **解决方案:**
714
+ ```yaml
715
+ spring:
716
+ cloud:
717
+ nacos:
718
+ username: ${NACOS_USERNAME:nacos}
719
+ password: ${NACOS_PASSWORD:nacos}
720
+ ```
721
+
722
+ 在生产环境使用环境变量:
723
+ ```bash
724
+ export NACOS_USERNAME=your-username
725
+ export NACOS_PASSWORD=your-password
726
+ ```
727
+
728
+ ## 配置生成器
729
+
730
+ 生成 Nacos 配置时,遵循此模板结构:
731
+
732
+ ```yaml
733
+ # 基础结构
734
+ spring:
735
+ application:
736
+ name: <服务名称>
737
+
738
+ cloud:
739
+ nacos:
740
+ server-addr: <NACOS服务器>
741
+ namespace: <命名空间ID>
742
+ username: ${NACOS_USERNAME:nacos}
743
+ password: ${NACOS_PASSWORD:nacos}
744
+
745
+ config:
746
+ enabled: <true|false>
747
+ file-extension: <yaml|properties|json|xml>
748
+ group: <分组名称>
749
+ refresh-enabled: <true|false>
750
+
751
+ discovery:
752
+ enabled: <true|false>
753
+ register-enabled: <true|false>
754
+ ephemeral: <true|false>
755
+ group: <分组名称>
756
+ metadata:
757
+ version: <版本>
758
+ environment: <环境>
759
+
760
+ # 健康检查
761
+ management:
762
+ endpoints:
763
+ web:
764
+ exposure:
765
+ include: health,info,nacos-config,nacos-discovery
766
+ endpoint:
767
+ health:
768
+ show-details: always
769
+
770
+ # 日志
771
+ logging:
772
+ level:
773
+ com.alibaba.nacos: INFO
774
+ com.alibaba.cloud.nacos: INFO
775
+ ```
776
+
777
+ ## 验证清单
778
+
779
+ 审查 Nacos 配置时,检查:
780
+
781
+ - [ ] 已设置 `spring.application.name`
782
+ - [ ] `server-addr` 指向正确的 Nacos 服务器
783
+ - [ ] 命名空间 ID 匹配环境(dev/test/prod)
784
+ - [ ] 配置和发现的分组名称一致
785
+ - [ ] 云原生部署使用 `ephemeral: true`
786
+ - [ ] 生产环境的认证凭据使用环境变量
787
+ - [ ] 需要动态配置时 `refresh-enabled: true`
788
+ - [ ] 元数据包含有用标签(版本、环境)
789
+ - [ ] 健康检查端点已暴露
790
+ - [ ] 生产环境禁用调试日志
791
+
792
+ ## 版本兼容性
793
+
794
+ - **Spring Boot**: 3.5.3
795
+ - **Spring Cloud**: 2025.0.0
796
+ - **Spring Cloud Alibaba**: 2023.0.3.2
797
+ - **Java**: 21
798
+
799
+ **重要**:Spring Boot 3.x 不再使用 `bootstrap.yml` - 所有配置都在 `application.yml` 中。
800
+
801
+ ## 参考文档
802
+
803
+ - [Spring Cloud Alibaba Nacos](https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config)
804
+ - [Nacos 官方文档](https://nacos.io/zh-cn/docs/what-is-nacos.html)
805
+ - [Spring Cloud LoadBalancer](https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer)
806
+
807
+ ## 常见场景
808
+
809
+ ### 场景 1:仅服务发现的简单服务
810
+
811
+ ```yaml
812
+ spring:
813
+ application:
814
+ name: simple-service
815
+ cloud:
816
+ nacos:
817
+ server-addr: 127.0.0.1:8848
818
+ discovery:
819
+ enabled: true
820
+ config:
821
+ enabled: false # 禁用配置中心
822
+ ```
823
+
824
+ ### 场景 2:仅配置中心(无服务注册)
825
+
826
+ ```yaml
827
+ spring:
828
+ application:
829
+ name: config-consumer
830
+ cloud:
831
+ nacos:
832
+ server-addr: 127.0.0.1:8848
833
+ config:
834
+ enabled: true
835
+ discovery:
836
+ enabled: false # 禁用服务发现
837
+ ```
838
+
839
+ ### 场景 3:多配置加载
840
+
841
+ ```yaml
842
+ spring:
843
+ cloud:
844
+ nacos:
845
+ config:
846
+ extension-configs:
847
+ - data-id: database.yaml
848
+ group: COMMON_GROUP
849
+ refresh: true
850
+ - data-id: redis.yaml
851
+ group: COMMON_GROUP
852
+ refresh: true
853
+ - data-id: kafka.yaml
854
+ group: COMMON_GROUP
855
+ refresh: true
856
+ ```
857
+
858
+ ### 场景 4:使用元数据的灰度发布
859
+
860
+ ```yaml
861
+ spring:
862
+ cloud:
863
+ nacos:
864
+ discovery:
865
+ metadata:
866
+ version: 2.0.0-beta
867
+ gray: true
868
+ canary-weight: 10
869
+ ```
870
+
871
+ 然后使用自定义路由规则将 10% 的流量导向此版本。
872
+
873
+ ## 快速命令参考
874
+
875
+ ```bash
876
+ # 检查 Nacos 连接
877
+ telnet nacos-server 8848
878
+
879
+ # 查看健康状态
880
+ curl http://localhost:8080/actuator/health
881
+
882
+ # 查看 Nacos 服务发现信息
883
+ curl http://localhost:8080/actuator/nacos-discovery
884
+
885
+ # 查看 Nacos 配置信息
886
+ curl http://localhost:8080/actuator/nacos-config
887
+
888
+ # 启用调试日志(添加到 application.yml)
889
+ logging.level.com.alibaba.nacos=DEBUG
890
+ ```
891
+
892
+ ---
893
+
894
+ **何时使用此技能:**
895
+ - 配置新的 Avatar Boot 服务使用 Nacos
896
+ - 排查 Nacos 连接或配置问题
897
+ - 设置多环境配置
898
+ - 实现服务发现
899
+ - 设置动态配置管理
900
+ - 审查 Nacos 配置的最佳实践
901
+ - 从其他服务发现解决方案迁移