前置說明:
? ? ? ? Dokcer部署Nacos官方文檔:Nacos Docker 快速開始 | Nacos 官網
一、Nacos版本說明
Nacos 1.x 版本
-
Nacos 1.1.3 :是一個相對穩定的版本,在一段時期內被廣泛使用,但目前該版本已經下線,不再單獨維護,建議升級至更高版本。
-
Nacos 1.2.1 :從 1.1.3 升級到 1.2.1 版本相對簡單,該版本在功能和穩定性上都有一定提升,為后續升級到 2.x 版本奠定了基礎。
-
Nacos 1.3.3 :在服務發現、配置管理等方面性能提升顯著,如在 100k 服務實例場景下,注冊耗時相比 1.2.0 降低了 75%,整體 cpu 使用率降低了 50%;在 10k 配置場景下,推送耗時相比 1.2.0 降低了 60%,整體 cpu 使用率降低了 55%。
Nacos 2.x 版本
-
Nacos 2.0.0 :相比 1.x 版本新增了 gRPC 的通信方式,需增加 2 個端口,客戶端擁有相同計算邏輯,使用方式與 1.x 版本基本一致,但 2.0 客戶端無法兼容 1.x 服務端。同時,Nacos 2.0 的服務端完全兼容 1.x 客戶端。
-
Nacos 2.1.0 :該版本對 Nacos Server 的內存模型進行了優化,通過堆外內存技術,使配置推送耗時平均降低 60%,服務發現推送耗時平均降低 30%,集群整體吞吐量提升了一倍,并發連接數提升到了 100k,同時將堆內存占用降低了 30%。
-
Nacos 2.2.0 :引入了 v2 的 OpenAPI,并且 2.2.0 及以后版本的服務端兼容 Nacos 1.2.0 之后的所有客戶端版本。
-
Nacos 2.3.2 :作為 2.3.x 分支的版本,在服務發現模塊的性能測試中,99 分位的延遲保持在毫秒級,在 10W 服務實例的規模下,注冊和查詢的 QPS 提升了 3 倍;在配置模塊的性能測試中,推送的平均耗時相比之前的版本提升了 60%,在 10W 配置的規模下,推送耗時相比之前的版本提升了 3.5 倍。
-
Nacos 3.0.1 :同步開源 3.0.1 版本,支持數據源管理功能,可幫助自動輪轉應用訪問數據源的密鑰信息;支持 MCP Registry,能夠快速將存量 API 轉換成 MCP API;還支持開源控制臺默認啟用鑒權,以及重制開源控制臺管理員密碼。
版本兼容性說明
-
與 Spring Cloud Alibaba 的兼容性 :Nacos 不同版本與 Spring Cloud Alibaba 版本有相應適配關系,例如 Spring Cloud Alibaba 2.2.9.RELEASE 對應 Nacos 2.1.0 版本,而 Spring Cloud Alibaba 2.2.0.RELEASE 對應 Nacos 1.1.4 版本等。
-
版本升級兼容性 :從 2.2.0 版本開始,Nacos Server 的版本可以平滑升級,新的 Nacos Server 版本可以兼容老版本的 Nacos Client。如從 2.0.0 升級到 2.3.2 版本,服務端理論上可以兼容 2.0.0 的客戶端,但仍需查閱官方發布的版本更新日志或升級指南,以獲取確切的兼容性信息及可能的注意事項。
Nacos Server 發布歷史地址:發布歷史 | Nacos 官網
Nacos官網文檔:Nacos 配置中心簡介, Nacos 是什么 | Nacos 官網
nacos 的架構原理:Nacos架構&原理免費下載_在線閱讀_藏經閣-阿里云開發者社區
本文將以Nacos2.3.2版本為例
二、安裝Nacos
2.1 拉取鏡像
docker pull nacos/nacos-server:v2.3.2
查看鏡像:
docker images
2.2?準備宿主機目錄(持久化配置)
mkdir -p /docker-nacos # 創建Nacos的根目錄
2.3 復制文件到掛載目錄
需要先啟動nacos鏡像創建容器,才能將容器里面的相關文件復制到掛載目錄。
2.3.1 簡單啟動nacos容器(用于將nacos容器的的相關文件復制到掛載目錄)
docker run --name nacos -d -p 8848:8848 -e MODE=standalone nacos/nacos-server:v2.3.2
2.3.2 復制容器的相關文件到掛載目錄
docker cp nacos:/home/nacos/conf/ /docker-nacos
docker cp nacos:/home/nacos/logs/ /docker-nacos
docker cp nacos:/home/nacos/data/ /docker-nacos
?注意:這里copy到宿主機的目錄下即可
2.3.3 刪除簡單啟動的nacos容器
docker rm -f nacos
2.4?配置 MySQL 數據庫(可選)
Nacos如何配置數據庫,見官方文檔:nacos配置mysql數據庫 | Nacos 官網
2.4.1創建數據庫
方式一:(推薦)
- 從Nacos的
conf
目錄下找到mysql-schema.sql
(針對Nacos 2.x版本),并使用該SQL腳本在你的MySQL數據庫中創建所需的表結構。執行腳本前,請確保你連接的是正確的數據庫實例。
方式二:
在Mysql中創建數據庫,并執行官方SQL腳本:
https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
如果打不開鏈接,直接執行下面準備好的SQL:
/** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*//******************************************/
/* 表名稱 = config_info */
/******************************************/
CREATE TABLE `config_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段',`c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',`c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',`effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述',`type` varchar(64) DEFAULT NULL COMMENT '配置的類型',`c_schema` text COMMENT '配置的模式',`encrypted_data_key` text NOT NULL COMMENT '密鑰',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';/******************************************/
/* 表名稱 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',`content` longtext NOT NULL COMMENT '內容',`gmt_modified` datetime NOT NULL COMMENT '修改時間',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租戶字段';/******************************************/
/* 表名稱 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段',`encrypted_data_key` text NOT NULL COMMENT '密鑰',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';/******************************************/
/* 表名稱 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';/******************************************/
/* 表名稱 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (`id` bigint(20) NOT NULL COMMENT 'id',`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增長標識',PRIMARY KEY (`nid`),UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';/******************************************/
/* 表名稱 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整個集群',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配額,0表示使用默認值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個配置大小上限,單位為字節,0表示使用默認值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大個數,,0表示使用默認值',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個聚合數據的子配置大小上限,單位為字節,0表示使用默認值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大變更歷史數量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',PRIMARY KEY (`id`),UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';/******************************************/
/* 表名稱 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (`id` bigint(20) unsigned NOT NULL COMMENT 'id',`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增標識',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`op_type` char(10) DEFAULT NULL COMMENT 'operation type',`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶字段',`encrypted_data_key` text NOT NULL COMMENT '密鑰',PRIMARY KEY (`nid`),KEY `idx_gmt_create` (`gmt_create`),KEY `idx_gmt_modified` (`gmt_modified`),KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租戶改造';/******************************************/
/* 表名稱 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配額,0表示使用默認值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個配置大小上限,單位為字節,0表示使用默認值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大個數',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個聚合數據的子配置大小上限,單位為字節,0表示使用默認值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大變更歷史數量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租戶容量信息表';CREATE TABLE `tenant_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`kp` varchar(128) NOT NULL COMMENT 'kp',`tenant_id` varchar(128) default '' COMMENT 'tenant_id',`tenant_name` varchar(128) default '' COMMENT 'tenant_name',`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',`gmt_create` bigint(20) NOT NULL COMMENT '創建時間',`gmt_modified` bigint(20) NOT NULL COMMENT '修改時間',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';CREATE TABLE `users` (`username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',`password` varchar(500) NOT NULL COMMENT 'password',`enabled` boolean NOT NULL COMMENT 'enabled'
);CREATE TABLE `roles` (`username` varchar(50) NOT NULL COMMENT 'username',`role` varchar(50) NOT NULL COMMENT 'role',UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);CREATE TABLE `permissions` (`role` varchar(50) NOT NULL COMMENT 'role',`resource` varchar(128) NOT NULL COMMENT 'resource',`action` varchar(8) NOT NULL COMMENT 'action',UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
我們這邊根據《方式一》創建一個數據庫名為nacos的數據庫,并執行上面的SQL:
2.4.2 修改配置文件
我們要修改/docker-nacos/conf/application.properties這個文件,首先備份一份,防止改壞了。
2.4.3 修改前的配置
修改前的配置如下:
# 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:}
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 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
### 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
2.4.4?配置數據庫后的配置
注意:需要加上數據庫的類型
修改后的配置如下(數據庫信息根據自己的填):
# 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:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
spring.datasource.platform=mysql
db.num=${MYSQL_DATABASE_NUM:1}
# 這里必須為公網或服務器內網地址,我這里是服務器的內網地址,容器內部沒有mysql,絕對不能使用 127.0.0.1和localhost
# 如果nacos啟動失敗,Nacos Server did not start because dumpservice bean construction failure : No DataSource set
# 加上 &serverTimezone=UTC ,再不行就加上 &allowPublicKeyRetrieval=true
db.url.0=jdbc:mysql://120.27.216.193:13306/nacos?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=root
db.password.0=xxxx
## 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
### 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
2.5 啟動容器
docker run -d --name nacos \
--restart=always \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-e MODE=standalone \
-v /docker-nacos/conf/:/home/nacos/conf \
-v /docker-nacos/logs:/home/nacos/logs \
-v /docker-nacos/data:/home/nacos/data \
nacos/nacos-server:v2.3.2
命令解釋:
基礎命令
docker run
:創建并啟動一個新容器。
-d
:以后臺模式(detached)運行容器。
--name nacos
:為容器指定名稱?nacos
(便于后續管理)。
重啟策略
--restart=always
:當容器退出時自動重啟(即使宿主機重啟也會重新啟動容器)。
端口映射
-p 8848:8848
:將容器內的?8848
?端口(Nacos 控制臺/API 端口)映射到宿主機的?8848
?端口。
-p 9848:9848 -p 9849:9849
:
Nacos 2.0+ 新增的 gRPC 通信端口(用于客戶端與服務端通信),必須同時暴露:
9848
:服務端 Raft 協議端口。
9849
:客戶端 gRPC 請求端口。📌?注意:若使用 Nacos 2.x 客戶端,必須開放?
9848/9849
?端口,否則客戶端無法連接。
運行模式
-e MODE=standalone
:設置環境變量,指定以單機模式運行(無需集群,適合開發/測試)。
數據卷掛載(持久化數據)
將容器內目錄映射到宿主機路徑,防止容器銷毀后數據丟失:
-v /docker-nacos/conf/:/home/nacos/conf
掛載配置文件目錄(如?application.properties
)。
-v /docker-nacos/logs:/home/nacos/logs
掛載日志目錄。
-v /docker-nacos/data:/home/nacos/data
掛載數據目錄(服務注冊信息、配置數據等)。💡 確保宿主機目錄已創建(如?
mkdir -p /docker-nacos/{conf,logs,data}
)。
鏡像信息
nacos/nacos-server:v2.3.2
:
使用官方鏡像的?v2.3.2
?版本(Nacos 2.x 系列)。
查看日志可以看到Nacos正常啟動:
接下來我們訪問一下地址,發現地址也能正常訪問,訪問的地址是:Nacos
http://<服務器的 IP 地址>:8848/nacos
由于我們沒有開啟鑒權模式,所以就直接進入了,沒有輸入用戶名和密碼。
2.6 開啟鑒權模式
?nacos2.0.0以上的版本需要開啟鑒權,詳情看這里:配置鑒權 | Nacos 官網
開啟后的配置如下:
# 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:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
spring.datasource.platform=mysql
db.num=${MYSQL_DATABASE_NUM:1}
# 這里必須為公網或服務器內網地址,我這里是服務器的內網地址,容器內部沒有mysql,絕對不能使用 127.0.0.1和localhost
# 如果nacos啟動失敗,Nacos Server did not start because dumpservice bean construction failure : No DataSource set
# 加上 &serverTimezone=UTC ,再不行就加上 &allowPublicKeyRetrieval=true
db.url.0=jdbc:mysql://120.27.216.193:13306/nacos?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=root
db.password.0=xxxx
## 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
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
# 鑒權類型,默認為nacos
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
# 用戶登陸臨時accessToken的過期時間,默認18000
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}# 是否開啟鑒權功能,默認為false
nacos.core.auth.enabled=true### The default token:
# Base64加密前密碼 TcmxJw05k$-_zcx.)8EtFC^D^F1W!IPr
# Base64加密后密碼 VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=
# 加密網站:https://www.qqxiuzi.cn/bianma/base64.htm
# 自定義密鑰,在自定義密鑰時,推薦將配置項設置為Base64編碼的字符串,且原始密鑰長度不得低于32字符。
nacos.core.auth.plugin.nacos.token.secret.key=VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=
# 默認鑒權插件用于生成用戶登陸臨時accessToken所使用的密鑰,在2.2.0.1后無默認值,必須執行此變更,否則無法啟動;其他版本為建議設置。
nacos.core.auth.plugin.nacos.token.secret.key=VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=
### 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}
# 關閉使用user-agent判斷服務端請求并放行鑒權的功能
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
# 用于替換useragent白名單的身份識別key,不可為空,2.2.1后無默認值
# 這兩個屬性是鑒權的白名單,用于識別來自其他服務器的請求。鑒權開啟時,這兩個參數必須配置,否則會報錯
nacos.core.auth.server.identity.key=nacosKey
# 用于替換useragent白名單的身份識別value,不可為空,2.2.1后無默認值
nacos.core.auth.server.identity.value=nacosValue
## 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
重啟Nacos:
docker restart nacos
訪問Nacos:
當我們按下回車后:
按下回車后,URL會自動補全,而且登錄進去后,重新退出來,發現URL變成了http://121.40.159.231:8848/nacos/#/login
,沒有那個權限不足的彈窗了
以上問題的原因,懷疑是不是nacos-2.3.2這個版本有bug,因為官方說從 nacos-2.2.1版本之后,配置文件里面的auth相關的用戶認證的參數需要自己填寫值,這個地址:配置鑒權 | Nacos 官網?說明了認證相關的參數怎么配置。
2.7 測試是否持久化到數據庫
2.7.1 默認賬號密碼登錄
使用默認賬號:nacos? 密碼:nacos 進行登錄:
登錄成功:
nacos在數據庫存儲的加密后為(采用BCrypt 加密算法):$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu
2.7.2 修改密碼測試
把密碼修改為(未加密前的密碼為66666):$2a$10$IhZOFRuMO92LE4/XXL10nuquJJqLiz1mUXxG1JNGGABYTuASKqru2
使用nacos 66666 進行登錄:
登錄成功:
2.7.3 添加用戶測試
數據庫也成功持久化:
2.8 踩坑日記
通過上面的配置+命令啟動Nacos,發現Nacos一直在重啟,并且報錯:
從錯誤日志中可以看出,Nacos 啟動失敗的核心原因是?JWT 密鑰配置問題
問題原因分析
-
開啟鑒權但缺少密鑰:
-
您設置了?
-e NACOS_AUTH_ENABLE=true
?開啟了安全鑒權 -
但未提供必要的 JWT 密鑰配置
-
-
Nacos 的密鑰要求:
-
密鑰長度必須 ≥32 字節(256 位)
-
密鑰必須經過 Base64 編碼
-
參考文檔:配置鑒權 | Nacos 官網
-
查看我們的配置文件,發現確實沒有填入對應的密鑰:
加入對應的密鑰:
### The default token:
# Base64加密前密碼 TcmxJw05k$-_zcx.)8EtFC^D^F1W!IPr
# Base64加密后密碼 VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=
# 加密網站:https://www.qqxiuzi.cn/bianma/base64.htm
nacos.core.auth.plugin.nacos.token.secret.key=VGNteEp3MDVrJC1femN4Lik4RXRGQ15EXkYxVyFJUHI=
改為配置重啟后就正常啟動了:
其他踩坑問題可以見文章:在docker中安裝nacos,很詳細_docker安裝nacos-CSDN博客