hyperf 通过 nacos 统一管理多数据库连接配置,将 database.php 中的 connections 抽离为多个 yaml 格式 data id(如 hyperf-database-default),并在 config_center.php 中声明监听,启动时自动合并至全局配置,代码中仍用 connection('log_db') 等方式调用,实现配置与代码解耦。

Hyperf 用 Nacos 配置中心托管多数据库连接参数,核心是把原本写死在 config/autoload/database.php 里的连接配置(比如 default、log_db、report_db)抽出来,统一交由 Nacos 管理。这样不同环境(开发/测试/生产)只需改 Nacos 里的 YAML 内容,无需动代码或部署包。
一、Nacos 中定义多库连接配置
在 Nacos 控制台新建多个 Data ID,推荐按用途命名,例如:
- hyperf-database-default:主业务库
- hyperf-database-log:日志库
- hyperf-database-report:报表库(可为 PostgreSQL)
每个 Data ID 内容为 YAML 格式,示例(hyperf-database-log):
connections:
log_db:
driver: mysql
host: 192.168.1.100
port: 3306
database: log_center
username: log_user
password: 'xxx'
charset: utf8mb4
注意:connections 是顶层键,内部结构需与 Hyperf 原 database.php 的 connections 数组完全一致,包括嵌套层级和字段名。
二、Hyperf 主动加载这些配置集
修改 config/autoload/config_center.php 中的 drivers.NacosDriver.listener_config,显式声明要拉取哪些 Data ID:
'listener_config' => [
[
'tenant' => env('NACOS_NAMESPACE', ''),
'group' => env('NACOS_GROUP', 'DEFAULT_GROUP'),
'data_id' => 'hyperf-database-default',
'type' => 'yaml',
],
[
'tenant' => env('NACOS_NAMESPACE', ''),
'group' => env('NACOS_GROUP', 'DEFAULT_GROUP'),
'data_id' => 'hyperf-database-log',
'type' => 'yaml',
],
[
'tenant' => env('NACOS_NAMESPACE', ''),
'group' => env('NACOS_GROUP', 'DEFAULT_GROUP'),
'data_id' => 'hyperf-database-report',
'type' => 'yaml',
],
],
Hyperf 启动时会自动合并这些 YAML 到全局配置,最终形成完整的 database.connections 结构。
三、代码中使用多库连接不需硬编码
配置生效后,所有 Db 操作仍通过 connection() 切换,逻辑不变:
- 查日志库:
Db::connection('log_db')->table('logs')->get() - 事务走报表库:
Db::connection('report_db')->transaction(...) - Eloquent 模型指定连接:
protected $connection = 'log_db';
关键是——连接名(如 log_db)和它的具体参数(host/port/database 等)已完全解耦:前者写在代码里(稳定),后者全由 Nacos 动态下发(可变)。
四、安全与维护建议
敏感字段如 password 不建议明文存 Nacos。可行做法:
- 用 Nacos 的加密配置能力(配合自定义解密插件)
- 密码通过环境变量注入,Nacos 配置中只留占位符,再用 Hyperf 的配置预处理机制替换
- 数据库账号按库隔离权限,例如
log_user只能访问log_center库
每次修改 Nacos 配置后,Hyperf 会在设定轮询间隔(如 5 秒)内自动更新内存中的连接参数,无需重启服务。











