ソースを参照

优化配置中心,增加 ConfigFrameworkDAO 的抽象,进一步解耦 framework

YunaiV 4 年 前
コミット
8e67753a4b

ファイルの差分が大きいため隠しています
+ 523 - 30
sql/ruoyi-vue-pro.sql


+ 28 - 0
src/main/java/cn/iocoder/dashboard/framework/apollo/internals/ConfigFrameworkDAO.java

@@ -0,0 +1,28 @@
+package cn.iocoder.dashboard.framework.apollo.internals;
+
+import cn.iocoder.dashboard.modules.infra.dal.mysql.dataobject.config.InfConfigDO;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 配置 Framework DAO 接口
+ */
+public interface ConfigFrameworkDAO {
+
+    /**
+     * 查询是否存在比 maxUpdateTime 更新记录更晚的配置
+     *
+     * @param maxUpdateTime 最大更新时间
+     * @return 是否存在
+     */
+    boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime);
+
+    /**
+     * 查询配置列表
+     *
+     * @return 配置列表
+     */
+    List<InfConfigDO> getSysConfigList();
+
+}

+ 13 - 25
src/main/java/cn/iocoder/dashboard/framework/apollo/internals/DBConfigRepository.java

@@ -3,6 +3,7 @@ package cn.iocoder.dashboard.framework.apollo.internals;
 import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.dashboard.framework.apollo.core.ConfigConsts;
 import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.dashboard.modules.infra.dal.mysql.dao.config.InfConfigDAOImpl;
 import cn.iocoder.dashboard.modules.infra.dal.mysql.dataobject.config.InfConfigDO;
 import com.ctrip.framework.apollo.Apollo;
 import com.ctrip.framework.apollo.build.ApolloInjector;
@@ -14,12 +15,7 @@ import com.ctrip.framework.apollo.tracer.Tracer;
 import com.ctrip.framework.apollo.util.ConfigUtil;
 import com.ctrip.framework.apollo.util.factory.PropertiesFactory;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.jdbc.core.BeanPropertyRowMapper;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.datasource.DriverManagerDataSource;
 
-import javax.sql.DataSource;
-import java.sql.ResultSet;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
@@ -51,9 +47,9 @@ public class DBConfigRepository extends AbstractConfigRepository {
     private volatile Date maxUpdateTime;
 
     /**
-     * Spring JDBC 操作模板
+     * 配置读取 DAO
      */
-    private final JdbcTemplate jdbcTemplate;
+    private final ConfigFrameworkDAO configFrameworkDAO;
 
     public DBConfigRepository(String namespace) {
         // 初始化变量
@@ -61,9 +57,8 @@ public class DBConfigRepository extends AbstractConfigRepository {
         this.propertiesFactory = ApolloInjector.getInstance(PropertiesFactory.class);
         this.m_configUtil = ApolloInjector.getInstance(ConfigUtil.class);
         // 初始化 DB
-        DataSource dataSource = new DriverManagerDataSource(System.getProperty(ConfigConsts.APOLLO_JDBC_URL),
+        this.configFrameworkDAO = new InfConfigDAOImpl(System.getProperty(ConfigConsts.APOLLO_JDBC_URL),
                 System.getProperty(ConfigConsts.APOLLO_JDBC_USERNAME), System.getProperty(ConfigConsts.APOLLO_JDBC_PASSWORD));
-        this.jdbcTemplate = new JdbcTemplate(dataSource);
 
         // 初始化加载
         this.trySync();
@@ -84,6 +79,7 @@ public class DBConfigRepository extends AbstractConfigRepository {
         Properties newProperties = this.buildProperties(configs);
         this.m_configCache = newProperties;
         // 第三步,获取最大的配置时间
+        assert configs.size() > 0; // 断言,避免告警
         this.maxUpdateTime = configs.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime();
         // 第四部,触发配置刷新!重要!!!!
         super.fireRepositoryChange(m_namespace, newProperties);
@@ -145,24 +141,16 @@ public class DBConfigRepository extends AbstractConfigRepository {
      */
     private List<InfConfigDO> loadConfigIfUpdate(Date maxUpdateTime) {
         // 第一步,判断是否要更新。
-        boolean isUpdate = maxUpdateTime == null; // 如果更新时间为空,说明 DB 一定有新数据
-        if (!isUpdate) {
-            isUpdate = this.existsNewConfig(maxUpdateTime); // 判断数据库中是否有更新的配置
-        }
-        if (!isUpdate) {
-            return null;
+        if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
+            log.info("[loadConfigIfUpdate][首次加载全量配置]");
+        } else { // 判断数据库中是否有更新的配置
+            if (!configFrameworkDAO.selectExistsByUpdateTimeAfter(maxUpdateTime)) {
+                return null;
+            }
+            log.info("[loadConfigIfUpdate][增量加载全量配置]");
         }
         // 第二步,如果有更新,则从数据库加载所有配置
-        return this.getSysConfigList();
-    }
-
-    private boolean existsNewConfig(Date maxUpdateTime) {
-         return jdbcTemplate.query("SELECT id FROM inf_config WHERE update_time > ? LIMIT 1",
-                 ResultSet::next, maxUpdateTime);
-    }
-
-    private List<InfConfigDO> getSysConfigList() {
-        return jdbcTemplate.query("SELECT `key`, `value`, update_time, deleted FROM inf_config", new BeanPropertyRowMapper<>(InfConfigDO.class));
+        return configFrameworkDAO.getSysConfigList();
     }
 
 }

+ 39 - 0
src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/dao/config/InfConfigDAOImpl.java

@@ -0,0 +1,39 @@
+package cn.iocoder.dashboard.modules.infra.dal.mysql.dao.config;
+
+import cn.iocoder.dashboard.framework.apollo.internals.ConfigFrameworkDAO;
+import cn.iocoder.dashboard.modules.infra.dal.mysql.dataobject.config.InfConfigDO;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+
+import javax.sql.DataSource;
+import java.sql.ResultSet;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * ConfigFrameworkDAO 实现类
+ *
+ * @author 芋道源码
+ */
+public class InfConfigDAOImpl implements ConfigFrameworkDAO {
+
+    private final JdbcTemplate jdbcTemplate;
+
+    public InfConfigDAOImpl(String jdbcUrl, String username, String password) {
+        DataSource dataSource = new DriverManagerDataSource(jdbcUrl, username, password);
+        this.jdbcTemplate = new JdbcTemplate(dataSource);
+    }
+
+    @Override
+    public boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) {
+        return jdbcTemplate.query("SELECT id FROM inf_config WHERE update_time > ? LIMIT 1",
+                ResultSet::next, maxUpdateTime);
+    }
+
+    @Override
+    public List<InfConfigDO> getSysConfigList() {
+        return jdbcTemplate.query("SELECT `key`, `value`, update_time, deleted FROM inf_config", new BeanPropertyRowMapper<>(InfConfigDO.class));
+    }
+
+}