团队接到一个项目,项目要求使用国化产数据库和国产化操作系统,之前没有使用过,于是简单研究了一下。由于项目采用微服务架构,需要考虑注册中心(nacos)对国产数据库的支持,相应的进行配置调整。
nacos原生支持内存数据库和mysql数据库,并不支持达梦或是人大金仓数据库。于是网上找了一遍,几篇文章都是说要修改nacos源码,以增加自定义驱动。
于是我按文章所写,下载并修改了nacos源码,正准备测试之际,突然想到这种做法不太友好,有没有别的办法?
问题的关键在于两点:
1、如何在nacos中加载数据库驱动JAR包?
2、如何修改nacos的数据库驱动配置?
解决方案:
1、在nacos启动时,额外加载外部JAR包。
2、在nacos启动的环境变量中,找到设置数据库驱动类的变量
由于本项目采用Docker+Docker-compose进行容器化部署,在不修改nacos源码的情况下,采用官方Docker镜像进行容器配置,具体配置如下:
nacos容器的Docker-compose配置(人大金仓数据库示例)
nacos:
image: nacos/nacos-server:v2.2.0
container_name: nacos
environment:
MODE: standalone
JVM_XMS: 512m
JVM_XMX: 512m
JVM_XMN: 256m
DB_POOL_CONFIG_DRIVERCLASSNAME: com.kingbase8.Driver
JAVA_OPT: "${JAVA_OPT} -Dloader.path=/home/nacos/libs"
volumes:
- /docker/nacos/libs/kingbase8-8.6.0.jar:/home/nacos/libs/kingbase8-8.6.0.jar
- /docker/nacos/conf/application.properties:/home/nacos/conf/application.properties
- /docker/nacos/logs/:/home/nacos/logs
privileged: true
restart: always
network_mode: "host"
配置解析:
1.该环境变量DB_POOL_CONFIG_DRIVERCLASSNAME
可以设置nacos的数据库驱动类。
2.该挂载配置/docker/nacos/libs/kingbase8-8.6.0.jar:/home/nacos/libs/kingbase8-8.6.0.jar
往nacos容器中增加驱动包
3.该环境变量JAVA_OPT: "${JAVA_OPT} -Dloader.path=/home/nacos/libs"
将会使得nacos在启动时加载/home/nacos/libs
目录下的jar包。这里要特别说明一下,这里能够使用loader.path
变量,是基于nacos的console模块的pom.xml文件中的插件spring-boot-maven-plugin
配置了<layout>ZIP</layout>
属性,否则loader.path
变量无法生效,从这个意义上来说,nacos原生支持启动时加载外部jar包。
nacos服务的配置application.properties(人大金仓数据库示例)
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:kingbase8://192.168.0.17:54321/nacos_config?allowEncodingChanges=true&clientEncoding=UTF8
db.user.0=system
db.password.0=123456
配置解析:
1.spring.datasource.platform=mysql
这个配置写的是mysql,实际上在此处与mysql无关,仅仅表示为使用外部数据库来存储nacos数据。
2.db.url.0=jdbc:kingbase8://192.168.0.17:54321/nacos_config?allowEncodingChanges=true&clientEncoding=UTF8
这个配置有个坑,人大金仓数据库的客户端编码,默认使用jvm编码,而jvm编码与数据库编码不一致,会导致连不上数据库,nacos启动会报No DataSource Set的异常,因而在此处URL后面配置客户端编码clientEncoding=UTF8
,根据人大金仓官方文档,这个参数默认不可修改,还需要设置allowEncodingChanges=true
才允许修改。
最后,需要注意的就是nacos建表语句。nacos默认提供的是mysql数据库的建表语句示例,并且不同版本的nacos的建表语句会有差异。
基于nacos 2.2.0的人大金仓数据库的建表语句示例。
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE config_info (
id integer AUTO_INCREMENT NOT NULL,
data_id varchar (255) NOT NULL ,
group_id varchar(128) DEFAULT NULL,
content text NOT NULL ,
md5 varchar(32) DEFAULT NULL ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
src_user text ,
src_ip varchar(20) DEFAULT NULL ,
app_name varchar(128) DEFAULT NULL,
tenant_id varchar(128) DEFAULT '',
c_desc varchar(255) DEFAULT NULL,
c_use varchar(64) DEFAULT NULL,
effect varchar(64) DEFAULT NULL,
type varchar(64) DEFAULT NULL,
c_schema text,
encrypted_data_key text
) ;
COMMENT ON TABLE config_info IS 'config_info';
COMMENT ON COLUMN config_info.gmt_create IS '创建时间';
COMMENT ON COLUMN config_info.gmt_modified IS '修改时间';
COMMENT ON COLUMN config_info.src_user IS 'source user';
COMMENT ON COLUMN config_info.src_ip IS 'source ip';
COMMENT ON COLUMN config_info.tenant_id IS '租户字段';
COMMENT ON COLUMN config_info.encrypted_data_key IS '秘钥';
ALTER TABLE config_info ADD CONSTRAINT pk_config_info primary key (ID) ENABLE VALIDATE;
ALTER TABLE config_info ADD CONSTRAINT uk_configinfo_datagrouptenant UNIQUE (
data_id,group_id,tenant_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE config_info_aggr (
id integer AUTO_INCREMENT NOT NULL ,
data_id varchar(255) NOT NULL ,
group_id varchar(128) NOT NULL ,
datum_id varchar(255) NOT NULL ,
content text NOT NULL ,
gmt_modified datetime NOT NULL ,
app_name varchar(128) DEFAULT NULL,
tenant_id varchar(128) DEFAULT ''
) ;
COMMENT ON TABLE config_info_aggr IS '增加租户字段';
COMMENT ON COLUMN config_info_aggr.content IS '内容';
COMMENT ON COLUMN config_info_aggr.gmt_modified IS '修改时间';
COMMENT ON COLUMN config_info_aggr.tenant_id IS '租户字段';
ALTER TABLE config_info_aggr ADD CONSTRAINT pk_config_info_aggr primary key (id) ENABLE VALIDATE;
ALTER TABLE config_info_aggr ADD CONSTRAINT uk_configinfoaggr_datagrouptenantdatum UNIQUE (
data_id,group_id,tenant_id,datum_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE config_info_beta (
id integer AUTO_INCREMENT NOT NULL ,
data_id varchar(255) NOT NULL ,
group_id varchar(128) NOT NULL ,
app_name varchar(128) DEFAULT NULL ,
content text NOT NULL ,
beta_ips text DEFAULT NULL ,
md5 varchar(32) DEFAULT NULL ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
src_user text ,
src_ip varchar(20) DEFAULT NULL ,
tenant_id varchar(128) DEFAULT '' ,
encrypted_data_key text
);
COMMENT ON TABLE config_info_beta IS 'config_info_beta';
COMMENT ON COLUMN config_info_beta.gmt_create IS '创建时间';
COMMENT ON COLUMN config_info_beta.gmt_modified IS '修改时间';
COMMENT ON COLUMN config_info_beta.src_user IS 'source user';
COMMENT ON COLUMN config_info_beta.tenant_id IS '租户字段';
COMMENT ON COLUMN config_info_beta.encrypted_data_key IS '秘钥';
ALTER TABLE config_info_beta ADD CONSTRAINT pk_config_info_beta primary key (id) ENABLE VALIDATE;
ALTER TABLE config_info_beta ADD CONSTRAINT uk_configinfobeta_datagrouptenant UNIQUE (
data_id,group_id,tenant_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE config_info_tag (
id integer AUTO_INCREMENT 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) DEFAULT NULL ,
content text NOT NULL ,
md5 varchar(32) DEFAULT NULL ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
src_user text ,
src_ip varchar(20) DEFAULT NULL
) ;
COMMENT ON TABLE config_info_tag IS 'config_info_tag';
COMMENT ON COLUMN config_info_tag.gmt_create IS '创建时间';
COMMENT ON COLUMN config_info_tag.gmt_modified IS '修改时间';
COMMENT ON COLUMN config_info_tag.src_user IS 'source user';
COMMENT ON COLUMN config_info_tag.src_ip IS 'source ip';
ALTER TABLE config_info_tag ADD CONSTRAINT pk_config_info_tag primary key (id) ENABLE VALIDATE;
ALTER TABLE config_info_tag ADD CONSTRAINT uk_configinfotag_datagrouptenanttag UNIQUE (
data_id,group_id,tenant_id,tag_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_tags_relation */
/******************************************/
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 integer AUTO_INCREMENT NOT NULL
) ;
COMMENT ON TABLE config_tags_relation IS 'config_tag_relation';
ALTER TABLE config_tags_relation ADD CONSTRAINT pk_config_tags_relation primary key (nid) ENABLE VALIDATE;
ALTER TABLE config_tags_relation ADD CONSTRAINT uk_configtagrelation_configidtag UNIQUE (
id,tag_name,tag_type
) ENABLE VALIDATE;
CREATE INDEX idx_tenant_id ON config_tags_relation USING BTREE (tenant_id) TABLESPACE sys_default;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE group_capacity (
id integer NOT NULL AUTO_INCREMENT ,
group_id varchar(128) NOT NULL DEFAULT '' ,
quota integer NOT NULL DEFAULT '0' ,
usage integer NOT NULL DEFAULT '0' ,
max_size integer NOT NULL DEFAULT '0' ,
max_aggr_count integer NOT NULL DEFAULT '0' ,
max_aggr_size integer NOT NULL DEFAULT '0' ,
max_history_count integer NOT NULL DEFAULT '0' ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ;
COMMENT ON TABLE group_capacity IS '集群、各Group容量信息表';
COMMENT ON COLUMN group_capacity.id IS '主键ID';
COMMENT ON COLUMN group_capacity.group_id IS 'Group ID,空字符表示整个集群';
COMMENT ON COLUMN group_capacity.quota IS '配额,0表示使用默认值';
COMMENT ON COLUMN group_capacity.usage IS '使用量';
COMMENT ON COLUMN group_capacity.max_size IS '单个配置大小上限,单位为字节,0表示使用默认值';
COMMENT ON COLUMN group_capacity.max_aggr_count IS '聚合子配置最大个数,,0表示使用默认值';
COMMENT ON COLUMN group_capacity.max_aggr_size IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值';
COMMENT ON COLUMN group_capacity.max_history_count IS '最大变更历史数量';
COMMENT ON COLUMN group_capacity.gmt_create IS '创建时间';
COMMENT ON COLUMN group_capacity.gmt_modified IS '修改时间';
ALTER TABLE group_capacity ADD CONSTRAINT pk_group_capacity primary key (id) ENABLE VALIDATE;
ALTER TABLE group_capacity ADD CONSTRAINT uk_group_id UNIQUE (
group_id
) ENABLE VALIDATE;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE his_config_info (
id bigint NOT NULL,
nid bigint NOT NULL AUTO_INCREMENT,
data_id varchar(255) NOT NULL,
group_id varchar(128) NOT NULL,
app_name varchar(128) DEFAULT NULL ,
content text NOT NULL,
md5 varchar(32) DEFAULT NULL,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
src_user text,
src_ip varchar(20) DEFAULT NULL,
op_type char(10) DEFAULT NULL,
tenant_id varchar(128) DEFAULT '' ,
encrypted_data_key text
) ;
COMMENT ON TABLE his_config_info IS '多租户改造';
COMMENT ON COLUMN his_config_info.tenant_id IS '租户字段';
COMMENT ON COLUMN his_config_info.encrypted_data_key IS '秘钥';
ALTER TABLE his_config_info ADD CONSTRAINT pk_his_config_info primary key (nid) ENABLE VALIDATE;
CREATE INDEX idx_gmt_create ON his_config_info USING BTREE (gmt_create) TABLESPACE sys_default;
CREATE INDEX idx_gmt_modified ON his_config_info USING BTREE (gmt_modified) TABLESPACE sys_default;
CREATE INDEX idx_did ON his_config_info USING BTREE (data_id) TABLESPACE sys_default;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE tenant_capacity (
id bigint NOT NULL AUTO_INCREMENT ,
tenant_id varchar(128) NOT NULL DEFAULT '' ,
quota integer NOT NULL DEFAULT '0' ,
usage integer NOT NULL DEFAULT '0' ,
max_size integer NOT NULL DEFAULT '0' ,
max_aggr_count integer NOT NULL DEFAULT '0' ,
max_aggr_size integer NOT NULL DEFAULT '0' ,
max_history_count integer NOT NULL DEFAULT '0' ,
gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ;
COMMENT ON TABLE tenant_capacity IS '租户容量信息表';
COMMENT ON COLUMN tenant_capacity.id IS '主键ID';
COMMENT ON COLUMN tenant_capacity.tenant_id IS 'Tenant ID';
COMMENT ON COLUMN tenant_capacity.quota IS '配额,0表示使用默认值';
COMMENT ON COLUMN tenant_capacity.usage IS '使用量';
COMMENT ON COLUMN tenant_capacity.max_size IS '单个配置大小上限,单位为字节,0表示使用默认值';
COMMENT ON COLUMN tenant_capacity.max_aggr_count IS '聚合子配置最大个数';
COMMENT ON COLUMN tenant_capacity.max_aggr_size IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值';
COMMENT ON COLUMN tenant_capacity.max_history_count IS '最大变更历史数量';
COMMENT ON COLUMN tenant_capacity.gmt_create IS '创建时间';
COMMENT ON COLUMN tenant_capacity.gmt_modified IS '修改时间';
ALTER TABLE tenant_capacity ADD CONSTRAINT pk_tenant_capacity primary key (id) ENABLE VALIDATE;
ALTER TABLE tenant_capacity ADD CONSTRAINT uk_tenant_id UNIQUE (
tenant_id
) ENABLE VALIDATE;
CREATE TABLE tenant_info (
id bigint NOT NULL AUTO_INCREMENT ,
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
) ;
COMMENT ON TABLE tenant_info IS 'tenant_info';
COMMENT ON COLUMN tenant_info.gmt_create IS '创建时间';
COMMENT ON COLUMN tenant_info.gmt_modified IS '修改时间';
ALTER TABLE tenant_info ADD CONSTRAINT pk_tenant_info primary key (id) ENABLE VALIDATE;
ALTER TABLE tenant_info ADD CONSTRAINT uk_tenant_info_kptenantid UNIQUE (
kp,tenant_id
) ENABLE VALIDATE;
CREATE INDEX idx_tenant_id_2 ON tenant_info USING BTREE (tenant_id) TABLESPACE sys_default;
insert into tenant_info(id, kp, tenant_id, tenant_name, tenant_desc, create_source, gmt_create, gmt_modified) values
(1, '1', 'dev', 'dev', '开发环境', NULL, 1641741270448, 1641741287236),
(2, '1', 'prod', 'prod', '生产环境', NULL, 1641741270448, 1641741287236),
(3, '1', 'test', 'test', '测试环境', NULL, 1641741270448, 1641741287236);
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,
constraint uk_username_role UNIQUE (username,role)
);
CREATE TABLE permissions (
role varchar(50) NOT NULL,
resource varchar(512) NOT NULL,
action varchar(8) NOT NULL,
constraint uk_role_permission UNIQUE (role,resource,action)
);
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
达梦数据库请根据上面代码示例自行调整即可。