一分钟速览
MysqlRouteSrv@v1.0.0通过system.components=externaldb启用外部数据库组件。- 服务级
extdb.*配置来自service.config.properties,可覆盖通用默认配置。 - 动态数据源会注册为
extdb-<id>-datasource,供 Camel SQL 路由直接引用。 - 内置 timer 路由每 60 秒执行一次
select/insert/query/delete,用于连通性与读写闭环验证。
元信息
- 适用版本:
MysqlRouteSrv@v1.0.0 - 关联服务:
MysqlRouteSrv@v1.0.0@mysql-healthcheck-route.xml
背景与目标
在多服务环境中,数据库地址、账号和目标库常随环境变化。如果把数据源写死在 XML 路由里,切换成本高、回归风险大。
externaldb 的目标是把“目标库选择”从路由移到配置层:
- 保持 SQL 路由结构稳定。
- 在 Camel Registry 动态注册数据源。
- 通过属性切换路由目标库,而不是改路由代码。
在 MysqlRouteSrv v1.0.0 中,这套机制用于定时验证 MySQL 连通性和基础读写流程。
路由与配置说明
1) 组件启用与配置优先级
来自 lightesb-camel-app/MysqlRouteSrv/v1.0.0/common.config.properties:
system.components=externaldb
来自 lightesb-camel-app/MysqlRouteSrv/v1.0.0/service.config.properties:
extdb.enabled=true
extdb.default=primary
extdb.ids=primary
extdb.primary.type=mysql
extdb.primary.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
extdb.primary.driver=com.mysql.cj.jdbc.Driver
extdb.primary.username=root
extdb.primary.password=nghxni
extdb.primary.maxPoolSize=10
mysqlroute.target.datasource=primary
配置来源模型:
common.config.properties:通用默认配置service.config.properties:服务级覆盖配置- 生效优先级:服务级覆盖通用级
2) Camel Registry 中的动态 Bean 命名
externaldb 加载成功后,可使用以下 Bean:
extdb-<id>-datasource(例如extdb-primary-datasource)extdb-default-datasourceextdb.configextdb.route.targets
这个命名约定使路由可以通过占位符完成目标库切换。
3) timer 路由接入 SQL 组件
来自 mysql-healthcheck-route.xml:
<from uri="timer://mysql-healthcheck?fixedRate=true&period=60000"/>
<setHeader name="db.target">
<simple>{{mysqlroute.target.datasource}}</simple>
</setHeader>
<to uri="sql:select 1 as db_ok?dataSource=#bean:extdb-{{mysqlroute.target.datasource}}-datasource&outputType=SelectOne"/>
同一套数据源引用方式还用于:
insert into testexdb (...)select ... from testexdb where ID=:#IDdelete from testexdb where ID=:#ID
这样可以做到“SQL 路由不改、目标库按配置切换”。
请求与响应示例
MysqlRouteSrv v1.0.0 是定时触发模型(HTTP.Listener=false),因此验证重点是启动与运行日志。
1) 启动服务进程
..\start.bat
在 lightesb-camel 目录执行上级目录的 start.bat 即可拉起服务,然后继续做下方日志校验。
2) 校验路由执行日志
预期日志模式(与 logs/mysql-healthcheck-route.log 一致):
- 健康检查开始日志含
target=primary select 1返回result=1testexdb的插入/查询/删除链路全部成功
3) 校验目标库切换
将:
mysqlroute.target.datasource=primary
改为:
mysqlroute.target.datasource=archive
然后重载服务并再次检查日志。若 extdb.archive.* 已完整配置,日志中的 target=... 应跟随切换。
常见问题与排查
1) No bean could be found in the registry
重点检查:
system.components是否包含externaldbextdb.enabled是否为true- 目标 id 是否包含在
extdb.ids - SQL URI 是否正确拼接为
extdb-{{xxx.target.datasource}}-datasource
2) 健康检查执行但 SQL 失败
重点检查:
- MySQL URL/driver/username/password 是否有效
- 目标库中是否存在
testexdb表 - 账号是否具备
insert/select/delete权限
3) 切换数据源后未生效
重点检查:
- 新 id 的
extdb.<id>.*是否完整 - 服务重载是否完成
- 日志中的
db.target是否为预期 id
4) 默认库与预期不一致
重点检查:
extdb.default的值mysqlroute.target.datasource的路由级覆盖关系
如果路由级覆盖缺失,系统可能回退到默认 id。
总结
MysqlRouteSrv v1.0.0 给出了 LightESB 外部数据库接入的一套可复用基线:
- 组件级启用(
externaldb) - 服务级数据源模型(
extdb.*) - Camel Registry 动态绑定(
extdb-<id>-datasource) - 路由稳定、目标库可配置切换
当你希望“一份路由、多环境多目标库”时,这套模式可以直接迁移到其他服务。