每家商户都有独立数据源,没有使用微服务, 一台 nginx+多台应用服务, 如果修改了商户数据源密码或者连接信息,怎么通知到应用服务的 DataSource 刷新;
1
npe 2020-03-20 09:43:38 +08:00 via iPhone
租户的连接信息、账号密码单独存放在表 T,程序里面通过表 T 连接相应的数据源
|
2
stonezing OP @npe 你说的是初始化加载, 现在问题是系统在运行, 租户的数据库密码被修改了, 怎么处理, 我有多台服务都要相应同步到, 除了重起服务方式。
|
3
z960112559 2020-03-20 14:18:20 +08:00
重新加载数据源
|
4
z960112559 2020-03-20 14:27:02 +08:00
按一楼说的,修改账号密码后肯定会报错,捕获异常,根据表内账号密码重新加载数据源
|
5
ElmerZhang 2020-03-20 14:40:30 +08:00
数据库用户名密码存储在配置中心(比如阿里开源的 Nacos ),写个 Listener 监听配置变化重建数据库连接。
|
6
ourslay 2020-03-20 15:45:01 +08:00
写了一个 demo 可以参考下。https://github.com/oursy/spring-boot-datasource-refresh.git
|
7
stonezing OP @ourslay
@ElmerZhang @z960112559 主库里记录着所有租户的数据库连接信息, 现在是两台服务,接 nginx 负载,也就是修改了数据库租户的用户名密码后, 两台都要重新加载, 捕获异常也可以是, 但是如果改的是数据库的连接池信息呢,,有什么方案可以刷新这个 datasource 的对象 |
8
gz911122 2020-03-20 16:41:28 +08:00
配置中心了解一下
比如 Apollo |
9
ourslay 2020-03-20 16:49:49 +08:00
@stonezing 你只需把 demo 里面读取数据连接部分替换成读取租户的数据库连接,接下来遍历您的服务实例发送 `/actuator/refresh` 请求。下次请求时候连接池将获得一个新 URL 的连接。
|
10
buliugu 2020-03-21 00:50:13 +08:00
这个似乎更适合 gaea 之类的中间件去做,应用层刷新 datasource 是件麻烦事儿
|