国产化数据库(达梦DM、人大金仓kingbase8)部署基于Docker的Nacos服务(不需修改nacos源码)

栏目归类:人大金仓数据库
发布时间:2024-03-26 18:50:16

团队接到一个项目,项目要求使用国化产数据库和国产化操作系统,之前没有使用过,于是简单研究了一下。由于项目采用微服务架构,需要考虑注册中心(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包。

补充一下:
从2.3.0版本开始,nacos启动时,会自己默认从以下目录加载外部jar包:/home/nacos/plugins, 我们只需要把驱动包,挂载到容器里的这个目录,如果你使用的是nacos-server 2.3.0以上版本,不需要再写此配置:JAVA_OPT: "${JAVA_OPT} -Dloader.path=/home/nacos/libs",相反,该配置会被Nacos本身覆盖,不生效。挂载目录修改:
- /docker/nacos/libs/kingbase8-8.6.0.jar:/home/nacos/libs/kingbase8-8.6.0.jar修改为
- /docker/nacos/libs/kingbase8-8.6.0.jar:/home/nacos/plugins/kingbase8-8.6.0.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');

达梦数据库请根据上面代码示例自行调整即可。

文章来源:https://blog.csdn.net/byzxedu/article/details/128626240
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
Hotcall 技术分享站