nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

一.插件实现

  1.插件目录结构

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

  2.pom依赖

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

        <dependency>             <groupId>com.alibaba.nacos</groupId>             <artifactId>nacos-datasource-plugin</artifactId>             <version>2.2.4</version>         </dependency>         <dependency>             <groupId>org.springframework</groupId>             <artifactId>spring-jdbc</artifactId>             <version>3.1.3.RELEASE</version>         </dependency>         <!-- 达梦 -->         <dependency>             <groupId>com.dameng</groupId>             <artifactId>Dm8JdbcDriver18</artifactId>             <version>8.1.1.49</version>         </dependency>         <!-- 瀚高 -->         <dependency>             <groupId>com.highgo</groupId>             <artifactId>HgdbJdbc</artifactId>             <version>6.2.2</version>         </dependency>         <!--人大金仓 -->         <dependency>             <groupId>com.kingbase</groupId>             <artifactId>kingbase8</artifactId>             <version>8.2.0</version>         </dependency>

View Code

  3.代码实现

  3.1.DataSourceConstant

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

public class DataSourceConstant {     public static final String MYSQL = "mysql";          public static final String DERBY = "derby";      public static final String DM="dm";      public static final String HIGHGO="highgo";      public static final String KINGBASE="kingbase";  }

View Code

  3.2.公共方法

   3.2.1.AbstractConfigInfoAggrMapperCommon
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.common;  import com.alibaba.nacos.plugin.datasource.constants.TableConstant; import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoAggrMapper;   public abstract class AbstractConfigInfoAggrMapperCommon extends AbstractMapper implements ConfigInfoAggrMapper {      @Override     public String batchRemoveAggr(int datumSize) {         final StringBuilder placeholderString = new StringBuilder();         for (int i = 0; i < datumSize; i++) {             if (i != 0) {                 placeholderString.append(", ");             }             placeholderString.append('?');         }         return "DELETE FROM config_info_aggr WHERE data_id = ? AND group_id = ? AND tenant_id = ? AND datum_id IN ("                 + placeholderString + ")";     }      @Override     public String aggrConfigInfoCount(int size, boolean isIn) {         StringBuilder sql = new StringBuilder(                 "SELECT count(*) FROM config_info_aggr WHERE data_id = ? AND group_id = ? AND tenant_id = ? AND datum_id");         if (isIn) {             sql.append(" IN (");         } else {             sql.append(" NOT IN (");         }         for (int i = 0; i < size; i++) {             if (i > 0) {                 sql.append(", ");             }             sql.append('?');         }         sql.append(')');          return sql.toString();     }      public String findConfigInfoAggrIsOrdered() {         return "SELECT data_id,group_id,tenant_id,datum_id,app_name,content FROM "                 + "config_info_aggr WHERE data_id = ? AND group_id = ? AND tenant_id = ? ORDER BY datum_id";     }      public String findConfigInfoAggrByPageFetchRows(int startRow, int pageSize) {         return "SELECT data_id,group_id,tenant_id,datum_id,app_name,content FROM config_info_aggr WHERE data_id= ? AND "                 + "group_id= ? AND tenant_id= ? ORDER BY datum_id LIMIT " + pageSize + " OFFSET " + startRow;     }      public String findAllAggrGroupByDistinct() {         return "SELECT DISTINCT data_id, group_id, tenant_id FROM config_info_aggr";     }      public String getTableName() {         return TableConstant.CONFIG_INFO_AGGR;     }  }

View Code

   3.2.2.AbstractConfigInfoBetaMapperCommon
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.common;  import com.alibaba.nacos.plugin.datasource.constants.TableConstant; import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoBetaMapper;   public abstract class AbstractConfigInfoBetaMapperCommon extends AbstractMapper implements ConfigInfoBetaMapper {      public String updateConfigInfo4BetaCas() {         return "UPDATE config_info_beta SET content = ?,md5 = ?,beta_ips = ?,src_ip = ?,src_user = ?,gmt_modified = ?,app_name = ? "                 + "WHERE data_id = ? AND group_id = ? AND tenant_id = ? AND (md5 = ? or md5 is null or md5 = '')";     }      public String findAllConfigInfoBetaForDumpAllFetchRows(int startRow, int pageSize) {         return " SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,beta_ips,encrypted_data_key "                 + " FROM ( SELECT id FROM config_info_beta  ORDER BY id LIMIT " + pageSize + " OFFSET " + startRow                 + " )" + "  g, config_info_beta t WHERE g.id = t.id ";     }      public String getTableName() {         return TableConstant.CONFIG_INFO_BETA;     } }

View Code

   3.2.3.AbstractConfigInfoTagMapperCommon
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.common;  import com.alibaba.nacos.plugin.datasource.constants.TableConstant; import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoTagMapper;  public abstract class AbstractConfigInfoTagMapperCommon extends AbstractMapper implements ConfigInfoTagMapper {       public String updateConfigInfo4TagCas() {         return "UPDATE config_info_tag SET content = ?, md5 = ?, src_ip = ?,src_user = ?,gmt_modified = ?,app_name = ? "                 + "WHERE data_id = ? AND group_id = ? AND tenant_id = ? AND tag_id = ? AND (md5 = ? OR md5 IS NULL OR md5 = '')";     }       public String findAllConfigInfoTagForDumpAllFetchRows(int startRow, int pageSize) {         return " SELECT t.id,data_id,group_id,tenant_id,tag_id,app_name,content,md5,gmt_modified "                 + " FROM (  SELECT id FROM config_info_tag  ORDER BY id LIMIT " + pageSize + " OFFSET " + startRow                 + " ) " + "g, config_info_tag t  WHERE g.id = t.id  ";     }       public String getTableName() {         return TableConstant.CONFIG_INFO_TAG;     }  }

View Code

   3.2.4.AbstractConfigTagsRelationMapperCommon
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.common;  import com.alibaba.nacos.common.utils.StringUtils; import com.alibaba.nacos.plugin.datasource.constants.TableConstant; import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; import com.alibaba.nacos.plugin.datasource.mapper.ConfigTagsRelationMapper;  import java.util.Map;  public abstract class AbstractConfigTagsRelationMapperCommon extends AbstractMapper implements ConfigTagsRelationMapper {       public String findConfigInfo4PageCountRows(final Map<String, String> params, final int tagSize) {         final String appName = params.get("appName");         final String dataId = params.get("dataId");         final String group = params.get("group");         StringBuilder where = new StringBuilder(" WHERE ");         final String sqlCount = "SELECT count(*) FROM config_info  a LEFT JOIN config_tags_relation b ON a.id=b.id";         where.append(" a.tenant_id=? ");         if (StringUtils.isNotBlank(dataId)) {             where.append(" AND a.data_id=? ");         }         if (StringUtils.isNotBlank(group)) {             where.append(" AND a.group_id=? ");         }         if (StringUtils.isNotBlank(appName)) {             where.append(" AND a.app_name=? ");         }         where.append(" AND b.tag_name IN (");         for (int i = 0; i < tagSize; i++) {             if (i != 0) {                 where.append(", ");             }             where.append('?');         }         where.append(") ");         return sqlCount + where;     }       public String findConfigInfo4PageFetchRows(Map<String, String> params, int tagSize, int startRow, int pageSize) {         final String appName = params.get("appName");         final String dataId = params.get("dataId");         final String group = params.get("group");         StringBuilder where = new StringBuilder(" WHERE ");         final String sql = "SELECT a.id,a.data_id,a.group_id,a.tenant_id,a.app_name,a.content FROM config_info  a LEFT JOIN "                 + "config_tags_relation b ON a.id=b.id";          where.append(" a.tenant_id=? ");          if (StringUtils.isNotBlank(dataId)) {             where.append(" AND a.data_id=? ");         }         if (StringUtils.isNotBlank(group)) {             where.append(" AND a.group_id=? ");         }         if (StringUtils.isNotBlank(appName)) {             where.append(" AND a.app_name=? ");         }          where.append(" AND b.tag_name IN (");         for (int i = 0; i < tagSize; i++) {             if (i != 0) {                 where.append(", ");             }             where.append('?');         }         where.append(") ");         return sql + where + " LIMIT " + pageSize + " OFFSET " + startRow;     }       public String findConfigInfoLike4PageCountRows(final Map<String, String> params, int tagSize) {         final String appName = params.get("appName");         final String content = params.get("content");         final String dataId = params.get("dataId");         final String group = params.get("group");         StringBuilder where = new StringBuilder(" WHERE ");         final String sqlCountRows = "SELECT count(*) FROM config_info  a LEFT JOIN config_tags_relation b ON a.id=b.id ";          where.append(" a.tenant_id LIKE ? ");         if (!StringUtils.isBlank(dataId)) {             where.append(" AND a.data_id LIKE ? ");         }         if (!StringUtils.isBlank(group)) {             where.append(" AND a.group_id LIKE ? ");         }         if (!StringUtils.isBlank(appName)) {             where.append(" AND a.app_name = ? ");         }         if (!StringUtils.isBlank(content)) {             where.append(" AND a.content LIKE ? ");         }          where.append(" AND b.tag_name IN (");         for (int i = 0; i < tagSize; i++) {             if (i != 0) {                 where.append(", ");             }             where.append('?');         }         where.append(") ");         return sqlCountRows + where;     }       public String findConfigInfoLike4PageFetchRows(final Map<String, String> params, int tagSize, int startRow,                                                    int pageSize) {         final String appName = params.get("appName");         final String content = params.get("content");         final String dataId = params.get("dataId");         final String group = params.get("group");         StringBuilder where = new StringBuilder(" WHERE ");         final String sqlFetchRows = "SELECT a.id,a.data_id,a.group_id,a.tenant_id,a.app_name,a.content "                 + "FROM config_info a LEFT JOIN config_tags_relation b ON a.id=b.id ";          where.append(" a.tenant_id LIKE ? ");         if (!StringUtils.isBlank(dataId)) {             where.append(" AND a.data_id LIKE ? ");         }         if (!StringUtils.isBlank(group)) {             where.append(" AND a.group_id LIKE ? ");         }         if (!StringUtils.isBlank(appName)) {             where.append(" AND a.app_name = ? ");         }         if (!StringUtils.isBlank(content)) {             where.append(" AND a.content LIKE ? ");         }          where.append(" AND b.tag_name IN (");         for (int i = 0; i < tagSize; i++) {             if (i != 0) {                 where.append(", ");             }             where.append('?');         }         where.append(") ");         return sqlFetchRows + where + " LIMIT " + startRow + "," + pageSize;     }       public String getTableName() {         return TableConstant.CONFIG_TAGS_RELATION;     }  }

View Code

   3.2.5.AbstractGroupCapacityMapperCommon
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.common;  import com.alibaba.nacos.plugin.datasource.constants.TableConstant; import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; import com.alibaba.nacos.plugin.datasource.mapper.GroupCapacityMapper;   public abstract class AbstractGroupCapacityMapperCommon extends AbstractMapper implements GroupCapacityMapper {       public String insertIntoSelect() {         return "INSERT INTO group_capacity (group_id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size,gmt_create,"                 + " gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info";     }       public String insertIntoSelectByWhere() {         return "INSERT INTO group_capacity (group_id, quota,`usage`, `max_size`, max_aggr_count, max_aggr_size, gmt_create,"                 + " gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info WHERE group_id=? AND tenant_id = ''";     }       public String incrementUsageByWhereQuotaEqualZero() {         return "UPDATE group_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE group_id = ? AND `usage` < ? AND quota = 0";     }       public String incrementUsageByWhereQuotaNotEqualZero() {         return "UPDATE group_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE group_id = ? AND `usage` < quota AND quota != 0";     }       public String incrementUsageByWhere() {         return "UPDATE group_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE group_id = ?";     }       public String decrementUsageByWhere() {         return "UPDATE group_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE group_id = ? AND `usage` > 0";     }       public String updateUsage() {         return "UPDATE group_capacity SET `usage` = (SELECT count(*) FROM config_info), gmt_modified = ? WHERE group_id = ?";     }       public String updateUsageByWhere() {         return "UPDATE group_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE group_id=? AND tenant_id = ''),"                 + " gmt_modified = ? WHERE group_id= ?";     }       public String selectGroupInfoBySize() {         return "SELECT id, group_id FROM group_capacity WHERE id > ? LIMIT ?";     }       public String getTableName() {         return TableConstant.GROUP_CAPACITY;     }   }

View Code

   3.2.6.AbstractHistoryConfigInfoMapperCommon
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.common;  import com.alibaba.nacos.plugin.datasource.constants.TableConstant; import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; import com.alibaba.nacos.plugin.datasource.mapper.HistoryConfigInfoMapper;   public abstract class AbstractHistoryConfigInfoMapperCommon extends AbstractMapper implements HistoryConfigInfoMapper {       public String removeConfigHistory() {         return "DELETE FROM his_config_info WHERE gmt_modified < ? LIMIT ?";     }       public String findConfigHistoryCountByTime() {         return "SELECT count(*) FROM his_config_info WHERE gmt_modified < ?";     }       public String findDeletedConfig() {         return "SELECT DISTINCT data_id, group_id, tenant_id FROM his_config_info WHERE op_type = 'D' AND gmt_modified >= ? AND gmt_modified <= ?";     }       public String findConfigHistoryFetchRows() {         return "SELECT nid,data_id,group_id,tenant_id,app_name,src_ip,src_user,op_type,gmt_create,gmt_modified FROM his_config_info "                 + "WHERE data_id = ? AND group_id = ? AND tenant_id = ? ORDER BY nid DESC";     }       public String detailPreviousConfigHistory() {         return "SELECT nid,data_id,group_id,tenant_id,app_name,content,md5,src_user,src_ip,op_type,gmt_create,gmt_modified "                 + "FROM his_config_info WHERE nid = (SELECT max(nid) FROM his_config_info WHERE id = ?) ";     }      public String pageFindConfigHistoryFetchRows(int pageNo, int pageSize) {         final int offset = (pageNo - 1) * pageSize;         final int limit = pageSize;         return  "SELECT nid,data_id,group_id,tenant_id,app_name,src_ip,src_user,op_type,gmt_create,gmt_modified FROM his_config_info "                 + "WHERE data_id = ? AND group_id = ? AND tenant_id = ? ORDER BY nid DESC  LIMIT " + offset + "," + limit;     }      public String getTableName() {         return TableConstant.HIS_CONFIG_INFO;     }   }

View Code

   3.2.7.AbstractTenantCapacityMapperCommon
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.common;  import com.alibaba.nacos.plugin.datasource.constants.TableConstant; import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; import com.alibaba.nacos.plugin.datasource.mapper.TenantCapacityMapper;  public abstract class AbstractTenantCapacityMapperCommon extends AbstractMapper implements TenantCapacityMapper {       public String incrementUsageWithDefaultQuotaLimit() {         return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` <"                 + " ? AND quota = 0";     }       public String incrementUsageWithQuotaLimit() {         return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` < "                 + "quota AND quota != 0";     }       public String incrementUsage() {         return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ?";     }       public String decrementUsage() {         return "UPDATE tenant_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` > 0";     }       public String correctUsage() {         return "UPDATE tenant_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE tenant_id = ?), "                 + "gmt_modified = ? WHERE tenant_id = ?";     }       public String getCapacityList4CorrectUsage() {         return "SELECT id, tenant_id FROM tenant_capacity WHERE id>? LIMIT ?";     }       public String insertTenantCapacity() {         return "INSERT INTO tenant_capacity (tenant_id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size, "                 + "gmt_create, gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info WHERE tenant_id=?;";     }       public String getTableName() {         return TableConstant.TENANT_CAPACITY;     }   }

View Code

   3.2.8.AbstractConfigInfoMapperCommon
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.common;  import com.alibaba.nacos.common.utils.CollectionUtils; import com.alibaba.nacos.common.utils.StringUtils; import com.alibaba.nacos.plugin.datasource.constants.TableConstant; import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoMapper;  import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.Map;   public abstract class AbstractConfigInfoMapperCommon extends AbstractMapper implements ConfigInfoMapper {      private static final String DATA_ID = "dataId";      private static final String GROUP = "group";      private static final String APP_NAME = "appName";      private static final String CONTENT = "content";      private static final String TENANT = "tenant";      public String findConfigMaxId() {         return "SELECT MAX(id) FROM config_info";     }      public String findAllDataIdAndGroup() {         return "SELECT DISTINCT data_id, group_id FROM config_info";     }      public String findConfigInfoByAppCountRows() {         return "SELECT count(*) FROM config_info WHERE tenant_id LIKE ? AND app_name= ?";     }      public String findConfigInfoByAppFetchRows(int startRow, int pageSize) {         return "SELECT id,data_id,group_id,tenant_id,app_name,content FROM config_info"                 + " WHERE tenant_id LIKE ? AND app_name= ?" + " LIMIT " + pageSize + " OFFSET " + startRow;     }      public String configInfoLikeTenantCount() {         return "SELECT count(*) FROM config_info WHERE tenant_id LIKE ?";     }      public String getTenantIdList(int startRow, int pageSize) {         return "SELECT tenant_id FROM config_info WHERE tenant_id != '' GROUP BY tenant_id LIMIT " + pageSize                 + " OFFSET " + startRow;     }      public String getGroupIdList(int startRow, int pageSize) {         return "SELECT group_id FROM config_info WHERE tenant_id ='' GROUP BY group_id LIMIT " + pageSize + " OFFSET "                 + startRow;     }      public String findAllConfigKey(int startRow, int pageSize) {         return " SELECT data_id,group_id,app_name  FROM ( "                 + " SELECT id FROM config_info WHERE tenant_id LIKE ? ORDER BY id LIMIT " + pageSize + " OFFSET "                 + startRow + " )" + " g, config_info t WHERE g.id = t.id  ";     }      public String findAllConfigInfoBaseFetchRows(int startRow, int pageSize) {         return "SELECT t.id,data_id,group_id,content,md5"                 + " FROM ( SELECT id FROM config_info ORDER BY id LIMIT ?,?  ) "                 + " g, config_info t  WHERE g.id = t.id ";     }      public String findAllConfigInfoFragment(int startRow, int pageSize) {         return "SELECT id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,type,encrypted_data_key "                 + "FROM config_info WHERE id > ? ORDER BY id ASC LIMIT " + pageSize + " OFFSET " + startRow;     }      public String findChangeConfig() {         return "SELECT data_id, group_id, tenant_id, app_name, content, gmt_modified,encrypted_data_key "                 + "FROM config_info WHERE gmt_modified >= ? AND gmt_modified <= ?";     }      public String findChangeConfigCountRows(Map<String, String> params, final Timestamp startTime,                                             final Timestamp endTime) {         final String tenant = params.get(TENANT);         final String dataId = params.get(DATA_ID);         final String group = params.get(GROUP);         final String appName = params.get(APP_NAME);         final String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.EMPTY : tenant;         final String sqlCountRows = "SELECT count(*) FROM config_info WHERE ";         String where = " 1=1 ";         if (!StringUtils.isBlank(dataId)) {             where += " AND data_id LIKE ? ";         }         if (!StringUtils.isBlank(group)) {             where += " AND group_id LIKE ? ";         }          if (!StringUtils.isBlank(tenantTmp)) {             where += " AND tenant_id = ? ";         }          if (!StringUtils.isBlank(appName)) {             where += " AND app_name = ? ";         }         if (startTime != null) {             where += " AND gmt_modified >=? ";         }         if (endTime != null) {             where += " AND gmt_modified <=? ";         }         return sqlCountRows + where;     }       public String findChangeConfigFetchRows(Map<String, String> params, final Timestamp startTime,                                             final Timestamp endTime, int startRow, int pageSize, long lastMaxId) {         final String tenant = params.get(TENANT);         final String dataId = params.get(DATA_ID);         final String group = params.get(GROUP);         final String appName = params.get(APP_NAME);         final String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.EMPTY : tenant;         final String sqlFetchRows = "SELECT id,data_id,group_id,tenant_id,app_name,content,type,md5,gmt_modified FROM config_info WHERE ";         String where = " 1=1 ";         if (!StringUtils.isBlank(dataId)) {             where += " AND data_id LIKE ? ";         }         if (!StringUtils.isBlank(group)) {             where += " AND group_id LIKE ? ";         }          if (!StringUtils.isBlank(tenantTmp)) {             where += " AND tenant_id = ? ";         }          if (!StringUtils.isBlank(appName)) {             where += " AND app_name = ? ";         }         if (startTime != null) {             where += " AND gmt_modified >=? ";         }         if (endTime != null) {             where += " AND gmt_modified <=? ";         }         return sqlFetchRows + where + " AND id > " + lastMaxId + " ORDER BY id ASC" + " LIMIT " + 0 + " OFFSET "                 + pageSize;     }       public String listGroupKeyMd5ByPageFetchRows(int startRow, int pageSize) {         return "SELECT t.id,data_id,group_id,tenant_id,app_name,md5,type,gmt_modified,encrypted_data_key FROM "                 + "( SELECT id FROM config_info ORDER BY id LIMIT " + pageSize + " OFFSET " + startRow                 + " ) g, config_info t WHERE g.id = t.id";     }       public String findAllConfigInfo4Export(List<Long> ids, Map<String, String> params) {         String tenant = params.get("tenant");         String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.EMPTY : tenant;         String sql = "SELECT id,data_id,group_id,tenant_id,app_name,content,type,md5,gmt_create,gmt_modified,src_user,src_ip,"                 + "c_desc,c_use,effect,c_schema,encrypted_data_key FROM config_info";         StringBuilder where = new StringBuilder(" WHERE ");         List<Object> paramList = new ArrayList<>();         if (!CollectionUtils.isEmpty(ids)) {             where.append(" id IN (");             for (int i = 0; i < ids.size(); i++) {                 if (i != 0) {                     where.append(", ");                 }                 where.append('?');                 paramList.add(ids.get(i));             }             where.append(") ");         } else {             where.append(" tenant_id= ? ");             paramList.add(tenantTmp);             if (!StringUtils.isBlank(params.get(DATA_ID))) {                 where.append(" AND data_id LIKE ? ");             }             if (StringUtils.isNotBlank(params.get(GROUP))) {                 where.append(" AND group_id= ? ");             }             if (StringUtils.isNotBlank(params.get(APP_NAME))) {                 where.append(" AND app_name= ? ");             }         }         return sql + where;     }       public String findConfigInfoBaseLikeCountRows(Map<String, String> params) {         final String sqlCountRows = "SELECT count(*) FROM config_info WHERE ";         String where = " 1=1 AND tenant_id='' ";          if (!StringUtils.isBlank(params.get(DATA_ID))) {             where += " AND data_id LIKE ? ";         }         if (!StringUtils.isBlank(params.get(GROUP))) {             where += " AND group_id LIKE ";         }         if (!StringUtils.isBlank(params.get(CONTENT))) {             where += " AND content LIKE ? ";         }         return sqlCountRows + where;     }       public String findConfigInfoBaseLikeFetchRows(Map<String, String> params, int startRow, int pageSize) {         final String sqlFetchRows = "SELECT id,data_id,group_id,tenant_id,content FROM config_info WHERE ";         String where = " 1=1 AND tenant_id='' ";         if (!StringUtils.isBlank(params.get(DATA_ID))) {             where += " AND data_id LIKE ? ";         }         if (!StringUtils.isBlank(params.get(GROUP))) {             where += " AND group_id LIKE ";         }         if (!StringUtils.isBlank(params.get(CONTENT))) {             where += " AND content LIKE ? ";         }         return sqlFetchRows + where + " LIMIT " + startRow + "," + pageSize;     }       public String findConfigInfo4PageCountRows(Map<String, String> params) {         final String appName = params.get(APP_NAME);         final String dataId = params.get(DATA_ID);         final String group = params.get(GROUP);         final String sqlCount = "SELECT count(*) FROM config_info";         StringBuilder where = new StringBuilder(" WHERE ");         where.append(" tenant_id=? ");         if (StringUtils.isNotBlank(dataId)) {             where.append(" AND data_id=? ");         }         if (StringUtils.isNotBlank(group)) {             where.append(" AND group_id=? ");         }         if (StringUtils.isNotBlank(appName)) {             where.append(" AND app_name=? ");         }         return sqlCount + where;     }       public String findConfigInfo4PageFetchRows(Map<String, String> params, int startRow, int pageSize) {         final String appName = params.get(APP_NAME);         final String dataId = params.get(DATA_ID);         final String group = params.get(GROUP);         final String sql = "SELECT id,data_id,group_id,tenant_id,app_name,content,type,encrypted_data_key FROM config_info";         StringBuilder where = new StringBuilder(" WHERE ");         where.append(" tenant_id=? ");         if (StringUtils.isNotBlank(dataId)) {             where.append(" AND data_id=? ");         }         if (StringUtils.isNotBlank(group)) {             where.append(" AND group_id=? ");         }         if (StringUtils.isNotBlank(appName)) {             where.append(" AND app_name=? ");         }         return sql + where + " LIMIT " + pageSize + " OFFSET " + startRow;     }       public String findConfigInfoBaseByGroupFetchRows(int startRow, int pageSize) {         return "SELECT id,data_id,group_id,content FROM config_info WHERE group_id=? AND tenant_id=?" + " LIMIT "                 + pageSize + " OFFSET " + startRow;     }       public String findConfigInfoLike4PageCountRows(Map<String, String> params) {         String dataId = params.get(DATA_ID);         String group = params.get(GROUP);         final String appName = params.get(APP_NAME);         final String content = params.get(CONTENT);         final String sqlCountRows = "SELECT count(*) FROM config_info";         StringBuilder where = new StringBuilder(" WHERE ");         where.append(" tenant_id LIKE ? ");         if (!StringUtils.isBlank(dataId)) {             where.append(" AND data_id LIKE ? ");         }         if (!StringUtils.isBlank(group)) {             where.append(" AND group_id LIKE ? ");         }         if (!StringUtils.isBlank(appName)) {             where.append(" AND app_name = ? ");         }         if (!StringUtils.isBlank(content)) {             where.append(" AND content LIKE ? ");         }         return sqlCountRows + where;     }       public String findConfigInfoLike4PageFetchRows(Map<String, String> params, int startRow, int pageSize) {         String dataId = params.get(DATA_ID);         String group = params.get(GROUP);         final String appName = params.get(APP_NAME);         final String content = params.get(CONTENT);         final String sqlFetchRows = "SELECT id,data_id,group_id,tenant_id,app_name,content,encrypted_data_key FROM config_info";         StringBuilder where = new StringBuilder(" WHERE ");         where.append(" tenant_id LIKE ? ");         if (!StringUtils.isBlank(dataId)) {             where.append(" AND data_id LIKE ? ");         }         if (!StringUtils.isBlank(group)) {             where.append(" AND group_id LIKE ? ");         }         if (!StringUtils.isBlank(appName)) {             where.append(" AND app_name = ? ");         }         if (!StringUtils.isBlank(content)) {             where.append(" AND content LIKE ? ");         }         return sqlFetchRows + where + " LIMIT " + pageSize + " OFFSET " + startRow;     }       public String findAllConfigInfoFetchRows(int startRow, int pageSize) {         return "SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5 "                 + " FROM (  SELECT id FROM config_info WHERE tenant_id LIKE ? ORDER BY id LIMIT " + pageSize                 + " OFFSET " + startRow + " )" + " g, config_info t  WHERE g.id = t.id ";     }       public String findConfigInfosByIds(int idSize) {         StringBuilder sql = new StringBuilder(                 "SELECT ID,data_id,group_id,tenant_id,app_name,content,md5 FROM config_info WHERE ");         sql.append("id IN (");         for (int i = 0; i < idSize; i++) {             if (i != 0) {                 sql.append(", ");             }             sql.append('?');         }         sql.append(") ");         return sql.toString();     }       public String removeConfigInfoByIdsAtomic(int size) {         StringBuilder sql = new StringBuilder("DELETE FROM config_info WHERE ");         sql.append("id IN (");         for (int i = 0; i < size; i++) {             if (i != 0) {                 sql.append(", ");             }             sql.append('?');         }         sql.append(") ");         return sql.toString();     }       public String updateConfigInfoAtomicCas() {         return "UPDATE config_info SET "                 + "content=?, md5 = ?, src_ip=?,src_user=?,gmt_modified=?, app_name=?,c_desc=?,c_use=?,effect=?,type=?,c_schema=? "                 + "WHERE data_id=? AND group_id=? AND tenant_id=? AND (md5=? OR md5 IS NULL OR md5='')";     }       public String getTableName() {         return TableConstant.CONFIG_INFO;     }   }

View Code

  3.3.达梦数据源适配实现

   3.3.1.ConfigInfoAggrMapperByDM
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.dm;  import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigInfoAggrMapperCommon;   public class ConfigInfoAggrMapperByDM extends AbstractConfigInfoAggrMapperCommon {       @Override     public String getDataSource() {         return DataSourceConstant.DM;     } }

View Code

   3.3.2.ConfigInfoBetaMapperByDM
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.dm;  import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigInfoBetaMapperCommon;  public class ConfigInfoBetaMapperByDM extends AbstractConfigInfoBetaMapperCommon {       @Override     public String getDataSource() {         return DataSourceConstant.DM;     } }

View Code

   3.3.3.ConfigInfoMapperByDM
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.dm;  import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigInfoMapperCommon;  public class ConfigInfoMapperByDM extends AbstractConfigInfoMapperCommon {       @Override     public String getDataSource() {         return DataSourceConstant.DM;     } }

View Code

   3.3.4.ConfigInfoTagMapperByDM
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.dm;  import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigInfoTagMapperCommon;  public class ConfigInfoTagMapperByDM extends AbstractConfigInfoTagMapperCommon {       @Override     public String getDataSource() {         return DataSourceConstant.DM;     } }

View Code

   3.3.5.ConfigTagsRelationMapperByDM
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.dm;  import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigTagsRelationMapperCommon;  public class ConfigTagsRelationMapperByDM extends AbstractConfigTagsRelationMapperCommon {      @Override     public String getDataSource() {         return DataSourceConstant.DM;     } }

View Code

   3.3.6.GroupCapacityMapperByDM
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.dm;  import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; import com.alibaba.nacos.plugin.datasource.impl.common.AbstractGroupCapacityMapperCommon;  public class GroupCapacityMapperByDM extends AbstractGroupCapacityMapperCommon {       @Override     public String getDataSource() {         return DataSourceConstant.DM;     } }

View Code

   3.3.7.HistoryConfigInfoMapperByDM
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.dm;  import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; import com.alibaba.nacos.plugin.datasource.impl.common.AbstractHistoryConfigInfoMapperCommon;  public class HistoryConfigInfoMapperByDM extends AbstractHistoryConfigInfoMapperCommon {       @Override     public String getDataSource() {         return DataSourceConstant.DM;     } }

View Code

   3.3.8.TenantCapacityMapperByDM
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.dm;  import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; import com.alibaba.nacos.plugin.datasource.impl.common.AbstractTenantCapacityMapperCommon;  public class TenantCapacityMapperByDM extends AbstractTenantCapacityMapperCommon {       @Override     public String getDataSource() {         return DataSourceConstant.DM;     } }

View Code

   3.3.9.TenantInfoMapperByDM
nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

package com.alibaba.nacos.plugin.datasource.impl.dm;  import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant; import com.alibaba.nacos.plugin.datasource.constants.TableConstant; import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; import com.alibaba.nacos.plugin.datasource.mapper.TenantInfoMapper;  public class TenantInfoMapperByDM  extends AbstractMapper implements TenantInfoMapper {      @Override     public String getTableName() {         return TableConstant.TENANT_INFO;     }      @Override     public String getDataSource() {         return DataSourceConstant.DM;     }  }

View Code

  3.4.其他数据源适配实现

  跟上面达梦数据源适配实现一致,只需将 getDataSource 方法替换成对应的数据源类型就OK;

  3.5.service文件

  在resources下面创建resources/META-INF/services/com.alibaba.nacos.plugin.datasource.mapper.Mapper文件

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoAggrMapperByDM com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoBetaMapperByDM com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoMapperByDM com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoTagMapperByDM com.alibaba.nacos.plugin.datasource.impl.dm.ConfigTagsRelationMapperByDM com.alibaba.nacos.plugin.datasource.impl.dm.GroupCapacityMapperByDM com.alibaba.nacos.plugin.datasource.impl.dm.HistoryConfigInfoMapperByDM com.alibaba.nacos.plugin.datasource.impl.dm.TenantCapacityMapperByDM com.alibaba.nacos.plugin.datasource.impl.dm.TenantInfoMapperByDM  #其他类似..............

View Code

   3.6.nacos-server配置

  1)mvn install后该jar包放入到Nacos(版本2.2.0才支持数据源插件化)的plugins目录下(没有则新建),Nacos的启动脚本startup.sh中-Dloader.path参数将会加载外部jar包文件到Nacos的环境中;

  2)修改Nacos的conf/application.properties,增加对应数据源的连接参数信息:

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

db.num=1 #指定数据源类型,对应DataSourceConstant参数 spring.sql.init.platform=dm db.url.0=jdbc:dm://ip:5236/ db.user.0=username db.password.0=password #指定driver db.pool.config.driverClassName=dm.jdbc.driver.DmDriver

View Code

  3.7.启动

  1)启动命令:

   单机模式:sudo sh startup.sh -m standalone

  集群模式:./startup.sh

  PS:

  集群模式下修改cluster.conf.example文件为cluster.conf,不然报错误: Caused by: com.alibaba.nacos.api.exception.NacosException: java.net.UnknownHostException: jmenv.tbsite.net

  2)ip访问验证:http://ip:8848/nacos/index.html

二.源码探究

  1.准备

  源码nacos-2.2.0:https://github.com/alibaba/nacos.git

  2.网页入口

  nacos-console模块com.alibaba.nacos.Nacos

  3.nacos数据持久化入口

   3.1.com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl#init()

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

    @PostConstruct     public void init() {         //获取数据源         dataSourceService = DynamicDataSource.getInstance().getDataSource();                  jt = getJdbcTemplate();         tjt = getTransactionTemplate();         Boolean isDataSourceLogEnable = EnvUtil                 .getProperty(Constants.NACOS_PLUGIN_DATASOURCE_LOG, Boolean.class, false);         mapperManager = MapperManager.instance(isDataSourceLogEnable);     }          com.alibaba.nacos.config.server.service.datasource.DynamicDataSource#getDataSource         public synchronized DataSourceService getDataSource() {         try {                          // Embedded storage is used by default in stand-alone mode             // In cluster mode, external databases are used by default             //单机模式             if (PropertyUtil.isEmbeddedStorage()) {                 if (localDataSourceService == null) {                     localDataSourceService = new LocalDataSourceServiceImpl();                     localDataSourceService.init();                 }                 return localDataSourceService;             } else {                 //集群模式                 if (basicDataSourceService == null) {                     basicDataSourceService = new ExternalDataSourceServiceImpl();                     basicDataSourceService.init();                 }                 return basicDataSourceService;             }         } catch (Exception e) {             throw new RuntimeException(e);         }     }

View Code

   3.2.com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceServiceImpl#init

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

        @Override     public void init() {         queryTimeout = ConvertUtils.toInt(System.getProperty("QUERYTIMEOUT"), 3);         jt = new JdbcTemplate();         // Set the maximum number of records to prevent memory expansion         jt.setMaxRows(50000);         jt.setQueryTimeout(queryTimeout);          testMasterJT = new JdbcTemplate();         testMasterJT.setQueryTimeout(queryTimeout);          testMasterWritableJT = new JdbcTemplate();         // Prevent the login interface from being too long because the main library is not available         testMasterWritableJT.setQueryTimeout(1);          //  Database health check          testJtList = new ArrayList<>();         isHealthList = new ArrayList<>();          tm = new DataSourceTransactionManager();         tjt = new TransactionTemplate(tm);          // Transaction timeout needs to be distinguished from ordinary operations.         tjt.setTimeout(TRANSACTION_QUERY_TIMEOUT);         //获取数据源类型:spring.sql.init.platform或spring.datasource.platform指定的参数值         dataSourceType = DatasourcePlatformUtil.getDatasourcePlatform(defaultDataSourceType);          if (PropertyUtil.isUseExternalDB()) {             try {                 //加载数据源连接                 reload();             } catch (IOException e) {                 FATAL_LOG.error("[ExternalDataSourceService] datasource reload error", e);                 throw new RuntimeException(DB_LOAD_ERROR_MSG, e);             }              if (this.dataSourceList.size() > DB_MASTER_SELECT_THRESHOLD) {                 ConfigExecutor.scheduleConfigTask(new SelectMasterTask(), 10, 10, TimeUnit.SECONDS);             }             ConfigExecutor.scheduleConfigTask(new CheckDbHealthTask(), 10, 10, TimeUnit.SECONDS);         }     }

View Code

   3.3.com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceServiceImpl#reload

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

@Override     public synchronized void reload() throws IOException {         try {             final List<JdbcTemplate> testJtListNew = new ArrayList<JdbcTemplate>();             final List<Boolean> isHealthListNew = new ArrayList<Boolean>();             //com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceProperties#build:获取数据源             List<HikariDataSource> dataSourceListNew = new ExternalDataSourceProperties()                     .build(EnvUtil.getEnvironment(), (dataSource) -> {                         JdbcTemplate jdbcTemplate = new JdbcTemplate();                         jdbcTemplate.setQueryTimeout(queryTimeout);                         jdbcTemplate.setDataSource(dataSource);                         testJtListNew.add(jdbcTemplate);                         isHealthListNew.add(Boolean.TRUE);                     });             final List<HikariDataSource> dataSourceListOld = dataSourceList;             final List<JdbcTemplate> testJtListOld = testJtList;             dataSourceList = dataSourceListNew;             testJtList = testJtListNew;             isHealthList = isHealthListNew;             //选择主数据源:测试数据源,数据源设置到JdbcTemplate jt中(重点,后续请求从jt中获取dataSource)             new SelectMasterTask().run();             //校验数据源的状态             new CheckDbHealthTask().run();              //close old datasource.             if (dataSourceListOld != null && !dataSourceListOld.isEmpty()) {                 for (HikariDataSource dataSource : dataSourceListOld) {                     dataSource.close();                 }             }             if (testJtListOld != null && !testJtListOld.isEmpty()) {                 for (JdbcTemplate oldJdbc : testJtListOld) {                     oldJdbc.setDataSource(null);                 }             }         } catch (RuntimeException e) {             FATAL_LOG.error(DB_LOAD_ERROR_MSG, e);             throw new IOException(e);         }     }

View Code

   3.4.com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceProperties#build:根据application.properties配置连接获取数据源

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

    List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) {         List<HikariDataSource> dataSources = new ArrayList<>();         Binder.get(environment).bind("db", Bindable.ofInstance(this));         Preconditions.checkArgument(Objects.nonNull(num), "db.num is null");         Preconditions.checkArgument(CollectionUtils.isNotEmpty(user), "db.user or db.user.[index] is null");         Preconditions.checkArgument(CollectionUtils.isNotEmpty(password), "db.password or db.password.[index] is null");         for (int index = 0; index < num; index++) {             int currentSize = index + 1;             Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index);             //获取driverClassName             DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment);             if (StringUtils.isEmpty(poolProperties.getDataSource().getDriverClassName())) {                 poolProperties.setDriverClassName(JDBC_DRIVER_NAME);             }             poolProperties.setJdbcUrl(url.get(index).trim());             poolProperties.setUsername(getOrDefault(user, index, user.get(0)).trim());             poolProperties.setPassword(getOrDefault(password, index, password.get(0)).trim());             HikariDataSource ds = poolProperties.getDataSource();             if (StringUtils.isEmpty(ds.getConnectionTestQuery())) {                 ds.setConnectionTestQuery(TEST_QUERY);             }             dataSources.add(ds);             callback.accept(ds);         }         Preconditions.checkArgument(CollectionUtils.isNotEmpty(dataSources), "no datasource available");         return dataSources;     }

View Code

   3.5.com.alibaba.nacos.config.server.service.datasource.DataSourcePoolProperties#build

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

        public static DataSourcePoolProperties build(Environment environment) {         DataSourcePoolProperties result = new DataSourcePoolProperties();         //绑定driverClassName值         Binder.get(environment).bind("db.pool.config", Bindable.ofInstance(result.getDataSource()));         return result;     }

View Code

   3.6.com.alibaba.nacos.plugin.datasource.MapperManager#loadInitial:nacos-datasource-plugin

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

    public void loadInitial() {         //spi加载插件实现类         Collection<Mapper> mappers = NacosServiceLoader.load(Mapper.class);         for (Mapper mapper : mappers) {             Map<String, Mapper> mapperMap = MAPPER_SPI_MAP.getOrDefault(mapper.getDataSource(), new HashMap<>(16));             mapperMap.put(mapper.getTableName(), mapper);             MAPPER_SPI_MAP.put(mapper.getDataSource(), mapperMap);             LOGGER.info("[MapperManager] Load Mapper({}) datasource({}) tableName({}) successfully.",                     mapper.getClass(), mapper.getDataSource(), mapper.getTableName());         }     }

View Code

  ps:

  SPI:Service Provider Interface (服务提供接口) 是java提供的一套用来被第三方实现或扩展的接口。它可以用来启用框架 扩展和替换 组件;

  SPI 与API 区别与联系

    API: (Application Programming Interface) 在绝大多数情况下,都是实现方定制接口并进行接口的实现,调用者只能选择调用,而无权选择不同实现;

    SPI: 调用方制定接口规范,提供给外部实现。调用方在调用时选择自己需要的外部实现;

  流程:

  1)定义一个接口,定义接口的实现类;

  2)在resources目录下新建META-INF/services目录,并且在这个目录下新建一个与上述接口的全限定名一致的文件,在这个文件中写入接口的实现类的全限定名;

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

   3)通过serviceLoader加载实现类并调用

  public static void main(String[] args) {          ServiceLoader<Mapper> mappers = ServiceLoader.load(Mapper.class);          for (Mapper m : mappers) {              m.getTableName();          }      }

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

   pps:在 ServiceLoader.load 后遍历 mappers 时可以通过 BeanDefinitionRegistry 可以将mapper实现类注册到 ApplicationContext中,这样就可以对接口实现类使用 @Autowired 来解决依赖注入问题了;

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

   3.7.com.alibaba.nacos.config.server.service.dump.ExternalDumpService#init:将数据库的config_info信息dump一份到本地磁盘

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

    @PostConstruct     @Override     protected void init() throws Throwable {         dumpOperate(processor, dumpAllProcessor, dumpAllBetaProcessor, dumpAllTagProcessor);     }

View Code

  ps:

  有兴趣可研究 ExternalDumpService#init -> DumpService#dumpConfigInfo -> DumpAllProcessor#process(第一行定位到3.8) -> ExternalStoragePersistServiceImpl#findAllConfigInfoFragment -> 分页将数据库的config_info(nacos的配置管理的配置列表信息)dump到本地磁盘 -> ConfigCacheService#dump -> DiskUtil#saveToDisk

  pps:所以nacos的配置信息优先从本地取,本地为空再从数据库取并更新到本地;

  可从 ConfigController#getConfig -> ConfigServletInner#doGetConfig() 中看到从本地缓存取,失败再从数据库查询并更新到本地;

   3.8.com.alibaba.nacos.config.server.service.repository.extrnal.ExternalConfigInfoPersistServiceImpl#findConfigMaxId

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

public long findConfigMaxId() {         //获取config_info表实现类         ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),                 TableConstant.CONFIG_INFO);         String sql = configInfoMapper.findConfigMaxId();         try {             return jt.queryForObject(sql, Long.class);         } catch (NullPointerException e) {             return 0;         }     }

View Code

   3.9.com.alibaba.nacos.plugin.datasource.MapperManager#findMapper

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

public <R extends Mapper> R findMapper(String dataSource, String tableName) {         LOGGER.info("[MapperManager] findMapper dataSource: {}, tableName: {}", dataSource, tableName);         if (StringUtils.isBlank(dataSource) || StringUtils.isBlank(tableName)) {             throw new NacosRuntimeException(FIND_DATASOURCE_ERROR_CODE, "dataSource or tableName is null");         }         Map<String, Mapper> tableMapper = MAPPER_SPI_MAP.get(dataSource);         if (Objects.isNull(tableMapper)) {             throw new NacosRuntimeException(FIND_DATASOURCE_ERROR_CODE,                     "[MapperManager] Failed to find the datasource,dataSource:" + dataSource);         }         Mapper mapper = tableMapper.get(tableName);         if (Objects.isNull(mapper)) {             throw new NacosRuntimeException(FIND_TABLE_ERROR_CODE,                     "[MapperManager] Failed to find the table ,tableName:" + tableName);         }         //nacos.plugin.datasource.log.enabled=true开启日志:jdk代理         if (dataSourceLogEnable) {             MapperProxy mapperProxy = new MapperProxy();             return (R) mapperProxy.createProxy(mapper);         }         return (R) mapper;     }

View Code

发表评论

评论已关闭。

相关文章