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