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