ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Nacos 默认数据源方言插件实现规范:内置数据库族、Mapper 覆盖与兼容性契约

Nacos 默认数据源方言插件实现规范:内置数据库族、Mapper 覆盖与兼容性契约 Nacos 默认数据源方言插件实现规范内置数据库族、Mapper 覆盖与兼容性契约【免费下载链接】nacosan easy-to-use dynamic service discovery, configuration and service management platform for building AI cloud native applications.项目地址: https://gitcode.com/GitHub_Trending/na/nacos导读本文聚焦 Nacos 随服务端发行包内置的数据源方言Database Dialect实现——位于plugin-default-impl/nacos-default-datasource-plugin模块它是 数据源方言插件规范 的内置实现集合。通过本文你将掌握Nacos 内置支持哪些数据库族、每个数据库族由哪些 Dialect 与表级 Mapper 组成、启动时如何通过配置选择数据库类型、以及这些内置实现在逻辑 schema、SQL 占位符、生成主键与 AI 资源 mapper 上的兼容性约束从而能在实际部署中正确选型数据库并规避升级迁移风险。范围持久化兼容层而非资源语义层内置数据源方言实现位于plugin-default-impl/nacos-default-datasource-plugin目录随 Nacos 服务端发行包一起发布提供数据库方言dialect和表级 mapper。它的定位是 数据源方言插件规范 的内置实现本质上是持久化兼容层persistence compatibility layer。一个关键边界是默认实现集合不得引入数据库特有的资源语义。数据库差异只体现在 SQL 语法层面分页、函数、生成主键、转义等Nacos 的业务语义、资源身份、鉴权与领域行为统一由上层 repository 与领域模块负责方言与 mapper 不做决定。内置数据库类型与 SPI 注册当前实现打包了四个数据库族每个数据库族对应一个独立 Maven 子模块数据库类型Dialect providerMapper 包derbyDerbyDatabaseDialectimpl.derbymysqlMysqlDatabaseDialect和DefaultDatabaseDialectimpl.mysqlpostgresqlPostgresqlDatabaseDialectimpl.postgresqloracleOracleDatabaseDialectimpl.oracle以源码印证路径均在plugin-default-impl/nacos-default-datasource-plugin下nacos-datasource-plugin-derby/.../impl/dialect/DerbyDatabaseDialect.java继承AbstractDatabaseDialectgetType()返回DatabaseTypeConstant.DERBYgetFunction()委托给TrustedDerbyFunctionEnumnacos-datasource-plugin-mysql/.../impl/dialect/MysqlDatabaseDialect.javagetType()返回MYSQL函数映射委托给TrustedMysqlFunctionEnum同一模块还包含DefaultDatabaseDialect因此 MySQL 族同时注册两个 Dialect providernacos-datasource-plugin-postgresql/.../impl/dialect/PostgresqlDatabaseDialect.java除函数映射外还重写了isDuplicateKeyException与分页 SQL详见下文nacos-datasource-plugin-oracle/.../impl/dialect/OracleDatabaseDialect.java对应TrustedOracleFunctionEnum。规范要求每个数据库包必须同时注册两个 SPI 文件即com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect和com.alibaba.nacos.plugin.datasource.mapper.Mapper。这在实际资源文件中得到确认例如nacos-datasource-plugin-mysql/src/main/resources/META-INF/services/下com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect内容为DefaultDatabaseDialect与MysqlDatabaseDialect两个类全名com.alibaba.nacos.plugin.datasource.mapper.Mapper内容为 9 个 mapper 实现类全名见下一节。其余三个数据库族derby / postgresql / oracle在各自模块的src/main/resources/META-INF/services/下同样各含这两个 SPI 文件。nacos-datasource-plugin-base子模块则承载各数据库族共享的基础设施AbstractDatabaseDialect默认分页与主键行为、BaseConfigInfoMapper、BaseConfigTagsRelationMapper、BaseGroupCapacityMapper、BaseTenantCapacityMapper、BaseTenantInfoMapper等 base mapper以及TrustedPostgresqFunctionEnum枚举。Mapper 覆盖范围每个内置数据库族都应提供以下 mapper 实现当前配置表config_info、config_info_gray、config_tags_relation、his_config_info容量与命名空间表tenant_info、tenant_capacity、group_capacityAI Registry 表AI 资源元数据AiResourceMapper和 AI 资源版本AiResourceVersionMapper。源码逐一对应以 MySQL 族为例nacos-datasource-plugin-mysql/.../impl/mysql/下包含ConfigInfoMapperByMySql、ConfigInfoGrayMapperByMySql、ConfigTagsRelationMapperByMySql、HistoryConfigInfoMapperByMySql、TenantInfoMapperByMySql、TenantCapacityMapperByMysql、GroupCapacityMapperByMysql、AiResourceMapperByMySql、AiResourceVersionMapperByMySql共 9 个实现且全部登记在 Mapper SPI 文件中。Derby、PostgreSQL、Oracle 族在各自impl.derby、impl.postgresql、impl.oracle包下有结构完全对称的实现集合。此外测试目录中存在*MapperCoverageTest如MySqlMapperCoverageTest、OracleMapperCoverageTest、PostgresqlMapperCoverageTest、DerbyMapperCoverageTest以及*AiResourceSearchSchemaResourceTest、*VisibilityPermissionSchemaResourceTest等 schema 资源测试从测试侧保证了 mapper 覆盖的完整性与资源模型对齐。3.3 版本线的迁移要求从 Nacos 3.3 版本线开始内置数据库族不再要求提供两类运行时 Config 迁移 mapper默认 namespace 存储重复记录的迁移legacy beta/tag 灰度表config_info_beta、config_info_tag的迁移。因此仍携带 pre-3.0config_info_beta或config_info_tag数据的部署必须在升级到依赖当前 mapper 集合的 3.3 服务端之前完成数据迁移迁移是升级前置动作而不是服务端运行时 mapper 的职责。PostgreSQL 族的测试中专门存在PostgresqlTenantMigrationScriptTest可见迁移脚本与测试是受控管理的。另一个前瞻性约定如果未来 Nacos 版本新增持久化表内置数据库族必须在该表成为文档化服务端能力之前补充对应 mapper——即 mapper 覆盖永远先于对外发布。启动选择方言类型配置与历史 aliasNacos 在启动时通过nacos.plugin.datasource-dialect.type选择数据库类型nacos.plugin.datasource-dialect.type${databaseType}其中${databaseType}取derby、mysql、postgresql或oracle之一。选择规则要点spring.sql.init.platform继续作为历史 alias兼容二者同时存在时标准 keynacos.plugin.datasource-dialect.type优先不再支持spring.datasource.platform该配置项已移除、不再读取选择类型为mysql时使用 MySQL mapper 与 MySQL 兼容的默认 dialect 行为这正是DefaultDatabaseDialect存在的意义选择类型为derby时Derby 仍是 standalone 开发和本地测试的嵌入式默认数据库当标准 key 与历史 alias 均未配置时沿用服务端存储默认值单机模式以及配置了-DembeddedStoragetrue的集群模式选择derby普通集群模式选择mysql。配置文件实证在 distribution/conf/application.properties 中可以看到标准配置骨架# The database dialect selected at startup. Legacy spring.sql.init.platform remains supported. # nacos.plugin.datasource-dialect.typemysql # spring.sql.init.platformmysql同时该文件还给出了 datasource 模块配置如nacos.plugin.datasource.db.num、nacos.plugin.datasource.db.url.0、nacos.plugin.datasource.db.user、nacos.plugin.datasource.db.password、nacos.plugin.datasource.db.query-timeout并注明当标准 key 与历史写法并存时nacos.plugin.datasource.db.*优先。需要特别说明的是方言类型属于互斥选择插件selector 只提供启动选择、需要重启生效该类型的持久化状态不能替代静态选择运行时 status API 必须拒绝选择变更。兼容性约束与内置方言的 critical 语义内置实现必须遵守以下兼容性契约保持 Nacos 逻辑 schema不同数据库族之间表名与列语义保持一致不得因数据库差异改变逻辑 schema 或 资源模型保持 SQL 占位符与参数顺序与 repository 代码兼容运行时值使用占位符 SQL保持插入操作期望的生成主键列方言通过getReturnPrimaryKeys()返回生成主键列AbstractDatabaseDialect返回PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS保持 AI 资源 mapper 行为与资源模型对齐当某个数据库族需要 schema 变化时补充迁移说明。critical 状态语义datasource-dialect类型加载后属于critical当前选中的内置方言不能通过运行时插件状态禁用但其他已加载的内置方言不会仅因为存在就分别成为 critical。也就是说critical 属性绑定在被选中的那个方言上而非所有已发现方言。方言不持有数据源连接配置内置方言实现不持有数据源连接或连接池配置。它们通过DatabaseDialect继承PluginConfigSpec但不声明 definitions因此以configurablefalse暴露。原因是连接凭据和连接池参数属于服务端唯一数据源而不是分别属于每个已加载方言datasource 模块配置由上层 数据源方言插件规范 定义统一使用nacos.plugin.datasource.db.{item}前缀。分页与重复键判定的方言差异源码级示例AbstractDatabaseDialect提供了 MySQL 风格默认实现getLimitTopSqlWithMark返回sql LIMIT ? getLimitPageSqlWithMark返回sql LIMIT ?,? getLimitPageSql返回LIMIT offset, size。PostgreSQL 方言则在 PostgresqlDatabaseDialect.java 中重写为OFFSET ? LIMIT ?语法——这正是“同一逻辑操作、不同方言 SQL”的典型体现。在唯一键冲突判定上父规范定义了统一入口isDuplicateKeyException(Throwable)默认实现遍历异常因果链识别 SpringDuplicateKeyException并通过类名匹配避免数据源插件模块引入 Spring 依赖同时刻意不将裸的厂商 SQLState 本身当作重复。PostgreSQL 方言在此基础上进一步检查驱动抛出的SQLException的 SQLState 是否为23505unique_violation从而覆盖 Spring 异常转换不够精确的场景代码如下private static final String UNIQUE_VIOLATION_SQL_STATE 23505; Override public boolean isDuplicateKeyException(Throwable throwable) { if (super.isDuplicateKeyException(throwable)) { return true; } Throwable cause throwable; while (cause ! null) { if (cause instanceof SQLException UNIQUE_VIOLATION_SQL_STATE.equals(((SQLException) cause).getSQLState())) { return true; } cause cause.getCause(); } return false; }分类必须保持保守——非重复的完整性约束失败不得被误报为重复。对应的PostgresqlDatabaseDialectTest与各Trusted*FunctionEnumTest从测试侧锁定了这些行为。小结Nacos 默认数据源方言插件实现以“一套逻辑 schema 多数据库方言”为核心设计DerbyDatabaseDialect、MysqlDatabaseDialect/DefaultDatabaseDialect、PostgresqlDatabaseDialect、OracleDatabaseDialect分别对应四个内置数据库族每个族通过DatabaseDialect与Mapper双 SPI 文件注册完整的表级 mapper配置、灰度、标签、历史、命名空间、容量与 AI Registry 表。部署时通过nacos.plugin.datasource-dialect.type静态选择数据库类型未配置时按单机/集群模式隐式回退derby/mysql升级到 3.3 前必须完成 pre-3.0config_info_beta/config_info_tag数据迁移。理解这些边界逻辑 schema 稳定、占位符与参数顺序兼容、生成主键保留、critical 只绑定选中方言、方言不持有连接配置是正确选型与平滑升级 Nacos 持久层的前提。延伸阅读数据源方言插件规范本实现的上层父规范涵盖 SPI 方法要求、选择与状态规则、完整的 datasource 模块配置表资源模型AI 资源 mapper 行为对齐的语义基础持久化与 Dump 规范持久化与 dump 边界定义源码实现nacos-default-datasource-plugin 模块含 base / derby / mysql / oracle / postgresql 五个子模块及其测试配置示例distribution/conf/application.properties。【免费下载链接】nacosan easy-to-use dynamic service discovery, configuration and service management platform for building AI cloud native applications.项目地址: https://gitcode.com/GitHub_Trending/na/nacos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表