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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Docker数据库