LightESB MysqlRouteSrv:externaldb 外部数据库支持实践

0 阅读3分钟

一分钟速览

  • 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-datasource
  • extdb.config
  • extdb.route.targets

这个命名约定使路由可以通过占位符完成目标库切换。

3) timer 路由接入 SQL 组件

来自 mysql-healthcheck-route.xml

<from uri="timer://mysql-healthcheck?fixedRate=true&amp;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&amp;outputType=SelectOne"/>

同一套数据源引用方式还用于:

  • insert into testexdb (...)
  • select ... from testexdb where ID=:#ID
  • delete 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=1
  • testexdb 的插入/查询/删除链路全部成功

3) 校验目标库切换

将:

mysqlroute.target.datasource=primary

改为:

mysqlroute.target.datasource=archive

然后重载服务并再次检查日志。若 extdb.archive.* 已完整配置,日志中的 target=... 应跟随切换。

常见问题与排查

1) No bean could be found in the registry

重点检查:

  • system.components 是否包含 externaldb
  • extdb.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
  • 路由稳定、目标库可配置切换

当你希望“一份路由、多环境多目标库”时,这套模式可以直接迁移到其他服务。

Links