背景

国产化的推行,项目开始使用达梦数据库,使用Nacos作为配置中心,需要对数据进行持久化存储。此处使用docker-compose部署nacos。

参考文章

Nacos适配达梦数据库(不修改源码),基于Docker-compose_nacos 达梦数据库

Nacos数据库适配插件

实现步骤

第一步:部署一个没有使用外部数据源的nacos

此处部署的是 nacos 2.3.2版本,docker-compose配置文件内容如下,运行启动后默认账号密码都是nacos

version: "3"
services:
  nacos:
    image: nacos/nacos-server:v2.3.2-slim
    container_name: nacos
    environment:
        - PREFER_HOST_MODE=hostname
        - MODE=standalone
        - NACOS_AUTH_ENABLE=true
        - NACOS_AUTH_IDENTITY_KEY=serverIdentity
        - NACOS_AUTH_IDENTITY_VALUE=security
        - NACOS_AUTH_TOKEN=ZDFhMTUyMDItYjAyZi00ZTM3LTkzYzctNmQxNTIyOTUyNzQ1
    volumes:
    - ./standalone-logs/:/home/nacos/logs
    ports:
    - 8848:8848
    - 9848:9848

部署完成之后,使用

docker exec -it nacos /bin/bash

命令进入到容器中,执行ll可以看到当前目录下的文件信息如下图

nacos容器目录结构
nacos容器目录结构

进入conf目录下可以看到nacos启动的配置文件: application.properties

第二步:拷贝出nacos启动的配置文件进行修改

确定容器中application.properties配置文件的路径之后,退出容器,使用docker cp命令将文件从容器中拷贝出来:

docker cp nacos:/home/nacos/conf/application.properties ./conf/application.properties

使用vim编辑器打开application.properties进行修改,修改后的文件内容如下:

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
#spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=mysql
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
#db.num=${MYSQL_DATABASE_NUM:1}
#db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
#db.user.0=${MYSQL_SERVICE_USER}
#db.password.0=${MYSQL_SERVICE_PASSWORD}
db.num=1
db.url.0=jdbc:dm://192.168.20.222:5237?schema=NACOS&characterEncoding=UTF-8&useUnicode=true&serverTimezone=Asia/Shanghai
db.user.0=NACOS
db.password.0=wydm@nacos
## DB connection pool settings
db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
db.pool.config.driver-class-name=dm.jdbc.driver.DmDriver
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.console.ui.enabled=true
nacos.core.param.check.enabled=true

主要修改了这部分:

application.properties修改部分
application.properties修改部分

注意:

虽然我们配置的是达梦的数据库连接信息,但是数据源平台配置成了mysql,为啥呢,因为官方文档里面说的配置成dm并不生效,会提示找不到数据源dm。以下图片来源于参考文章的第二篇(nacos官方)。

nacos官方配置达梦说明文档
nacos官方配置达梦说明文档

第三步:将达梦数据库驱动程序映射进入docker

docker-compose.yaml同级目录下创建一个plugins目录,把达梦数据库的驱动程序放入这个目录下,然后修改docker-compose.yaml文件, 把修改后的application.properties文件和达梦数据库的驱动映射到容器中。最终修改后的docker-compose.yaml文件内容如下:

version: "3"
services:
  nacos:
    image: nacos/nacos-server:v2.3.2-slim
    container_name: nacos
    environment:
        - PREFER_HOST_MODE=hostname
        - MODE=standalone
        - NACOS_AUTH_ENABLE=true
        - NACOS_AUTH_IDENTITY_KEY=serverIdentity
        - NACOS_AUTH_IDENTITY_VALUE=security
        - NACOS_AUTH_TOKEN=ZDFhMTUyMDItYjAyZi00ZTM3LTkzYzctNmQxNTIyOTUyNzQ1
    volumes:
    - ./standalone-logs/:/home/nacos/logs
    - ./conf/application.properties:/home/nacos/conf/application.properties
    - ./plugins/:/home/nacos/plugins/
    ports:
    - 8848:8848
    - 9848:9848

docker-compose.yaml文件所在目录结构如下图所示:

配置完成后的docker-compose.yaml同级目录
配置完成后的docker-compose.yaml同级目录

第四步:启动容器,验证

启动容器,访问页面,随便创建几个用户,看数据库里用户表有没有变化,有则配置成功。

总结

三步走:

  1. 修改application.properties配置文件;
  2. 映射驱动;
  3. 启动验证。

过程中的难点在于配置application.properties的时候有个坑,就是官方文档写的dm不生效,改成了mysql解决。