上一篇 OSS 模块相关的文章有说到版本升级之后 OSS 模块进行了重构,因为这一部分的代码写法我个人觉得是很值得学习的,因此有了今天这篇文章。
在准备本文的时候,相关方法有用到 Redis 发布订阅的功能,因此先对发布订阅功能进行了简单的分析,再回到这篇文章来。


显而易见的是,新版的代码量减少了。我们再来看看序列图,序列图省略了一些细节的方法调用,只保留了主要方法。


下面通过 debug 方式来看下 V4.2.0+ 版本的加载流程。
SystemApplicationRunner#run
基础数据的缓存都是在这个方法里面完成的。
SysOssConfigServiceImpl#init
这是初始化配置的主要方法:

此处设置的默认配置是 minio:

SysOssConfigServiceImpl#setConfigCache
每一个配置都使用 Spring Cache 缓存,并发布订阅消息。缓存结果如下:

OssFactory#init
这个方法打印了日志,并且订阅了默认配置的通道。
如果是单机部署,这里就已经执行结束了。
订阅的功能去请教了狮子大佬,这里是给 集群 用的,一个机器修改了配置,会通知其他机器。光说不练假把式,这里来实验一下,修改一下服务端口,启动两次,模拟一下集群。
目前的端口是 8080:

修改 idea 配置(我测试的版本是 2022.2):



配置完成后:

复制一个启动配置,设置启动端口号为 8181,并启动:


8181 服务启动完成后,发布订阅消息,8080 服务就会接收到。

8080 服务启动后,如果没有进行任何 OSS 操作直接启动 8181,则 if 判断为 false,没有初始化 OssClient,换句话说,getClient(configKey) 获取到的对象为空,所以不会刷新配置。
初始化是在上传时进行的,这个会放在下一篇文件上传流程时再详细展开,这里只演示 refresh 方法的逻辑。
操作步骤:
8080 服务。/系统管理/文件管理 上传一张图片(目的:完成 OssClient 初始化)。8181 服务。8080 服务接收订阅消息的逻辑。
刷新配置:

这里也是 new OssClient 再重新放到缓存里面。控制台打印:

如果不想启动两个服务也想看到效果的话,可以在配置管理里面新增默认配置或者修改默认配置的信息(注意是默认配置),也能进入 refresh 方法。