
每家商户都有独立数据源,没有使用微服务, 一台 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 是件麻烦事儿 |