16. 把 DDD 开源脚手架化为自己的:第四次联调(二)——「为什么 12 章不能测」:一个 jet-ddd-common 引出的配置连环坑

16. 把 DDD 开源脚手架化为自己的:第四次联调(二)------「为什么 12 章不能测」:一个 jet-ddd-common 引出的配置连环坑

上一篇回归到第 12 章就卡死了------8081(project 微服务)明明起来了,就是测不动。这章不能测,表面看是环境起不来,根子却是前面埋下的一笔烂账:为了 sa-token 共用,图省事写了个 jet-ddd 配置,结果 project 连的是另一个库,两个微服务还被命名成了同一个 jet-ddd。

这一篇讲怎么把这团乱麻理清楚 :提出 jet-ddd-common 存公用信息(redis / mq / 签名开关),每个微服务再各自挂自己名字对应的库配置;后缀统一成 yml、application.yml 只留功能性配置、mysql 抽进 common。改完启动,又撞上 Failed to configure a DataSource 和 NACOS_SERVER_ADDR 这两道坎。

这是第四次联调的第二篇。核心就一句:公用配置和专属配置必须分家,服务名不能撞,dataId 不能混------这也是那个「为什么 12 章不能测」的答案上半段。

一、先想明白:第 12 章到底为什么测不了

我一直在好奇为什么不能测试 12 章?这里就要好的程序员来思考了。如果使用 AI,可能要浪费很多的 Token,我也不确定它能不能想到。

直接原因是,前面为了 sa-token 这些要共用,所以编写了 jet-ddd 配置文件,但是 project 项目连接的数据库是另一个。这时还是要提取共用的。当时的错误也是要说的,就是将两个微服务都命名为 jet-ddd,这都是不对的------ai 在这方面还是不行的。

解决方案就是:

arduino 复制代码
我一直在好奇为什么不能测试12章?这里就要好的程序员来思考了。如果使用AI,可能要浪费很多的Token。我也不确定能不能想到。
直接原因是,前面为了sa-token这些要共用,所以编写了jet-ddd配置文件,但是project项目连接的数据库是另一个。这时还是要提取共用的,当时的错误也是要说的,就是将两个微服务都命名为jet-ddd,这都是不对的。ai在这方面还是不行的。
解决方案就是:
1、提取jet-ddd-common配置,里面存放redis,mq等公用信息,就是jet-ddd中的公用信息
2、每个微服务都有自己的名字对应的配置,这里面则是连接自己的数据库。
 - optional:nacos:jet-ddd-common.yml
 - optional:nacos:${spring.application.name}.yml
 
3、前面叫使用${spring.application.name}.yml
为什么网关还是这样- optional:nacos:jet-ddd-gateway.yml
现在每个都加上,然后在nacos中配置
4、将微服务中 prod dev的yml去掉

这里说清楚第 3 点的自相矛盾:之前裁定过用 ${spring.application.name}.yml,可网关那份却还是写死的 jet-ddd-gateway.yml。要么全按约定用服务名,要么就别搞两套------这次统一都在 nacos 里配好,各服务引各自的。第 4 点也顺手把 prod / dev 那两套 yml 去掉,只留一套唯一配置。

二、配置归位:公共进 common,后缀统一 yml

先把几个具体的挪动交代下去:apiauth-config.yaml 并进 jet-ddd-common,代码里对应的引用移除;nacos 里由我来操作;所有后缀统一 yml,别再混着写 yaml。

arduino 复制代码
1、apiauth-config.yaml -> 放到 jet-ddd-common中去,代码里面的移除
2、对nacos中你来操作
3、所有后缀都是yml不要再写yaml这种

接着是配置该放哪的问题------springdoc、knife4j 这类明显是全系统通用的,凭什么不放进 common?而且 paths-to-match: /**、packages-to-scan: vip.wayhua.jet.ddd.rbac 这种本该按包自动扫,根本不用配。定个规矩:application.yml 里只放 server 端口这类功能性配置,其余一律走 nacos。

yaml 复制代码
springdoc:
  api-docs:
    path: /v3/api-docs
  swagger-ui:
    path: /swagger-ui.html
  group-configs:
    - group: default
      paths-to-match: /**
      packages-to-scan: vip.wayhua.jet.ddd.rbac  

knife4j:
  enable: true
  setting:
    language: zh_cn


 这些难道不是放common?再说paths-to-match: /**
      packages-to-scan: vip.wayhua.jet.ddd.rbac  这个应该不用配置吧
      
这样吧,application.yml中只放这种类似的功能,其他的不放这里
server:
  port: 8080

spring:
  # 接口签名认证开关(auth.sign.enabled / auth.api-key.enabled),文件缺失时静默跳过
  config:
    import:
      # 公共配置(redis / mq / sa-token / 签名开关 等全系统公用信息,nacos dataId=jet-ddd-common.yml;
      # 原 classpath:apiauth-config.yaml 已并入公共配置,2026-09-26 用户裁定)
      - optional:nacos:jet-ddd-common.yml
      # 本服务专属配置(数据库等;nacos dataId = 服务名,2026-09-26 用户裁定恢复 ${spring.application.name} 约定,
      # 取代 2026-09-24「禁止 ${spring.application.name} 间接引用」旧裁定------旧口径导致多服务共用 dataId 连错库)
      - optional:nacos:${spring.application.name}.yml
  application:
    # 全局唯一服务名(nacos 注册名 = 它;网关 lb:// 与 @FeignClient name 与之一致)
    name: jet-ddd-service-rbac
  cloud:
    nacos:
      discovery:
        # 命名空间 ID = ddd(与网关 / project 必须同命名空间才能被发现)
        namespace: ddd
        server-addr: ${NACOS_SERVER_ADDR:192.168.55.130:8848}
        enabled: true
      config:
        # 配置中心:公共配置 dataId=jet-ddd-common.yml + 本服务配置 dataId=jet-ddd-service-rbac.yml,
        # 本地仅保留「连接 nacos」这一最小集
        namespace: ddd
        server-addr: ${NACOS_SERVER_ADDR:192.168.55.130:8848}
        file-extension: yml
        group: DEFAULT_GROUP
        enabled: true

补充一句这里最关键的裁定变化:spring.application.name 约定是恢复 用的------之前(2026-09-24)明令禁止过 ${spring.application.name} 间接引用,结果就是多个微服务共用同一个 dataId、连错库。这次把它改回来,让每个服务的数据源配置各自独立,本地只留「连接 nacos」这一份最小集。

三、mysql 抽进 common,具体 yaml 只留自己的库

把 mysql 相关的连接信息也收进 jet-ddd-common,具体某个服务的 yaml 里就只剩一个 jet.mysql 段,指到自己的 ip / port / database:

yaml 复制代码
我将mysql配置相关信息移到了jet-ddd-common
具体的yaml只用:
jet:
  mysql:
    ip: 192.168.55.130
    port: 3306
    driverClassName: com.mysql.cj.jdbc.Driver
    database: rbac
    username: root
    password: Ivy@2024
    

配置拆分到这一步,公共 / 专属的边界算是划清了。剩下的,就是改完能不能起得来。

四、改完起不来:DataSource 配不上,还怀疑到 NACOS_SERVER_ADDR

第一次启动直接 APPLICATION FAILED TO START,报的是 DataSource 的 url 没配、也没内嵌库可用------典型的专属库配置没被加载进来:

vbnet 复制代码
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2026-09-26 18:37:51.775 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporter -

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
        If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
        If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

2026-09-26 18:37:51.779 [Thread-7] INFO  c.a.n.c.http.HttpClientBeanHolder - [HttpClientBeanHolder] Start destroying common HttpClient
2026-09-26 18:37:51.781 [Thread-7] INFO  c.a.n.c.http.HttpClientBeanHolder - [HttpClientBeanHolder] Completed destruction of HttpClient
2026-09-26 18:37:51.781 [Thread-1] INFO  c.a.n.c.executor.ThreadPoolManager - [ThreadPoolManager] Start destroying ThreadPool
2026-09-26 18:37:51.781 [Thread-9] INFO  c.a.nacos.common.notify.NotifyCenter - [NotifyCenter] Start destroying Publisher

改了代码再试,还是一模一样的错------这说明问题根本不在业务代码,而在这份被加载的 nacos 配置本身:

vbnet 复制代码
你改代码了吗?还这样。***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
        If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
        If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

2026-09-26 19:24:30.720 [Thread-9] INFO  c.a.nacos.common.notify.NotifyCenter - [NotifyCenter] Start destroying Publisher
2026-09-26 19:24:30.721 [Thread-9] INFO  c.a.nacos.common.notify.NotifyCenter - [NotifyCenter] Completed destruction of Publisher
2026-09-26 19:24:30.720 [Thread-1] INFO  c.a.n.c.executor.ThreadPoolManager - [ThreadPoolManager] Start destroying ThreadPool
2026-09-26 19:24:

于是把怀疑指向那行占位符 ${NACOS_SERVER_ADDR:192.168.55.130:8848}------是不是它没生效、导致配置压根没拉下来?

bash 复制代码
和这个有没有关系  ${NACOS_SERVER_ADDR:192.168.55.130:8848}

顺带说一句 ${NACOS_SERVER_ADDR:192.168.55.130:8848} 这个写法:冒号后面是默认值,环境变量 NACOS_SERVER_ADDR 没设就用 192.168.55.130:8848。所以它本身不该是拦路的原因------真正卡住启动的,是 nacos 里的配置根本没被正确解析出来。而解析失败的那一下,报的是一段很长的 MalformedInputException。这段报错栈怎么读、根子挖到哪,是下一篇的正题。

五、小结

「为什么 12 章不能测」的上半段,全是配置拆分的账:

  1. 公用配置和专属配置必须分家 :提 jet-ddd-common.yml 存 redis / mq / sa-token / 签名开关 / mysql 连接参数这些全系统公用信息;每个微服务再各挂 ${spring.application.name}.yml 指自己的库。本地只留「连接 nacos」的最小集。
  2. 服务名 / dataId 不能撞 :两个微服务都叫 jet-ddd、共用一个 dataId 连错库,是 12 章测不动的根因。这次恢复 ${spring.application.name} 约定,就是为了拆开------spring.application.name 是注册中心唯一标识,网关 lb://、@FeignClient name 都得跟它一致。
  3. 一套源码不搞两套配置 :prod / dev 两套 yml 去掉,后缀统一 yml 别混 yaml;springdoc / knife4j 这类进 common,paths-to-match / packages-to-scan 本可自动扫不用写死;application.yml 只留 server 端口这类功能性配置。
  4. 改完起不来先看配置加载 :Failed to configure a DataSource: url not specified 不是业务代码的锅,改代码没用;别急着怀疑 ${NACOS_SERVER_ADDR:默认值},它只是带默认值的占位符。真正的坑在 nacos 配置被解析失败------下一篇顺着那段 MalformedInputException 挖到根。

下一篇,一坨 MalformedInputException,最后查出来是 yml 里的中文注释。

相关推荐
IT枫斗者枫哥1 小时前
AI返回合法JSON,字段就可信吗?给抽取结果补一道业务校验
java·人工智能·后端
旋生万物1 小时前
素数螺旋映射 $z_n=n^{1+i}$ 的角分布统计检验与零模型对比
大数据·前端·人工智能·算法·云原生·螺旋生成论·螺旋相位
天天被压力1 小时前
【别再到处找免费股票数据API了:官方204个接口,32篇一次讲透 #06】Python实时行情总报错?五档盘口+逐笔一次跑通
java·人工智能·python
智能RPA1 小时前
农业与矿业行业智能体自动化平台对比评测(计量与巡检场景)
运维·人工智能·python·自动化·agent·rpa
easyeye1231 小时前
用开源的Toonflow和MiniMax H3一步步复刻万妖
人工智能
byte轻骑兵1 小时前
VCP核心缩写概览
人工智能·音视频·le audio·低功耗蓝牙音频
茶杯6751 小时前
AI重构电商视觉生产 极睿科技AGI Ecpro助力行业数字化升级
人工智能·ai重构电商·极睿科技·agi ecpro·极睿科技—agi ecpro
liferecords1 小时前
笔记本硬跑 744B 大模型:GitHub 上的『蜂鸟』把 SSD 当显存用
人工智能·开源·大模型·推理优化
果霸大叔1 小时前
文本分块原理深度剖析(四):为什么分块决定检索质量
人工智能
sg_knight1 小时前
ZCode Bug 定位实战:把报错丢给 ZCode,它是怎么修的
llm·bug·agent·ai编程·glm·智谱·zcode