nacos1.1.4 适配瀚高数据库

nacos 1.1.4

1.数据库准备

CREATE TABLE config_info (
     id bigserial NOT NULL,
     data_id varchar(255) NOT NULL,
     group_id varchar(128) NOT NULL,
     tenant_id varchar(128) default '',
     app_name varchar(128),
     content text,
     md5 varchar(32) DEFAULT NULL,
     gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
     gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
     src_user varchar(128) DEFAULT NULL,
     src_ip varchar(20) DEFAULT NULL,
     c_desc varchar(256) DEFAULT NULL,
     c_use varchar(64) DEFAULT NULL,
     effect varchar(64) DEFAULT NULL,
     type varchar(64) DEFAULT NULL,
     c_schema VARCHAR DEFAULT NULL,
     constraint configinfo_id_key PRIMARY KEY (id),
     constraint uk_configinfo_datagrouptenant UNIQUE (data_id,group_id,tenant_id));

CREATE INDEX configinfo_dataid_key_idx ON config_info(data_id);
CREATE INDEX configinfo_groupid_key_idx ON config_info(group_id);
CREATE INDEX configinfo_dataid_group_key_idx ON config_info(data_id, group_id);

CREATE TABLE his_config_info (
     id bigint NOT NULL,
     nid bigserial NOT NULL,
     data_id varchar(255) NOT NULL,
     group_id varchar(128) NOT NULL,
     tenant_id varchar(128) default '',
     app_name varchar(128),
     content text,
     md5 varchar(32) DEFAULT NULL,
     gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
     gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
     src_user varchar(128),
     src_ip varchar(20) DEFAULT NULL,
     op_type char(10) DEFAULT NULL,
     constraint hisconfiginfo_nid_key PRIMARY KEY (nid));

CREATE INDEX hisconfiginfo_dataid_key_idx ON his_config_info(data_id);
CREATE INDEX hisconfiginfo_gmt_create_idx ON his_config_info(gmt_create);
CREATE INDEX hisconfiginfo_gmt_modified_idx ON his_config_info(gmt_modified);


CREATE TABLE config_info_beta (
      id bigserial NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content text,
      beta_ips varchar(1024),
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      constraint configinfobeta_id_key PRIMARY KEY (id),
      constraint uk_configinfobeta_datagrouptenant UNIQUE (data_id,group_id,tenant_id));

CREATE TABLE config_info_tag (
     id bigserial NOT NULL,
     data_id varchar(255) NOT NULL,
     group_id varchar(128) NOT NULL,
     tenant_id varchar(128) default '',
     tag_id varchar(128) NOT NULL,
     app_name varchar(128),
     content text,
     md5 varchar(32) DEFAULT NULL,
     gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
     gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
     src_user varchar(128),
     src_ip varchar(20) DEFAULT NULL,
     constraint configinfotag_id_key PRIMARY KEY (id),
     constraint uk_configinfotag_datagrouptenanttag UNIQUE (data_id,group_id,tenant_id,tag_id));

CREATE TABLE config_info_aggr (
      id bigserial NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      datum_id varchar(255) NOT NULL,
      app_name varchar(128),
      content text,
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      constraint configinfoaggr_id_key PRIMARY KEY (id),
      constraint uk_configinfoaggr_datagrouptenantdatum UNIQUE (data_id,group_id,tenant_id,datum_id));

CREATE TABLE app_list (
      id bigserial NOT NULL,
      app_name varchar(128) NOT NULL,
      is_dynamic_collect_disabled smallint DEFAULT 0,
      last_sub_info_collected_time timestamp DEFAULT '1970-01-01 08:00:00.0',
      sub_info_lock_owner varchar(128),
      sub_info_lock_time timestamp DEFAULT '1970-01-01 08:00:00.0',
      constraint applist_id_key PRIMARY KEY (id),
      constraint uk_appname UNIQUE (app_name));

CREATE TABLE app_configdata_relation_subs (
      id bigserial NOT NULL ,
      app_name varchar(128) NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint configdatarelationsubs_id_key PRIMARY KEY (id),
      constraint uk_app_sub_config_datagroup UNIQUE (app_name, data_id, group_id));


CREATE TABLE app_configdata_relation_pubs (
      id bigserial NOT NULL ,
      app_name varchar(128) NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint configdatarelationpubs_id_key PRIMARY KEY (id),
      constraint uk_app_pub_config_datagroup UNIQUE (app_name, data_id, group_id));

CREATE TABLE config_tags_relation (
      id bigint NOT NULL,
      tag_name varchar(128) NOT NULL,
      tag_type varchar(64) DEFAULT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) DEFAULT '',
      nid bigserial NOT NULL ,
      constraint config_tags_id_key PRIMARY KEY (nid),
      constraint uk_configtagrelation_configidtag UNIQUE (id, tag_name, tag_type));

CREATE INDEX config_tags_tenant_id_idx ON config_tags_relation(tenant_id);

CREATE TABLE group_capacity (
    id bigserial NOT NULL ,
    group_id varchar(128) DEFAULT '',
    quota int DEFAULT 0,
    usage int DEFAULT 0,
    max_size int DEFAULT 0,
    max_aggr_count int DEFAULT 0,
    max_aggr_size int DEFAULT 0,
    max_history_count int DEFAULT 0,
    gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
    gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
    constraint group_capacity_id_key PRIMARY KEY (id),
    constraint uk_group_id UNIQUE (group_id));

CREATE TABLE tenant_capacity (
     id bigserial NOT NULL ,
     tenant_id varchar(128) DEFAULT '',
     quota int DEFAULT 0,
     usage int DEFAULT 0,
     max_size int DEFAULT 0,
     max_aggr_count int DEFAULT 0,
     max_aggr_size int DEFAULT 0,
     max_history_count int DEFAULT 0,
     gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
     gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
     constraint tenant_capacity_id_key PRIMARY KEY (id),
     constraint uk_tenant_id UNIQUE (tenant_id));

CREATE TABLE tenant_info (
     id bigserial NOT NULL ,
     kp varchar(128) NOT NULL,
     tenant_id varchar(128)  DEFAULT '',
     tenant_name varchar(128)  DEFAULT '',
     tenant_desc varchar(256)  DEFAULT NULL,
     create_source varchar(32) DEFAULT NULL,
     gmt_create bigint NOT NULL,
     gmt_modified bigint NOT NULL,
     constraint tenant_info_id_key PRIMARY KEY (id),
     constraint uk_tenant_info_kptenantid UNIQUE (kp,tenant_id));
CREATE INDEX tenant_info_tenant_id_idx ON tenant_info(tenant_id);

CREATE TABLE users (
   username varchar(50) NOT NULL PRIMARY KEY,
   password varchar(500) NOT NULL,
   enabled boolean NOT NULL
);

CREATE TABLE roles (
   username varchar(50) NOT NULL,
   role varchar(50) NOT NULL
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

2.源码下载

https://github.com/alibaba/nacos

在这里插入图片描述

3.IDEA导入

下载后,导入IDEA,配置好JDK和MAVEN环境,等待项目加载完成。

加载完成后编译整个项目。
在这里插入图片描述

4.修改源码支持瀚高

4.1.引入驱动依赖

修改项目根目录下nacos-all的pom.xml

<dependency>
    <groupId>com.highgo</groupId>
    <artifactId>HgdbJdbc</artifactId>
    <version>6.2.4</version>
</dependency>

在 nacos-config 模块直接引用驱动库,修改 nacos-config的pom.xml

<dependency>
     <groupId>com.highgo</groupId>
     <artifactId>HgdbJdbc</artifactId>
</dependency>
4.2.修改properties

nacos-console模块的application.properties

#瀚高数据库
spring.datasource.platform=highgo
db.url=jdbc:highgo://192.168.100.104:5866/nacos
db.user=nacos
db.password=111111
4.3.nacos-config 模块代码修改对应的类

com.alibaba.nacos.config.server.utils.PropertyUtil

private static boolean standaloneUseHighgo = false;
//get set 方法
public static boolean isStandaloneUseHighgo() {
     return standaloneUseHighgo;
}
public static void setStandaloneUseHighgo(boolean standaloneUseHighgo) {
     PropertyUtil.standaloneUseHighgo = standaloneUseHighgo;
}

init() 方法,添加一行代码 setStandaloneUseHighgo(getString(“spring.datasource.platform”, “”).equals(“highgo”))

@PostConstruct
public void init() {
	try {
		setNotifyConnectTimeout(Integer.parseInt(env.getProperty("notifyConnectTimeout", "100")));
		logger.info("notifyConnectTimeout:{}", notifyConnectTimeout);
		setNotifySocketTimeout(Integer.parseInt(env.getProperty("notifySocketTimeout", "200")));
		logger.info("notifySocketTimeout:{}", notifySocketTimeout);
		setHealthCheck(Boolean.valueOf(env.getProperty("isHealthCheck", "true")));
		logger.info("isHealthCheck:{}", isHealthCheck);
		setMaxHealthCheckFailCount(Integer.parseInt(env.getProperty("maxHealthCheckFailCount", "12")));
		logger.info("maxHealthCheckFailCount:{}", maxHealthCheckFailCount);
		setMaxContent(Integer.parseInt(env.getProperty("maxContent", String.valueOf(maxContent))));
		logger.info("maxContent:{}", maxContent);
		// 容量管理
		setManageCapacity(getBoolean("isManageCapacity", isManageCapacity));
		setCapacityLimitCheck(getBoolean("isCapacityLimitCheck", isCapacityLimitCheck));
		setDefaultClusterQuota(getInt("defaultClusterQuota", defaultClusterQuota));
		setDefaultGroupQuota(getInt("defaultGroupQuota", defaultGroupQuota));
		setDefaultTenantQuota(getInt("defaultTenantQuota", defaultTenantQuota));
		setDefaultMaxSize(getInt("defaultMaxSize", defaultMaxSize));
		setDefaultMaxAggrCount(getInt("defaultMaxAggrCount", defaultMaxAggrCount));
		setDefaultMaxAggrSize(getInt("defaultMaxAggrSize", defaultMaxAggrSize));
		setCorrectUsageDelay(getInt("correctUsageDelay", correctUsageDelay));
		setInitialExpansionPercent(getInt("initialExpansionPercent", initialExpansionPercent));
		setStandaloneUseMysql(getString("spring.datasource.platform", "").equals("mysql"));
		setStandaloneUseHighgo(getString("spring.datasource.platform", "").equals("highgo"));

	} catch (Exception e) {
		logger.error("read application.properties failed", e);
	}
}

com.alibaba.nacos.config.server.service.BasicDataSourceServiceImpl

新增驱动常量定义

private static final String DEFAULT_HIGHGO_DRIVER = "com.highgo.jdbc.Driver";

init() 方法,增加 highgo 数据库判断

if (!STANDALONE_MODE || PropertyUtil.isStandaloneUseMysql() || PropertyUtil.isStandaloneUseHighgo())

动态判断加载 mysql 或 highgo 驱动,删掉了 static 代码块,在 reload() 方法中加入了如下代码

/** 删除静态代码块 */
//    static {
//        try {
//            Class.forName(MYSQL_HIGH_LEVEL_DRIVER);
//            JDBC_DRIVER_NAME = MYSQL_HIGH_LEVEL_DRIVER;
//            log.info("Use Mysql 8 as the driver");
//        } catch (ClassNotFoundException e) {
//            log.info("Use Mysql as the driver");
//            JDBC_DRIVER_NAME = DEFAULT_MYSQL_DRIVER;
//        }
//    }

// reload 方法新增
try {
	if (env.getProperty("spring.datasource.platform").equals("highgo")) {
		JDBC_DRIVER_NAME = DEFAULT_HIGHGO_DRIVER;
		log.info("Use Highgo as the driver");
	}else {
		try {
			Class.forName(MYSQL_HIGH_LEVEL_DRIVER);
			JDBC_DRIVER_NAME = MYSQL_HIGH_LEVEL_DRIVER;
			log.info("Use Mysql 8 as the driver");
		} catch (ClassNotFoundException ex) {
			log.info("Use Mysql as the driver");
			JDBC_DRIVER_NAME = DEFAULT_MYSQL_DRIVER;
		}
	}
} catch (Exception e) {
	log.error("Load driver failed");
}

其次下面加入了if else语句,将原本的for循环放到了else中,if中加入判断条件。

if (JDBC_DRIVER_NAME == DEFAULT_HIGHGO_DRIVER) {
	String val = null;

	BasicDataSource ds = new BasicDataSource();
	ds.setDriverClassName(JDBC_DRIVER_NAME);

	val = env.getProperty("db.url");
	if (null == val) {
		fatalLog.error("db.url is null");
		throw new IllegalArgumentException();
	}
	ds.setUrl(val.trim());

	val = env.getProperty("db.user", env.getProperty("db.user"));
	if (null == val) {
		fatalLog.error("db.user is null");
		throw new IllegalArgumentException();
	}
	ds.setUsername(val.trim());

	val = env.getProperty("db.password", env.getProperty("db.password"));
	if (null == val) {
		fatalLog.error("db.password is null");
		throw new IllegalArgumentException();
	}
	ds.setPassword(val.trim());

	val = env.getProperty("db.initialSize", env.getProperty("db.initialSize"));
	ds.setInitialSize(Integer.parseInt(defaultIfNull(val, "10")));

	val = env.getProperty("db.maxActive", env.getProperty("db.maxActive"));
	ds.setMaxActive(Integer.parseInt(defaultIfNull(val, "20")));

	val = env.getProperty("db.maxIdle", env.getProperty("db.maxIdle"));
	ds.setMaxIdle(Integer.parseInt(defaultIfNull(val, "50")));

	ds.setMaxWait(3000L);
	ds.setPoolPreparedStatements(true);

	// 每10分钟检查一遍连接池
	ds.setTimeBetweenEvictionRunsMillis(TimeUnit.MINUTES.toMillis(10L));
	ds.setTestWhileIdle(true);
	ds.setValidationQuery("SELECT 1 ");

	dblist.add(ds);

	JdbcTemplate jdbcTemplate = new JdbcTemplate();
	jdbcTemplate.setQueryTimeout(queryTimeout);
	jdbcTemplate.setDataSource(ds);

	testJTList.add(jdbcTemplate);
	isHealthList.add(Boolean.TRUE);

	if (dblist == null || dblist.size() == 0) {
		throw new RuntimeException("no datasource available");
	}

	dataSourceList = dblist;
	new SelectMasterTask().run();
	new CheckDBHealthTask().run();

} 

com.alibaba.nacos.config.server.service.DynamicDataSource

com.alibaba.nacos.config.server.service.LocalDataSourceServiceImpl

if (STANDALONE_MODE && !propertyUtil.isStandaloneUseMysql() && !propertyUtil.isStandaloneUseHighgo())

com.alibaba.nacos.config.server.service.ConfigService

该类中需要修改10处代码,在原本的判断条件后面加入了 highgo 的判断条件,对应修改即可

if (!STANDALONE_MODE || PropertyUtil.isStandaloneUseMysql() || PropertyUtil.isStandaloneUseHighgo())
或者
if (STANDALONE_MODE && !PropertyUtil.isStandaloneUseMysql() && !PropertyUtil.isStandaloneUseHighgo())

com.alibaba.nacos.config.server.service.capacity.GroupCapacityPersistService

com.alibaba.nacos.config.server.service.capacity.TenantCapacityPersistService

if (STANDALONE_MODE && !PropertyUtil.isStandaloneUseMysql() && !PropertyUtil.isStandaloneUseHighgo())

com.alibaba.nacos.config.server.controller.ConfigServletInner

该类中修改 6 处

if (STANDALONE_MODE && !PropertyUtil.isStandaloneUseMysql() && !PropertyUtil.isStandaloneUseHighgo())

com.alibaba.nacos.config.server.utils.PaginationHelper

fetchPage 方法

if (STANDALONE_MODE && !PropertyUtil.isStandaloneUseMysql() && !PropertyUtil.isStandaloneUseHighgo()) {
	selectSQL = sqlFetchRows + " OFFSET " + startRow + " ROWS FETCH NEXT " + pageSize + " ROWS ONLY";
} else if (lastMaxId != null) {
	selectSQL = sqlFetchRows + " and id > " + lastMaxId + " order by id asc" + " limit " + 0 + "," + pageSize;
} else {
	selectSQL = sqlFetchRows + " limit " + startRow + "," + pageSize;
}
//添加如下代码
if(STANDALONE_MODE && PropertyUtil.isStandaloneUseHighgo()) {
	selectSQL = sqlFetchRows + " OFFSET " + startRow + " LIMIT " + pageSize ;
}

fetchPageLimit 方法3个

if (STANDALONE_MODE && !PropertyUtil.isStandaloneUseMysql() && !PropertyUtil.isStandaloneUseHighgo()) {
	selectSQL = selectSQL.replaceAll("(?i)LIMIT \\?,\\?", "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY");
}
//添加如下代码
if(STANDALONE_MODE && PropertyUtil.isStandaloneUseHighgo()) {
	selectSQL = selectSQL.replaceAll("(?i)LIMIT \\?,\\?", "OFFSET ? LIMIT ? ");
}

updateLimit 方法

if (STANDALONE_MODE && !PropertyUtil.isStandaloneUseMysql() && !PropertyUtil.isStandaloneUseHighgo()) {
	sqlUpdate = sqlUpdate.replaceAll("limit \\?", "OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY");
}

综上,需要修改的类包括

package com.alibaba.nacos.config.server.service:

  • BasicDataSourceServiceImpl;
  • DynamicDataSource;
  • LocalDataSourceServiceImpl;
  • ConfigService;

package com.alibaba.nacos.config.server.service.capacity:

  • GroupCapacityPersistService;
  • TenantCapacityPersistService

package com.alibaba.nacos.config.server.controller:

  • ConfigServletInner;

package com.alibaba.nacos.config.server.utils:

  • PaginationHelper;
  • PropertyUtil;

5.运行项目

#启动的时候我们需要改下启动参数来表明我们是单机启动的
-Dnacos.standalone=true

在这里插入图片描述
在这里插入图片描述

http://192.168.10.127:8848/nacos/index.html

用户名:nacos

密 码:nacos

6.打包

mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Dcheckstyle.skip=true clean install -U

运行成功后在nacos\distribution\target目录下生成对应的打包文件

在这里插入图片描述
源码链接: https://pan.baidu.com/s/1Dxn00Z_kqFmduBSjlPd5Cw?pwd=m9mh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值