一、什么是Nacos?

Nacos是Naming and Configuration Service的缩写,是由阿里巴巴开源的、更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,支持AP/CP 模式切换。迄今为止,一共有三个大版本,1.x、2.x、3.x。这三个大版本都有较大的更新,发展迅猛、社区活跃、功能齐全、配置简单,可以说是现在微服务项目中注册中心和配置中心的最佳选择。

二、Nacos解决了什么问题?

1、服务治理,解决了服务动态上下线感知、服务之间的可靠调用和自动容错问题。在微服务架构中,服务实例是动态的,如果没有服务治理,那么后续在服务运行的过程中增加实例,是需要去修改路由配置文件来链接新的服务实例的。
2、配置管理,解决了配置如何集中管理和动态更新的问题。在微服务系统中,你可能有几十个上百个服务实例,而每个服务实例都有自己的配置文件,如果不集中管理和动态更新,那么需要修改一个配置的时候(比如数据库连接地址),你要去修改同类型服务的多个实例里面的配置文件,还需要重启实例,麻烦不说,实例多的话还容易出错。

三、Nacos注册中心的工作原理(服务治理)

1.X

当微服务启动时,会通过 NamingClient 客户端向 Nacos服务端注册自己的服务信息(包括IP、端口、健康状态等),服务端将这些信息存储在内存中并定期进行健康检查,同时通过心跳机制维持服务实例的活性状态。当其他服务需要调用该服务时,可以通过服务名从Nacos 服务端获取到所有可用的服务实例列表,Nacos 支持基于权重的负载均衡策略,整个过程中,Nacos通过HTTP + 长连接推送机制实现服务变更的实时通知,确保服务调用方能够及时获取到最新的服务实例信息,从而实现微服务架构中服务的自动注册与发现功能。

2.X

Nacos 2.x 注册中心在 1.x 版本基础上进行了重大升级,采用了全新的 gRPC 长连接通信机制替代了原来的 HTTP 短连接,提升了通信效率和性能。在架构上引入了 NamingServer 和 NamingClient 的全新设计,通过 gRPC 双向流实现了服务端与客户端的实时双向通信。当微服务启动时,客户端会与服务端建立长连接并通过 BiRequestStream 双向流进行服务注册和心跳维持,服务端将服务实例信息存储在内存中并通过 Distro 协议在集群节点间进行数据同步。服务发现方面,Nacos 2.x 支持 Reactive 编程模型,客户端可以订阅服务变化并通过长连接实时接收服务实例的变更推送。同时,2.x 版本还引入了 ProtocolManager 来管理多种通信协议,支持更多的扩展性和兼容性。相比 1.x 版本,2.x在性能、实时性和可扩展性方面都有显著提升,能够更好地支持大规模微服务架构下的服务治理需求。

3.X

在核心架构上延续了 2.x 的 gRPC 长连接通信机制,但进一步优化了服务注册与发现的性能和可靠性。当微服务启动时,客户端通NamingClient 与 Nacos 服务端建立 gRPC长连接,并通过双向流进行服务实例的注册和心跳维持。服务端接收到注册请求后,将服务实例信息存储在内存注册表中,并通过增强的DistroProtocol协议在集群节点间进行快速数据同步,确保数据一致性。在服务发现过程中,客户端可以订阅特定服务的变化,当服务实例发生增减或状态变更时,Nacos服务端会通过已建立的长连接实时推送变更信息给所有订阅者,实现毫秒级的服务发现响应。同时,Nacos 3.x引入了更加完善的健康检查机制,支持 TCP、HTTP、gRPC 等多种健康检查方式,并通过HealthCheckTask定期检测服务实例的可用性,自动剔除不健康的实例。相比之前版本,3.x 在注册中心的性能、一致性和实时性方面都有显著提升。

四、配置中心工作原理(配置管理)

1.X

当应用程序启动时,客户端通过 ConfigService 向 Nacos服务端发起配置查询请求,服务端从数据库(默认是内嵌数据库Derby,但是可以设置成其它的)中读取对应的配置信息并返回给客户端。客户端获取到配置后会将其缓存在本地文件中,以防止服务端不可用时能够继续使用。Nacos采用长轮询机制实现配置的实时推送,客户端会维持一个长连接定期向服务端询问配置是否有更新,一旦服务端检测到配置发生变化,就会立即通过这个长连接将变更的配置信息推送给客户端,客户端收到更新后会重新加载配置并刷新到本地缓存。
在集群部署环境下,Nacos通过数据库或 Raft 协议保证多个节点间配置数据的一致性,确保配置变更能够在整个集群中同步。
同时,Nacos提供了配置的版本管理和回滚功能,支持灰度发布和分组管理,使得配置的变更和管理更加安全可靠。

2.X

Nacos 2.x 配置中心在 1.x 基础上进行了重要升级,采用了 gRPC 长连接替代了原来的 HTTP短连接长轮询机制,提升了配置推送的实时性和性能。
当应用程序启动时,客户端通过 ConfigService 与 Nacos 服务端建立gRPC 双向流连接,客户端可以订阅特定的配置信息。服务端接收到配置查询请求后,从持久化存储层(默认是内嵌数据库Derby,但是可以设置成其它的)读取配置数据并通过 gRPC流返回给客户端,同时客户端会将配置缓存在本地文件中。
当配置发生变更时,Nacos 服务端会通过已建立的 gRPC双向流实时推送更新的配置内容给所有订阅了该配置的客户端,实现毫秒级的配置推送。
在集群部署方面,Nacos 2.x 通过ProtocolManager 统一管理 Raft 等一致性协议,确保配置变更在集群节点间的快速同步和数据一致性。相比 1.x 版本,2.x配置中心在推送实时性、连接效率和系统吞吐量方面都有显著提升,能够更好地支持大规模分布式系统的配置管理需求。

3.X

Nacos 3.x 配置中心在 2.x 基础上进一步优化和扩展,延续了 gRPC 长连接和双向流通信机制,但在架构上更加模块化和插件化。
当应用程序启动时,客户端通过 ConfigService 与 Nacos 服务端建立 gRPC连接,并订阅所需的配置信息。服务端接收到请求后,通过统一的存储层接口从多种持久化存储(如 MySQL、Derby、Oracle等)中读取配置数据,并支持配置的多环境、多租户管理。Nacos 3.x引入了更强大的配置监听机制,客户端可以精确订阅特定配置项的变化,服务端通过优化的事件驱动模型实时检测配置变更,并通过 gRPC双向流将更新推送给所有订阅者。
在集群部署方面,Nacos 3.x 通过 ProtocolManager支持多种一致性协议的动态切换和组合使用,提供了更强的数据一致性和更高的可用性。
同时,3.x版本增强了配置的版本控制、回滚能力和灰度发布功能,支持配置的批量导入导出和权限控制,还提供了更完善的配置审计和监控能力。相比 2.x版本,3.x 配置中心在多数据库支持、安全性、可扩展性和运维便利性方面都有显著提升。

五、Nacos部署

示例版本:Jdk21+Spring Cloud Alibaba 2023.0.1.0+Spring Boot 3.3.13 +
Nacos2.2.1以下的版本,不需要设置鉴权,直接运行脚本就可以了,更改数据库的话差不多。

1、二进制包部署(Windows、Linux、Mac都是差不多的)

1.1、下载Nacos二进制包

Nacos官网下载

Github下载、Gitee,搜Nacos,Alibaba开源的。

1.2、把下载的安装包解压,找到bin目录,然后直接在导航栏把路径去掉,输入cmd,这样就直接到当前目录的命令行,然后输入startup.cmd -m standalone 单机启动。如下图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:启动的时候是需要Java环境的,Nacos3.0.3更是需要Jdk17以上,看一下你系统的环境变量中有没有设置JAVA_HOME,它会检测到这里。

1.3、三个鉴权的秘钥都需要32位字符串的Base64编码,输入进去就启动成功了。
Base64在线编码解码网站。如下图:
在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7e31485db2bb4611ada2e7fb6fa9a705.png在这里插入图片描述
注意:生产环境建议用不一样的。
在这里插入图片描述
1.4 启动成功,控制台地址:http://localhost:8080/index.html,默认账号密码都是nacos
在这里插入图片描述
在这里插入图片描述

1.5、更改配置数据库,默认使用内嵌数据库Derby。把conf目录下面的mysql-schema.sql文件加载到数据库中。再修改一下conf目录下面的application.properties文件,然后再启动,数据源就切过来了。如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、源码编译部署。

2.1、先下载Nacos的源码

github下载

2.2、修改配置文件,3.x版本的源码,修改bootstrap模块下面的application.properties文件。3.x之前的修改distribution模块/conf目录下面的application.properties文件。

#
# Copyright 1999-2025 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.
#

#--------------- Nacos Common Configurations ---------------#

#*************** Nacos port Related Configurations ***************#
### Nacos Server Main port
nacos.server.main.port=8848

#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# nacos.inetutils.prefer-hostname-over-ip=false

### Specify local server's IP:
nacos.inetutils.ip-address=127.0.0.1

#*************** Datasource Related Configurations ***************#
### nacos.plugin.datasource.log.enabled=true
spring.sql.init.platform=mysql
### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=root

#*************** Metrics Related Configurations ***************#
### Metrics for prometheus
#management.endpoints.web.exposure.include=prometheus

### Metrics for elastic search
management.elastic.metrics.export.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200

### Metrics for influx
management.influx.metrics.export.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true

#*************** Core Related Configurations ***************#

### set the WorkerID manually
# nacos.core.snowflake.worker-id=

### Member-MetaData
# nacos.core.member.meta.site=
# nacos.core.member.meta.adweight=
# nacos.core.member.meta.weight=

### MemberLookup
### Addressing pattern category, If set, the priority is highest
# nacos.core.member.lookup.type=[file,address-server]

## Set the cluster list with a configuration file or command-line argument
# nacos.member.list=192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809

## for AddressServerMemberLookup
# Maximum number of retries to query the address server upon initialization
# nacos.core.address-server.retry=5
## Server domain name address of [address-server] mode
# address.server.domain=jmenv.tbsite.net
## Server port of [address-server] mode
# address.server.port=8080
## Request address of [address-server] mode
# address.server.url=/nacos/serverlist

#*************** JRaft Related Configurations ***************#

### Sets the Raft cluster election timeout, default value is 5 second
# nacos.core.protocol.raft.data.election_timeout_ms=5000
### Sets the amount of time the Raft snapshot will execute periodically, default is 30 minute
# nacos.core.protocol.raft.data.snapshot_interval_secs=30
### raft internal worker threads
# nacos.core.protocol.raft.data.core_thread_num=8
### Number of threads required for raft business request processing
# nacos.core.protocol.raft.data.cli_service_thread_num=4
### raft linear read strategy. Safe linear reads are used by default, that is, the Leader tenure is confirmed by heartbeat
# nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe
### rpc request timeout, default 5 seconds
# nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000
### enable to support prometheus service discovery
#nacos.prometheus.metrics.enabled=true

#*************** Distro Related Configurations ***************#

### Distro data sync delay time, when sync task delayed, task will be merged for same data key. Default 1 second.
# nacos.core.protocol.distro.data.sync.delayMs=1000
### Distro data sync timeout for one sync data, default 3 seconds.
# nacos.core.protocol.distro.data.sync.timeoutMs=3000
### Distro data sync retry delay time when sync data failed or timeout, same behavior with delayMs, default 3 seconds.
# nacos.core.protocol.distro.data.sync.retryDelayMs=3000
### Distro data verify interval time, verify synced data whether expired for a interval. Default 5 seconds.
# nacos.core.protocol.distro.data.verify.intervalMs=5000
### Distro data verify timeout for one verify, default 3 seconds.
# nacos.core.protocol.distro.data.verify.timeoutMs=3000
### Distro data load retry delay when load snapshot data failed, default 30 seconds.
# nacos.core.protocol.distro.data.load.retryDelayMs=30000
### enable to support prometheus service discovery
#nacos.prometheus.metrics.enabled=true

#*************** Grpc Configurations ***************#

### Sets the maximum message size allowed to be received on the server.
#nacos.remote.server.grpc.sdk.max-inbound-message-size=10485760
### Sets the time(milliseconds) without read activity before sending a keepalive ping. The typical default is two hours.
#nacos.remote.server.grpc.sdk.keep-alive-time=7200000
### Sets a time(milliseconds) waiting for read activity after sending a keepalive ping. Defaults to 20 seconds.
#nacos.remote.server.grpc.sdk.keep-alive-timeout=20000
### Sets a time(milliseconds) that specify the most aggressive keep-alive time clients are permitted to configure. The typical default is 5 minutes
#nacos.remote.server.grpc.sdk.permit-keep-alive-time=300000
### cluster grpc(inside the nacos server) configuration
#nacos.remote.server.grpc.cluster.max-inbound-message-size=10485760
### Sets the time(milliseconds) without read activity before sending a keepalive ping. The typical default is two hours.
#nacos.remote.server.grpc.cluster.keep-alive-time=7200000
### Sets a time(milliseconds) waiting for read activity after sending a keepalive ping. Defaults to 20 seconds.
#nacos.remote.server.grpc.cluster.keep-alive-timeout=20000
### Sets a time(milliseconds) that specify the most aggressive keep-alive time clients are permitted to configure. The typical default is 5 minutes
#nacos.remote.server.grpc.cluster.permit-keep-alive-time=300000

#*************** TLS Configuration ***************#
#nacos.remote.server.rpc.tls.enableTls=true
#nacos.remote.server.rpc.tls.certChainFile=file:{path of cert}
#nacos.remote.server.rpc.tls.certPrivateKey=file:{path of private key}

#*************** Config Module Related Configurations ***************#

### the maximum retry times for push
nacos.config.push.maxRetryTime=50

#*************** Naming Module Related Configurations ***************#
### Data dispatch task execution period in milliseconds:

### If enable data warmup. If set to false, the server would accept request without local data preparation:
# nacos.naming.data.warmup=true

### If enable the instance auto expiration, kind like of health check of instance:
# nacos.naming.expireInstance=true

nacos.naming.empty-service.auto-clean=true
nacos.naming.empty-service.clean.initial-delay-ms=50000
nacos.naming.empty-service.clean.period-time-ms=30000

#*************** AI Module Related Configurations ***************#

### Whether nacos mcp registry is enabled, default is false.
### When enabled=true, Nacos will start a `mcp registry` server with new port with `nacos.ai.mcp.registry.port`
#nacos.ai.mcp.registry.enabled=false

### Nacos mcp registry port, default 9080:
nacos.ai.mcp.registry.port=9080

#--------------- Nacos Web Server Configurations ---------------#

#*************** Nacos Web Server Related Configurations ***************#
### Nacos Server Web context path:
nacos.server.contextPath=/nacos

#*************** Access Log Related Configurations ***************#
### If turn on the access log:
server.tomcat.accesslog.enabled=true

### accesslog automatic cleaning time
server.tomcat.accesslog.max-days=30

### The access log pattern:
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i

### The directory of access log:
server.tomcat.basedir=file:.

#*************** API Related Configurations ***************#
### Include message field
server.error.include-message=ALWAYS

### Enabled for open API compatibility
# nacos.core.api.compatibility.client.enabled=true
### Enabled for admin API compatibility
# nacos.core.api.compatibility.admin.enabled=false
### Enabled for console API compatibility
# nacos.core.api.compatibility.console.enabled=false

#--------------- Nacos Console Configurations ---------------#

#*************** Nacos Console Related Configurations ***************#
### Nacos Console Main port
nacos.console.port=8084
### Nacos Server Web context path:
nacos.console.contextPath=

### Nacos Server context path, which link to nacos server `nacos.server.contextPath`, works when deployment type is `console`
nacos.console.remote.server.context-path=/nacos

#************** Console UI Configuration ***************#

### Turn on/off the nacos console ui.
#nacos.console.ui.enabled=true

#--------------- Nacos Plugin Configurations ---------------#

#*************** CMDB Plugin Related Configurations ***************#
### The interval to dump external CMDB in seconds:
# nacos.cmdb.dumpTaskInterval=3600

### The interval of polling data change event in seconds:
# nacos.cmdb.eventTaskInterval=10

### The interval of loading labels in seconds:
# nacos.cmdb.labelTaskInterval=300

### If turn on data loading task:
# nacos.cmdb.loadDataAtStart=false

#*************** Auth Plugin Related Configurations ***************#
### The ignore urls of auth, will be deprecated in the future:
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**

### The auth system to use, default 'nacos' and 'ldap' is supported, other type should be implemented by yourself:
nacos.core.auth.system.type=nacos

### If turn on auth system:
# Whether open nacos server API auth system
nacos.core.auth.enabled=true
# Whether open nacos admin API auth system
nacos.core.auth.admin.enabled=true
# Whether open nacos console API auth system
nacos.core.auth.console.enabled=true

### 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=true

### worked when nacos.core.auth.enabled=true
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key=cXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1xd2VydHk=
nacos.core.auth.server.identity.value=cXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1xd2VydHk=

### worked when nacos.core.auth.system.type=nacos or nacos.core.auth.console.enabled=true
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.cache.enable=false
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
### The default token (Base64 string):
#nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
nacos.core.auth.plugin.nacos.token.secret.key=cXdlcnR5dWlvcGFzZGZnaGprbHp4Y3Zibm1tbmJ2Y3g=

### worked when nacos.core.auth.system.type=ldap,{0} is Placeholder,replace login username
#nacos.core.auth.ldap.url=ldap://localhost:389
#nacos.core.auth.ldap.basedc=dc=example,dc=org
#nacos.core.auth.ldap.userDn=cn=admin,${nacos.core.auth.ldap.basedc}
#nacos.core.auth.ldap.password=admin
#nacos.core.auth.ldap.userdn=cn={0},dc=example,dc=org
#nacos.core.auth.ldap.filter.prefix=uid
#nacos.core.auth.ldap.case.sensitive=true
#nacos.core.auth.ldap.ignore.partial.result.exception=false

#*************** Control Plugin Related Configurations ***************#
# plugin type
#nacos.plugin.control.manager.type=nacos

# local control rule storage dir, default ${nacos.home}/data/connection and ${nacos.home}/data/tps
#nacos.plugin.control.rule.local.basedir=${nacos.home}

# external control rule storage type, if exist
#nacos.plugin.control.rule.external.storage=

#*************** Config Change Plugin Related Configurations ***************#
# webhook
#nacos.core.config.plugin.webhook.enabled=false
# It is recommended to use EB https://help.aliyun.com/document_detail/413974.html
#nacos.core.config.plugin.webhook.url=http://localhost:8080/webhook/send?token=***
# The content push max capacity ,byte
#nacos.core.config.plugin.webhook.contentMaxCapacity=102400

# whitelist
#nacos.core.config.plugin.whitelist.enabled=false
# The import file suffixs
#nacos.core.config.plugin.whitelist.suffixs=xml,text,properties,yaml,html
# fileformatcheck,which validate the import file of type and content
#nacos.core.config.plugin.fileformatcheck.enabled=false

#*************** Istio Plugin Related Configurations ***************#
### If turn on the MCP server:
nacos.istio.mcp.server.enabled=false

#--------------- Nacos Experimental Features Configurations ---------------#

#*************** K8s Related Configurations ***************#
### If turn on the K8s sync:
nacos.k8s.sync.enabled=false

### If use the Java API from an application outside a kubernetes cluster
#nacos.k8s.sync.outsideCluster=false
#nacos.k8s.sync.kubeConfig=/.kube/config

#*************** Deployment Type Configuration ***************#

### Sets the deployment type: 'merged' for joint deployment, 'server' for separate deployment server only, 'console' for separate deployment console only.
nacos.deployment.type=merged


#*************** Fuzzy Watch Configuration ***************#
nacos.config.fuzzy.watch.max.pattern.count=20
nacos.config.fuzzy.watch.max.pattern.match.config.count=500

nacos.naming.fuzzy.watch.max.pattern.count=20
nacos.naming.fuzzy.watch.max.pattern.match.service.count=500

2.3、先排除测试,然后点击package。不做这一步的话,后续在启动的时候,某一些地方引用不了类库的情况,特别是isto, gRPC的一些东西。具体操作如图:
在这里插入图片描述
2.4、配置一下启动参数-Dnacos.standalone=true,如图:
在这里插入图片描述
2.5、启动即可。注意一下启动类,3.x版本的启动类在bootstrap模块下面,之前的版本在console模块下面。

3、Docker / Docker Compose 部署

Nacos官方提供的Docker部署示例

数据库文件,可自行下载。

/*
 * 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` varchar(1024) NOT NULL DEFAULT '' 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  since 2.5.0                */
/******************************************/
CREATE TABLE `config_info_gray` (
                                    `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
                                    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
                                    `group_id` varchar(128) NOT NULL COMMENT 'group_id',
                                    `content` longtext NOT NULL COMMENT 'content',
                                    `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
                                    `src_user` text COMMENT 'src_user',
                                    `src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip',
                                    `gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create',
                                    `gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified',
                                    `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
                                    `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
                                    `gray_name` varchar(128) NOT NULL COMMENT 'gray_name',
                                    `gray_rule` text NOT NULL COMMENT 'gray_rule',
                                    `encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key',
                                    PRIMARY KEY (`id`),
                                    UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`),
                                    KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`),
                                    KEY `idx_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray';

/******************************************/
/*   表名称 = 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` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
                                   `publish_type` varchar(50)  DEFAULT 'formal' COMMENT 'publish type gray or formal',
                                   `gray_name` varchar(50)  DEFAULT NULL COMMENT 'gray name',
                                   `ext_info`  longtext DEFAULT NULL COMMENT 'ext info',
                                   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
);


准备一个docker-compose.yml文件。

1、单机部署,docker-compose.yml文件内容示例。

version: '3.8'                      #指定语法版本,docker-compose v2.x支持不写版本,1.x必须写
services:                           #定义服务列表               
  mysql:                            #指定服务名,下面的服务可以通过服务名进行交互
    image: mysql:8.0.42             #使用的镜像 
    container_name: mysql           #指定容器名
    restart: unless-stopped         #设置重启策略,一共有四种策略,no不自定重启(默认)、always总是重启(无论退出状态如何)、on-failure​失败时重启​(仅当容器非正常退出,即退出码非0时重启)、unless-stopped​​除非手动停止,否则总是重启​(忽略docker stop命令,其他情况都重启)
    ports:                          #设置端口映射,可以设置多个。宿主机端口:容器端口
      - "3306:3306"  
    environment:                    #设置环境变量。至于下面在设置Mysql的账号信息以及创建库,那是因为官方镜像内置了启动脚本,会自动处理这些环境变量。
      MYSQL_ROOT_PASSWORD: root     #设置MySQL root用户的密码
      MYSQL_DATABASE: nacos_config  #容器启动时自动创建的数据库名称
      MYSQL_USER: nacos             #创建的自定义用户名
      MYSQL_PASSWORD: nacos         #上述自定义用户的密码
      TZ: Asia/Shanghai             #设置时区为上海(东八区)
    volumes:                        #配置数据卷/目录挂载,实现数据持久化和初始化
      - mysql-data:/var/lib/mysql                               #mysql-data是Docker管理的命名卷,默认在/var/lib/docker/volumes/目录下面,你也可以自定义
      #- ./mysql-schema.sql:/mysql-schema.sql
      #- ./mysql-init.sh:/docker-entrypoint-initdb.d/init.sh     #将自己写的./mysql-init.sh初始化脚本挂载到容器内的初始化目录,/docker-entrypoint-initdb.d/init.sh是MySQL启动的时候执行的初始化脚本。
      - ./mysql-schema.sql:/docker-entrypoint-initdb.d/init.sql  #同上,但使用SQL文件而非Shell脚本,SQL文件更适合纯数据库操作(如建表、插入初始数据)。
    command:                                                    #覆盖容器默认的启动命令。就是覆盖dockerfile里面CMD参数。启动命令优先级低到高,ENTRYPOINT、CMD、command。                                
      - --default-authentication-plugin=mysql_native_password   #强制使用旧版密码认证插件(兼容老客户端),比如一些老的数据库管理工具也可以登录。
      - --character-set-server=utf8mb4                          #设置默认字符集为utf8mb4(支持完整Unicode,如emoji)
      - --collation-server=utf8mb4_unicode_ci                   #设置默认排序规则(对多语言文本排序更准确)
    healthcheck:                                                                     #健康检查
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] #健康检查命令
      interval: 5s                                                                   #每5秒执行一次检查
      timeout: 10s                                                                   #单次检查的超时时间,超过​10秒​无响应则视为失败。
      retries: 15                                                                    #连续失败15次​后,才标记容器为不健康,如果配置了重启策略的话,会自动重启。

  nacos:
    image: nacos/nacos-server:v3.0.3
    container_name: nacos
    restart: unless-stopped
    depends_on:                     #定义服务启动依赖关系,意思是只有当下面的服务满足条件后,才会加载该服务
      mysql:                        #依赖的服务名称(必须是同一 compose 文件中的服务)
        condition: service_healthy  #条件,必须等待 mysql 服务健康检查通过,才满足条件。这个可以不设置,那么就是等待服务进程启动后就行。
    ports:
      - "8048:8080"  # Nacos控制台端口,访问Nacos控制台及Nacos控制台的API
      - "8848:8848"  # Nacos HTTP API 端口,用于Nacos AdminAPI及HTTP OpenAPI的访问
      - "9848:9848"  # 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
      - "9849:9849"  # 服务端gRPC请求服务端端口,用于服务间同步等
      - "7848:7848"  # Jraft请求服务端端口,用于处理服务端间的Raft相关请求
    environment:
      MODE: standalone
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: mysql
      MYSQL_SERVICE_PORT: 3306
      MYSQL_SERVICE_DB_NAME: nacos_config
      MYSQL_SERVICE_USER: nacos
      MYSQL_SERVICE_PASSWORD: nacos
      # 核心鉴权配置
      NACOS_AUTH_ENABLE: "true"
      NACOS_AUTH_TOKEN_ENABLE: "true"
      NACOS_AUTH_CACHE_ENABLE: "true"
      # 使用默认密钥
      NACOS_AUTH_TOKEN: "t8adqwIZcxer5mmtLM2gJme5VETsmVfZCT2rkODK5gE="
      NACOS_AUTH_IDENTITY_KEY: "serverIdentity"
      NACOS_AUTH_IDENTITY_VALUE: "security"
      JVM_XMS: 256m
      JVM_XMX: 512m
      TZ: Asia/Shanghai
    volumes:
      - /workspace/nacos/logs/:/root/nacos/logs
volumes:                             # 声明所有需要Docker管理的命名卷(Docker会自动创建),像我这个配置只需要声明一下mysql-data就行了。
  mysql-data:

注意:如果想把application.properties映射进去。MySQL又想用这里面的,那么数据库的url的host写mysql服务名。

2、集群的部署和使用放在第七部分,也就是最下面那个部分。

六、Spring Cloud中使用Nacos

环境:

我用的Spring Cloud Alibaba 2023.0.1版的,在父pom里面做了版本控制,所有我不用在这里写版本,如果你要单独用的话,要写版本,可以去官网看。

Nacos Clien版本

Spring Cloud Alibaba官网

1、引入依赖,需要什么就配什么。

 <!--Nacos 注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- Nacos 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

2、配置注册中心

2.1、先配一下命名空间,不同命名的空间,服务是隔离的。如下图:

在这里插入图片描述
2.2、配置文件配置

spring:
  application:
    name: check-server                  #服务名称
  cloud:
    nacos:
      discovery:                        #服务发现
        server-addr: 127.0.0.1:8848     #nacos的API服务地址,默认是8848。
        namespace: zhyw-dev             #命名空间id
        username: nacos                 #账户名
        password: nacos                 #密码

API服务端口,默认8848,如下图:

在这里插入图片描述
2.3、使用SpringCloud的原生注解@EnableDiscoveryClient启动服务注册与发现。

package com.zhjn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * Author: 千秋
 * Date: 2025/08/28/9:47
 * Description:
 */
@SpringBootApplication
@EnableDiscoveryClient  // 启用SpringCloud的原生注解启动服务注册与发现
public class CheckApplication {
    public static void main(String[] args) {

        SpringApplication.run(CheckApplication.class, args);
        System.out.println("-------------------------------------");
        System.out.println("服务启动成功!");
        System.out.println("-------------------------------------");
    }
}

2.4、到这里,注册中心就已经配置成功。如下图:
在这里插入图片描述
2.5、测试

package com.zhjn.controller;

import com.zhjn.base.ActionResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * Author: 千秋
 * Date: 2025/08/28/13:44
 * Description:
 */
@RestController
@Tag(name = "测试模块API",description = "测试模块")
@RequestMapping("/api/check/test")
public class TestController {

    @Value("${server.port}")
    private String port;

    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping("/test")
    @Operation(description = "测试接口")
    public ActionResult test2() {
        List<ServiceInstance> instances = discoveryClient.getInstances("check-server");
        System.out.println("服务实例:+"+instances.toString());
        return ActionResult.success("测试接口",instances);
    }
}

响应结果:
在这里插入图片描述

3、配置中心

3.1、配置文件

spring:
  cloud:
    nacos:
      discovery:                        #服务发现
        server-addr: 127.0.0.1:8848     #nacos的API服务地址,默认是8848。#
        namespace: zhyw-dev             #命名空间id
        username: nacos                 #账户名
        password: nacos                 #密码
      config:
        server-addr: 127.0.0.1:8848		#集群同上
        namespace: zhyw-dev
        file-extension: yaml            #配置文件类型
        username: nacos
        password: nacos
        refresh-enabled: true        # 是否开启自动刷新
  config:                                                      #Spring配置文件设置
    import:                                                    #从外部读取配置文件
      - optional:nacos:${spring.application.name}-dev      #从nacos中读check-server-dev文件,如果文件不存在则忽略

3.2、Nacos中的配置文件设置

先到配置列表中,注意一下命名空间,我们使用的命名空间是zhyw-dev。然后新增配置文件即可,文件名就是我们自己设置的服务名+“-dev”,然后配置你想配置的内容即可。如图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、配置Nacos其实还有一种配法,以前写过这种项目,写bootstrap.yml文件的,这种适用于需要Nacos配置文件先于本地application.yml配置文件加载的场景。

4.1、引入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

4.2、配置内容和上面其实是一样的。创建一个bootstrap.yml文件,指定一下服务名,然后指定使用的配置文件,然后把nacos的配置写入到指定的配置文件中去。

#bootstrap.yml文件
spring:
  application:
    name: check-server
  profiles:
    active: dev
#bootstrap-dev.yml文件
spring:
  cloud:
    nacos:
      discovery:                        #服务发现
        server-addr: 127.0.0.1:8848     #nacos的API服务地址,默认是8848
        namespace: zhyw-dev             #命名空间id
        username: nacos                 #账户名
        password: nacos                 #密码
      config:
        server-addr: 127.0.0.1:8848		#集群同上
        namespace: zhyw-dev
        file-extension: yaml            #配置文件类型
        username: nacos
        password: nacos
        refresh-enabled: true        # 是否开启自动刷新
  config:                                                      #Spring配置文件设置
    import:                                                    #从外部读取配置文件
      - optional:nacos:${spring.application.name}-dev      #从nacos中读check-server-dev文件,如果文件不存在则忽略

七、Nacos集群

Nacos的集群,有四种配置方式部署,三种访问模式。

官方提供的示例

1、四种部署

1.1、配置cluster.conf文件。

机制:​手动配置IP列表。最经典、最直接的方式。
优点:稳定可靠,不受网络环境和Docker限制。
缺点:需要手动维护IP列表,灵活性差。
适用场景:物理机、虚拟机等静态IP环境。

#it is ip
#example
192.168.16.101:8848
192.168.16.101:8849
192.168.16.101:8850

记住,让Nacos的每一台服务器都这样配置,而我这里直接多台Nacos用的一台物理服务器,只是端口有差异。

1.2、配置​cluster-embedded.yaml和nacos-embedded.env文件。

核心机制:Docker Compose。利用Docker的服务名进行服务发现。
优点:在Docker环境内配置简单,无需关心IP变化。
缺点:完全依赖于Docker网络,外部无法直接使用。
适用场景:纯Docker Compose部署的集群。

cluster-embedded.yaml 文件编写:

version: "3"
services:
  mysql:                            #指定服务名,下面的服务可以通过服务名进行交互
    image: mysql:8.0.42             #使用的镜像 
    container_name: mysql           #指定容器名
    restart: unless-stopped         #设置重启策略
    ports:                          #设置端口映射,可以设置多个。宿主机端口:容器端口
      - "3306:3306"
    environment:                    #设置环境变量。至于下面在设置Mysql的账号信息以及创建库,那是因为官方镜像内置了启动脚本,会自动处理这些环境变量。
      MYSQL_ROOT_PASSWORD: root     #设置MySQL root用户的密码
      MYSQL_DATABASE: nacos_config  #容器启动时自动创建的数据库名称
      MYSQL_USER: nacos             #创建的自定义用户名
      MYSQL_PASSWORD: nacos         #上述自定义用户的密码
      TZ: Asia/Shanghai             #设置时区为上海(东八区)
    volumes:                        #配置数据卷/目录挂载,实现数据持久化和初始化
      - mysql-data:/var/lib/mysql   #mysql-data是Docker管理的命名卷。
      - .././conf/mysql-schema.sql:/docker-entrypoint-initdb.d/init.sql		#sql文件看单机那边的配置。
    command:                       #覆盖容器默认的启动命令。就是覆盖dockerfile里面CMD参数。启动命令优先级低到高,ENTRYPOINT、CMD、command。                                
      - --default-authentication-plugin=mysql_native_password   #强制使用旧版密码认证插件(兼容老客户端),比如一些老的数据库管理工具也可以登录。
      - --character-set-server=utf8mb4                          #设置默认字符集为utf8mb4(支持完整Unicode,如emoji)
      - --collation-server=utf8mb4_unicode_ci                   #设置默认排序规则(对多语言文本排序更准确)
    healthcheck:                                                                     #健康检查
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] #健康检查命令
      interval: 5s                                                                   #每5秒执行一次检查
      timeout: 10s                                                                   #单次检查的超时时间,超过<200b>10秒<200b>无响应则视为失败。
      retries: 15  
  nacos1:
    hostname: nacos1
    container_name: nacos1
    image: nacos/nacos-server:v3.0.3
    restart: unless-stopped
    depends_on:
      mysql:
        condition: service_healthy
    volumes:
      - ./logs/nacos1:/home/nacos/logs
    ports:
      - "7848:7848"
      - "8048:8080"
      - "8848:8848"
      - "9868:9848"
      - "9850:9849"
    env_file:
      - ./nacos-embedded.env

  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:v3.0.3
    container_name: nacos2
    depends_on:
      mysql:
        condition: service_healthy
    volumes:
      - ./logs/nacos2:/home/nacos/logs
    ports:
      - "7849:7848"
      - "8049:8080"
      - "8849:8848"
      - "9869:9848"
      - "9851:9849"
    env_file:
      - ./nacos-embedded.env
    restart: always
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:v3.0.3
    container_name: nacos3
    depends_on:
      mysql:
        condition: service_healthy
    volumes:
      - ./logs/nacos3:/home/nacos/logs
    ports:
      - "7850:7848"
      - "8050:8080"
      - "8850:8848"
      - "9870:9848"
      - "9852:9849"
    env_file:
      - ./nacos-embedded.env
    restart: always

volumes:                             # 声明所有需要Docker管理的命名卷(Docker会自动创建),像我这个配置只需要声明一下mysql-data就行了。
  mysql-data:

nacos-embedded.env文件:

#nacos dev env
PREFER_HOST_MODE=hostname
EMBEDDED_STORAGE=embedded
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
NACOS_AUTH_IDENTITY_KEY=2222
NACOS_AUTH_IDENTITY_VALUE=2xxx
NACOS_AUTH_TOKEN=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_DB_NAME=nacos_config
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos
# 核心鉴权配置
NACOS_AUTH_ENABLE="true"
NACOS_AUTH_TOKEN_ENABLE="true"
NACOS_AUTH_CACHE_ENABLE="true"
TZ=Asia/Shanghai

1.3、配置cluster-hostname.yaml和nacos-hostname.env文件,配置方式和embedded几乎一样,去官方提供的示例里面把文件下载下来。

机制:​主机名为每个节点配置一个主机名,并通过这些主机名互相发现。
优点:比IP更易读,在DNS或hosts文件管理下有一定灵活性。
缺点:需要确保主机名能正确解析到IP(需配置DNS或hosts文件)。
适用场景:对可读性有要求,且有DNS服务的环境。

1.4、配置cluster-ip.yaml和nacos-ip.env文件,配置方式和embedded几乎一样。去官方提供的示例里面把文件下载下来。

机制:I​P地址。与cluster.conf原理相同,但写在了Compose文件的环境变量里。
优点:配置集中,一目了然。
缺点:IP变更时需要修改Compose文件并重启。
适用场景:知道所有节点IP的Docker部署环境。

1.5、docker-compose启动命令

docker-compose -f cluster-embedded.yaml up -d

在这里插入图片描述
1.6、搭载SLB

1.6.1 nginx.conf文件

# 定义Nginx工作进程数量(通常设置为CPU核心数)
worker_processes  1;

# 事件处理模块配置
events {
    # 每个worker进程允许的最大连接数(需根据服务器性能调整)
    worker_connections  1024;
}

# HTTP服务核心配置块
http {
    # 包含MIME类型定义文件(如text/html, application/json等)
    include       mime.types;
    
    # 默认响应类型(当无法确定类型时使用)
    default_type  application/octet-stream;

    # 启用高效文件传输模式(零拷贝技术)
    sendfile        on;
    
    # 客户端保持连接的超时时间(秒)
    keepalive_timeout  65;

    # 定义Nacos API服务集群(服务注册/发现端口)
    # 名称:nacos-api-server
    upstream nacos-api-server {
        # 集群节点列表(使用服务名+API端口)
		# 故障机剔除,线上一定要设置这个。
		# max_fails=3 允许的最大失败次数,我这里设置的3次。
		# fail_timeout=30s 节点被剔除的持续时间。
		# 我这里结合起来的意思,就是30s内失败3次,这个节点就会被直接剔除。
		# 还有几个设置,也是线上环境可以用到的。
		# backup 标记为备用节点,主节点不可用时启用。
		# down 手动标记节点不可用,这个一般是维护的时候使用的。
		server nacos1:8848 max_fails=3 fail_timeout=30s; 
		server nacos2:8848 max_fails=3 fail_timeout=30s;
		server nacos3:8848 max_fails=3 fail_timeout=30s;
    }

    # Nacos API服务代理配置(8848端口)
    server {
        # 监听80端口。
        listen   80;
        
        # 服务器域名
        server_name  localhost;

        # 请求路由配置
        location / {
            # 将请求转发到nacos-api-server集群
            proxy_pass http://nacos-api-server;
            
            # 保留原始请求的Host头信息
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_buffering off;
        }
    }
}

注意:一定要监听80端口,否则会出错,一般也只需要把8848端口进行转发就行。如果要指定非80端口的话,你需要把9848、9849都进行路由转发。

1.6.2 docker-compose文件,nacos集群+Nginx合。

cluster.yaml

version: "3"
services:
  mysql:                            #指定服务名,下面的服务可以通过服务名进行交互
    image: mysql:8.0.42             #使用的镜像 
    container_name: mysql           #指定容器名
    restart: unless-stopped         #设置重启策略
    ports:                          #设置端口映射,可以设置多个。宿主机端口:容器端口
      - "3306:3306"
    environment:                    #设置环境变量。至于下面在设置Mysql的账号信息以及创建库,那是因为官方镜像内置了启动脚本,会自动处理这些环境变量。
      MYSQL_ROOT_PASSWORD: root     #设置MySQL root用户的密码
      MYSQL_DATABASE: nacos_config  #容器启动时自动创建的数据库名称
      MYSQL_USER: nacos             #创建的自定义用户名
      MYSQL_PASSWORD: nacos         #上述自定义用户的密码
      TZ: Asia/Shanghai             #设置时区为上海(东八区)
    volumes:                        #配置数据卷/目录挂载,实现数据持久化和初始化
      - mysql-data:/var/lib/mysql   #mysql-data是Docker管理的命名卷,默认在/var/lib/docker/volumes/目录下面,你也可以自定义
      - .././conf/mysql-schema.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - nacos-net
    command:                       #覆盖容器默认的启动命令。就是覆盖dockerfile里面CMD参数。启动命令优先级低到高,ENTRYPOINT、CMD、command。                                
      - --default-authentication-plugin=mysql_native_password   #强制使用旧版密码认证插件(兼容老客户端),比如一些老的数据库管理工具也可以登录。
      - --character-set-server=utf8mb4                          #设置默认字符集为utf8mb4(支持完整Unicode,如emoji)
      - --collation-server=utf8mb4_unicode_ci                   #设置默认排序规则(对多语言文本排序更准确)
    healthcheck:                                                                     #健康检查
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] #健康检查命令
      interval: 5s                                                                   #每5秒执行一次检查
      timeout: 10s                                                                   #单次检查的超时时间,超过<200b>10秒<200b>无响应则视为失败。
      retries: 15  
  nacos1:
    hostname: nacos1
    container_name: nacos1
    image: nacos/nacos-server:v3.0.3
    restart: unless-stopped
    depends_on:
      mysql:
        condition: service_healthy
    volumes:
      - ./logs/nacos1:/home/nacos/logs
    networks:
      - nacos-net
    env_file:
      - ./nacos.env

  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:v3.0.3
    container_name: nacos2
    depends_on:
      mysql:
        condition: service_healthy
    volumes:
      - ./logs/nacos2:/home/nacos/logs
    networks:
      - nacos-net
    env_file:
      - ./nacos.env
    restart: unless-stopped
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:v3.0.3
    container_name: nacos3
    depends_on:
      mysql:
        condition: service_healthy
    volumes:
      - ./logs/nacos3:/home/nacos/logs
    networks:
      - nacos-net
    env_file:
      - ./nacos.env
    restart: unless-stopped
  #Nginx SLB服务
  nginx:
    image: nginx:latest
    ports:
      - "80:80"          # 宿主机:容器
    volumes:
      - .././nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - nacos1
      - nacos2
      - nacos3

  
volumes:                             # 声明所有需要Docker管理的命名卷(Docker会自动创建),像我这个配置只需要声明一下mysql-data就行了。
  mysql-data:
  
networks:
  nacos-net:
    driver: bridge

nacos.env.yaml

Model=cluster
PREFER_HOST_MODE=hostname
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
NACOS_AUTH_IDENTITY_KEY=2222
NACOS_AUTH_IDENTITY_VALUE=2xxx
NACOS_AUTH_TOKEN=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_DB_NAME=nacos_config
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos
# 核心鉴权配置
NACOS_AUTH_ENABLE="true"
NACOS_AUTH_TOKEN_ENABLE="true"
NACOS_AUTH_CACHE_ENABLE="true"
TZ=Asia/Shanghai

注意:Model=cluster,这个最好是显式指定一下。有时候,启动多台nacos服务,控制台服务正常,控制台-集群管理-节点列表正常,但是程序在连接api服务的时候,却只有最后一台是生效的。所以在部署的时候,还是都测试一下。

1.6.3、程序中配置

spring:
  cloud:
    nacos:
      discovery:                        #服务发现
        server-addr: 192.168.188.135   #nacos的API服务地址,默认是8848
        namespace: zhyw-dev             #命名空间id
        username: nacos                 #账户名
        password: nacos                 #密码
      config:
        server-addr: 192.168.188.135
        namespace: zhyw-dev
        file-extension: yaml            #配置文件类型
        username: nacos
        password: nacos
        refresh-enabled: true        # 是否开启自动刷新
  config:                                                      #Spring配置文件设置
    import:                                                    #从外部读取配置文件
      - optional:nacos:${spring.application.name}-dev      #从nacos中读check-server-dev文件,如果文件不存在则忽略

在这里插入图片描述

2、三种访问模式

三种访问模式,解决的是如何访问Nacos集群​,它们关注的是集群的入口和负载均衡。
在这里插入图片描述

2.1、直连IP模式(Direct IP)。

客户端配置文件中直接列出Nacos集群所有节点的IP地址。

​配置示例​(application.yml):

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.11:8848,192.168.1.12:8848,192.168.1.13:8848

优点:简单,不依赖任何外部组件。

缺点:

  1. 硬编码​:IP地址变更需要修改所有客户端并重启。
  2. 客户端负载均衡​:客户端需要实现负载均衡算法。
  3. 不够灵活​:集群扩容缩容对客户端不透明。

2.2、挂载SLB模式(SLB / LoadBalancer)​

让客户端访问一个负载均衡器(SLB/F5/Nginx等)的VIP,由负载均衡器将请求转发到后端的Nacos集群。

​配置示例​:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SLB_VIP:192.168.1.100}:8848 # 指向SLB的IP

优点:

  1. 后端Nacos节点变化,客户端无感知。
  2. SLB自动做健康检查,剔除故障节点。

缺点:入了额外的网络组件(SLB),架构变复杂,SLB本身可能成为单点。

2.3、域名+SLB模式(Domain + SLB)​,官方推荐。

是模式2的升级版。客户端配置一个域名,这个域名解析到SLB的VIP上。

​配置示例​:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: nacos.example.com:8848 # 指向一个域名

优点​:​兼具模式2的所有优点,且灵活性最高。未来即使需要更换SLB的IP,只需修改DNS解析记录即可,客户端和SLB配置都无需改动。

​缺点​:需要申请和管理域名。

Logo

「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!

更多推荐