從零開始:Nacos服務注冊與配置中心實戰教程
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴開源的服務發現、配置管理工具,集注冊中心與配置中心于一體,廣泛應用于微服務架構。本文將從環境搭建到實戰配置,帶你快速掌握Nacos的核心用法。
一、Nacos簡介
Nacos主要提供兩大核心功能:
- 服務注冊與發現:替代Eureka、Consul等,支持服務自動注冊、健康檢查、負載均衡。
- 動態配置管理:集中管理配置文件,支持動態更新無需重啟服務,多環境配置隔離。
本文基于Nacos 2.1.0版本(當前穩定版),兼容Spring Cloud Alibaba 2.2.x及以上。
二、Nacos服務端部署
1. 單機版部署(開發環境)
方式1:Docker快速部署(推薦)
# 拉取鏡像
docker pull nacos/nacos-server:v2.1.0-slim
1.創建掛載目錄
mkdir -p /mydata/nacos/logs/ #新建logs目錄
mkdir -p /mydata/nacos/conf/ #新建conf目錄
ps:這一步是添加映射文件夾,將宿主機的文件映射到nacos容器中,你可以在配置好nacos后再這兩個文件夾下查看日志和配置
2.啟動nacos并復制文件到宿主機,關閉容器
docker run -d --name nacos-server -p 8848:8848 nacos/nacos-server:v2.3.1
這一步是先隨便啟動一下nacos然后nacos容器當中的配置文件和日志復制到我們剛才創建的目錄下,為我們以后的掛載做準備
3.刪除剛才隨便創建的nacos服務
docker rm -f nacos
4.配置MySQL,將nacos按照生產環境標準去配置,默認為內置數據庫(不推薦)
直接在你的服務器mysql數據庫創建一個nacos-mysql-config的數據庫,然后執行下面的語句即可
/** 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');
4.正式啟動nacos
# 啟動容器(單機模式,默認內存模式)
docker run -d \--name nacos \-p 8848:8848 \-p 9848:9848 \-p 9849:9849 \--privileged=true \-e JVM_XMS=256m \-e JVM_XMX=256m \-e JVM_XMN=128m \-e MODE=standalone \-e SPRING_DATASOURCE_PLATFORM=mysql \-e MYSQL_SERVICE_HOST=修改為你的數據庫地址 \-e MYSQL_SERVICE_PORT=3306 \-e MYSQL_SERVICE_DB_NAME=nacos-mysql-config \-e MYSQL_SERVICE_USER=root \-e MYSQL_SERVICE_PASSWORD=修改為你的數據庫密碼 \-e NACOS_AUTH_TOKEN=修改為你加密后的token要求在加密前在32位以上 \-e NACOS_AUTH_IDENTITY_KEY=nacos \-e NACOS_AUTH_IDENTITY_VALUE=secret \-v /mydata/nacos/logs/:/home/nacos/logs \-v /mydata/nacos/conf/:/home/nacos/conf/ \--restart=always \nacos/nacos-server:v2.1.0-slim
5.放通你的防火墻對應的8848,9848,9849端口
這部分不過多說了,網上有很多教程,請你參考配置即可
6.訪問你的nacos服務
這時候你的nacos服務應該說是已經啟動好了,請你修改以下url就訪問你的nacos服務了用戶名和密碼均為:nacos
http://你的IP地址:8848/nacos
方式2:源碼包部署
- 從Nacos官網下載2.1.0版本壓縮包。
- 解壓后進入
bin
目錄,執行啟動命令:# Linux/Mac sh startup.sh -m standalone # Windows cmd startup.cmd -m standalone
2. 驗證服務端是否啟動
訪問控制臺:http://服務器IP:8848/nacos
,默認賬號密碼:nacos/nacos
。
若能登錄,說明服務端部署成功。
三、客戶端集成(Spring Cloud)
1. 引入依賴(Maven)
在pom.xml
中添加:
<!-- 服務發現依賴 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.7.RELEASE</version>
</dependency><!-- 配置中心依賴(如需動態配置) -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.7.RELEASE</version>
</dependency>
2. 服務注冊配置(application.yml)
spring:cloud:nacos:discovery:server-addr: xxxxxx:8848 # 服務端地址正確# 用戶名密碼:使用Nacos默認或服務端配置的賬號(Docker未修改,默認是nacos/nacos)username: nacospassword: nacossecret-key: NWY0ZGNjM2IxxxxxxxxxxxxxxxxN2RlYjg4MmNmOTk=access-key: nacosconfig:server-addr: xxxxxxxxxxxx:8848group: DEFAULT_GROUPfile-extension: yml#讀取配置中心文件配置config:import:- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
參考我的配置:
3. 啟動類添加注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient // 開啟服務注冊發現(Spring Cloud 2020+可省略)
public class EBuiltAuthenticApplication {public static void main(String[] args) {SpringApplication.run(EBuiltAuthenticApplication.class, args);}
}
啟動服務后,在Nacos控制臺的「服務列表」中可看到注冊的服務,說明集成成功。
四、動態配置中心使用
1. 添加配置文件(bootstrap.yml)
注意:配置中心需使用bootstrap.yml
(加載優先級高于application.yml
):
spring:application:name: e-built-authenticcloud:nacos:config:server-addr: 43.138.10.233:8848 # 配置中心地址file-extension: yaml # 配置文件格式(yaml/xml/properties)group: DEFAULT_GROUP # 配置分組(默認DEFAULT_GROUP)namespace: # 命名空間(用于多環境隔離,默認public)# 認證配置(同服務注冊)username: nacospassword: nacos
2. 在Nacos控制臺添加配置
- 進入控制臺「配置管理」→「配置列表」,點擊「+」新建配置:
- Data ID:
e-built-authentic.yaml
(格式:服務名.文件格式) - Group:
DEFAULT_GROUP
(與客戶端配置一致) - 配置內容:
user:name: nacos-testage: 18
- Data ID:
3. 客戶端獲取動態配置
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope // 開啟動態刷新配置
public class ConfigController {@Value("${user.name:default}")private String userName;@GetMapping("/user/name")public String getUserName() {return userName;}
}
- 訪問
/user/name
,返回nacos-test
,說明配置生效。 - 在Nacos控制臺修改
user.name
的值,無需重啟服務,再次訪問即可獲取新值。
五、常見問題與解決方案
1. 服務注冊失敗:Client not connected
- 原因:網絡不通或端口未開放。
- 解決:
- 開放Nacos端口:8848(HTTP)、9848-9849(gRPC)。
- 檢查云服務器安全組、防火墻是否放行上述端口。
- 驗證命令:
telnet 服務器IP 8848
(能連接則網絡正常)。
2. 認證失敗:authentication failed
- 原因:客戶端與服務端認證參數不匹配。
- 解決:確保客戶端
access-key
/secret-key
與服務端NACOS_AUTH_IDENTITY_KEY
/NACOS_AUTH_TOKEN
一致。
3. 配置不生效:@Value
獲取為默認值
- 原因:
Data ID
或Group
與客戶端配置不一致。 - 解決:
Data ID
必須為「服務名.文件格式」(如e-built-authentic.yaml
),Group
需與客戶端group
配置一致。
六、生產環境注意事項
- 集群部署:生產環境需部署Nacos集群,避免單點故障。
- 數據持久化:默認使用內存存儲,生產需配置MySQL持久化(修改
conf/application.properties
)。 - 安全加固:
- 開啟認證(
NACOS_AUTH_ENABLE=true
)。 - 自定義復雜的
NACOS_AUTH_TOKEN
。 - 限制客戶端IP訪問(通過安全組或Nacos權限控制)。
- 開啟認證(
- 版本兼容:Spring Cloud Alibaba與Nacos版本需嚴格匹配(參考官方兼容性文檔)。
七、總結
Nacos作為微服務架構的核心組件,簡化了服務注冊發現與配置管理流程。本文從部署到實戰,覆蓋了開發環境的核心配置,掌握這些內容后,可進一步探索Nacos的高級特性(如配置灰度發布、服務路由等)。
如果在使用中遇到其他問題,歡迎在評論區交流~
本文同步發布于個人技術博客,轉載請注明出處。更多微服務相關教程,敬請關注后續更新!