Nacos安装2025
1. Nacos简介
Nacos是一个开源的动态服务发现、配置和服务管理平台,由阿里巴巴开发和维护。
Nacos支持多种注册中心和配置管理器,包括Spring Cloud Discovery、Dubbo、Kubernetes和Apache ServiceComb等。
Nacos提供了REST、gRPC和Java SDK等多种API,使得开发人员可以轻松地与Nacos进行交互
1.1 核心特性
- 配置管理:Nacos提供了统一的配置管理平台,可以帮助用户集中管理不同环境的配置信息。用户可以通过Nacos的控制台或API进行配置的新增、修改、删除等操作,并且支持配置的版本管理。
- 服务发现和注册:Nacos提供了服务注册和发现的功能,可以帮助用户快速发现和访问服务。服务提供者在启动时将服务的元数据注册到Nacos,服务消费者通过Nacos获取服务提供者的地址信息,并进行调用。
- 动态配置:Nacos支持动态配置,可以在不停机的情况下动态修改配置信息。例如,可以通过Nacos修改数据库连接池的最大连接数,而不需要重启应用。
- 健康检查:Nacos提供了健康检查的功能,可以检测服务的可用性。当服务不可用时,Nacos会自动将该服务从服务列表中剔除。
- 路由策略:Nacos支持多种路由策略,可以根据不同的规则将请求路由到不同的服务提供者。
1.2 常见的注册中心
- ZooKeeper:ZooKeeper 是一个高性能的分布式协调服务,它可以作为注册中心和配置中心。它最初是由雅虎开发的,现在是 Apache 的顶级项目之一。ZooKeeper 的主要优点是可靠性和稳定性,但它需要对分布式系统的概念有一定的了解。你可以在这里找到有关 ZooKeeper 的更多信息:ZooKeeper 官方文档
- Consul:Consul 是一个由 HashiCorp 开发的服务网格解决方案,它包括服务发现、配置、安全和流量管理等功能。Consul 的优点是易于使用和部署,同时提供了广泛的 API 和插件支持。你可以在这里找到有关 Consul 的更多信息:Consul 官方文档
- Eureka:Eureka 是 Netflix 开发的一个服务发现组件,它提供了强大的客户端库和服务端组件。Eureka 的优点是易于使用和部署,同时具有高可用性和可扩展性。你可以在这里找到有关 Eureka 的更多信息:Eureka 官方文档
- Nacos:相对于 Spring Cloud Eureka 来说,Nacos 更强大。
Nacos = Spring Cloud Eureka + Spring Cloud Config
Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。
1.3 Nacos结构图
2. 如何安装和配置Nacos?
2.1 方案一:Nacos的安装包
首先,你需要下载Nacos的安装包,你可以从Nacos的官方网站上下载:https://github.com/alibaba/nacos/releases(我用的是2.5.0的版本)
解压下载的安装包,进入解压后的目录。
- bin:启动脚本
- conf:配置文件
端口配置
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:
博主修改两类配置: mysql和鉴权
运行bin目录下的startup.sh(Linux/MacOS)或startup.cmd(Windows)脚本,启动Nacos服务。
单机模式 ,使用自定义mysql数据库
然后 cmd 进入该目录执行命令即可:
- standalone模式
# window
startup.cmd -m standalone
# linux
cd /XXXXX/nacos-2.5.0/bin
chmod 775 startup.sh
./startup.sh -m standalone
- 修改bin/startup.sh的MODE参数, 然后执行启动脚本
export SERVER="nacos-server"
export MODE="standalone"
export FUNCTION_MODE="all"
export MEMBER_LIST=""
export EMBEDDED_STORAGE=""
while getopts ":m:f:s:c:p:" opt
do
case $opt in
m)
MODE=$OPTARG;;
若没有修改单机启动, 会报错
Caused by: com.alibaba.nacos.api.exception.NacosException: java.net.UnknownHostException: jmenv.tbsite.net
at com.alibaba.nacos.core.cluster.lookup.AddressServerMemberLookup.run(AddressServerMembe
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.ja。。。
Caused by: java.net.UnknownHostException: jmenv.tbsite.net
打开浏览器,访问http://localhost:8845/nacos,如果能够看到Nacos的登录页面,则说明Nacos已经成功安装并启动。
默认的账户和密码均为:nacos
第一次使用时,不存在任何信息,图中数据忽略不计😂
2.2 方案二:docker安装nacos
1、Docker 拉取镜像
docker pull nacos/nacos-server:v2.1.0
若遇到如下错误
Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 103.246.246.144:443: connect: connection refused
解决方案:
查看docker的镜像配置
cat /etc/docker/daemon.json
以上未配置镜像地址,增加如下
{
"data-root": "/home/docker",
"registry-mirrors": ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
重启docker,再次拉群镜像成功
systemctl restart docker
②查看镜像
docker images
2、创建宿主机挂载目录
mkdir -p /home/indexvc/server/app/app-nacos/nacos-docker/logs/
mkdir -p /home/indexvc/server/app/app-nacos/nacos-docker/conf/
3、启动nacos并复制文件到宿主机,关闭容器
启动容器
docker run -p 8848:8848 --name nacos -d nacos/nacos-server
复制文件
docker cp nacos:/home/nacos/logs/ /home/indexvc/server/app/app-nacos/nacos-docker/
docker cp nacos:/home/nacos/conf/ /home/indexvc/server/app/app-nacos/nacos-docker/
关闭容器(容器id也可以)
docker rm -f nacos
4、mysql中创建nacos所需的表
mysql中新建一个库,名字可自定义,这里就用nacos,从github中找到创建表的文件,在nacos-config库中执行,创建所需的表https://myblogoss2.oss-cn-beijing.aliyuncs.com/dump-nacos-202403131030.sql
5、再次启动nacos
docker run -d --name nacos -p 9848:9848 -p 9849:9849 --privileged=true -e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone -v /home/indexvc/server/app/app-nacos/nacos-docker/logs/:/home/nacos/logs -v /home/indexvc/server/app/app-nacos/nacos-docker/conf/:/home/nacos/conf/ --restart=always nacos/nacos-server
注意事项
虚拟机需要在防火墙开放相关端口,或者关了防火墙,如果你是云服务器,开放安全组
6、修改配置文件
主要修改的是application.properties文件
根据版本下载对应的数据库创建sql,我使用的是2.5.0 ,创建数据库名称,然后创建表结构
https://github.com/alibaba/nacos/releases/tag/2.5.0
vim /home/indexvc/server/app/app-nacos/nacos-docker/conf/application.properties
文件修改的地方(修改为你对应的mysql),我的配置文件直接贴上改一下数据库密码和读取的数据库名称就行了。
#
# Copyright 1999-2021 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.
#
#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos
### Default web server port:
server.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=
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://123.57.1.39:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=
db.password.0=
### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
#*************** Naming Module Related Configurations ***************#
### Data dispatch task execution period in milliseconds: Will removed on v2.1.X, replace with nacos.core.protocol.distro.data.sync.delayMs
# nacos.naming.distro.taskDispatchPeriod=200
### Data count of batch sync task: Will removed on v2.1.X. Deprecated
# nacos.naming.distro.batchSyncKeyCount=1000
### Retry delay in milliseconds if sync task failed: Will removed on v2.1.X, replace with nacos.core.protocol.distro.data.sync.retryDelayMs
# nacos.naming.distro.syncRetryDelay=5000
### 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
### will be removed and replaced by `nacos.naming.clean` properties
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
### Add in 2.0.0
### The interval to clean empty service, unit: milliseconds.
# nacos.naming.clean.empty-service.interval=60000
### The expired time to clean empty service, unit: milliseconds.
# nacos.naming.clean.empty-service.expired-time=60000
### The interval to clean expired metadata, unit: milliseconds.
# nacos.naming.clean.expired-metadata.interval=5000
### The expired time to clean metadata, unit: milliseconds.
# nacos.naming.clean.expired-metadata.expired-time=60000
### The delay time before push task to execute from service changed, unit: milliseconds.
# nacos.naming.push.pushTaskDelay=500
### The timeout for push task execute, unit: milliseconds.
# nacos.naming.push.pushTaskTimeout=5000
### The delay time for retrying failed push task, unit: milliseconds.
# nacos.naming.push.pushTaskRetryDelay=1000
### Since 2.0.3
### The expired time for inactive client, unit: milliseconds.
# nacos.naming.client.expired.time=180000
#*************** CMDB Module 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
#*************** Metrics Related Configurations ***************#
### Metrics for prometheus
#management.endpoints.web.exposure.include=*
### Metrics for elastic search
management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200
### Metrics for influx
management.metrics.export.influx.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
#*************** Access Log Related Configurations ***************#
### If turn on the access log:
server.tomcat.accesslog.enabled=true
### 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=
#*************** Access Control Related Configurations ***************#
### If enable spring security, this option is deprecated in 1.2.0:
#spring.security.enabled=false
### The ignore urls of auth, is deprecated in 1.2.0:
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, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=nacos
### If turn on auth system:
nacos.core.auth.enabled=false
### 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
### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version.
nacos.core.auth.enable.userAgentAuthWhite=false
### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
### 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
#*************** Istio Related Configurations ***************#
### If turn on the MCP server:
nacos.istio.mcp.server.enabled=false
#*************** 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
#*************** 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
改过后需要重启容器,出问题可以使用docker logs 看一下日志
7、访问页面
http://ip:8848/nacos,默认账号密码nacos,nacos
2.3 如何使用Nacos?
Nacos是一种服务注册和发现的工具,可以帮助我们管理微服务架构中的组件。下面是使用Nacos进行服务注册和发现的基本步骤:
在应用程序中添加Nacos客户端依赖项,例如在Maven项目中添加以下依赖项:
父工程:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
客户端:
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在应用程序中添加Nacos客户端配置,例如在Spring Boot应用程序中,可以在application.properties文件中添加以下配置:
#nacos服务地址 我的是8845端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8845
#服务名(该服务创建成功后为与public下)
spring.cloud.nacos.discovery.namespace=your-namespace
其中server-addr是Nacos服务器的地址和端口号,namespace是Nacos的命名空间,用于隔离不同的环境。
在应用程序中添加服务注册和发现的注解,例如在Spring Boot应用程序中,可以使用
@EnableDiscoveryClient注解启用服务注册和发现功能。
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在应用程序中注册服务,例如在Spring Boot应用程序中,可以使用@RestController注解定义一个RESTful服务。
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, world!";
}
}
在Nacos控制台中查看已注册的服务,可以在浏览器中访问http://localhost:8845/nacos/index.html,并使用Nacos的默认用户名和密码登录。
使用服务注册和发现,您可以轻松地将服务注册到Nacos,并从Nacos发现其他服务。
使用配置管理,可以轻松地管理和配置应用程序。
鉴权
服务端如何开启鉴权
Docker镜像部署
NACOS_AUTH_ENABLE=true
NACOS_AUTH_TOKEN=${custom_base64_token_secret_key}
NACOS_AUTH_IDENTITY_KEY=$custom_server_identity_key
NACOS_AUTH_IDENTITY_VALUE=$custom_server_identity_value
关闭已启动nacos,重新启动
docker run --env PREFER_HOST_MODE=hostname --env MODE=standalone --env NACOS_AUTH_ENABLE=true --env NACOS_AUTH_TOKEN=$custom_base64_token_secret_key --env NACOS_AUTH_IDENTITY_KEY=$custom_server_identity_key --env NACOS_AUTH_IDENTITY_VALUE=$custom_server_identity_value -p 8848:8848 -p 9848:9848 nacos/nacos-server
鉴权结合自定义配置文件的启动
docker run -d --name nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 --env NACOS_AUTH_ENABLE=true --env NACOS_AUTH_TOKEN=$custom_base64_token_secret_key --env NACOS_AUTH_IDENTITY_KEY=$custom_server_identity_key --env NACOS_AUTH_IDENTITY_VALUE=$custom_server_identity_value --privileged=true -e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone -v /home/indexvc/server/app/app-nacos/nacos-docker/logs/:/home/nacos/logs -v /home/indexvc/server/app/app-nacos/nacos-docker/conf/:/home/nacos/conf/ --restart=always nacos/nacos-server
或者直接在配置文件中修改,然后无需启动时增加环境变量
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 MODE=standalone -v /home/indexvc/server/app/app-nacos/nacos-docker/logs/:/home/nacos/logs -v /home/indexvc/server/app/app-nacos/nacos-docker/conf/:/home/nacos/conf/ --restart=always nacos/nacos-server
修改application.properties
nacos.core.auth.enabled= true
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:}
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:true}
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}
浏览器方案
客户端如何进行鉴权
springboot 要配置nacos的用户密码
命令集合
docker pull nacos/nacos-server:v2.2.3
# 删除2.5.0版本容器
docker rm nacos
# 创建临时容器
docker run -p 8849:8848 --name nacos -d nacos/nacos-server:v2.2.3
mkdir /home/index/server/app/app-nacos/nacos2.2.3-docker
# 复制文件
docker cp nacos:/home/nacos/logs/ /home/index/server/app/app-nacos/nacos2.2.3-docker/
docker cp nacos:/home/nacos/conf/ /home/index/server/app/app-nacos/nacos2.2.3-docker/
# 删除临时容器
docker rm nacos
# 修改配置文件
docker run -d --name nacos -p 9847:9848 -p 9849:9849 --privileged=true -e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone -v /home/index/server/app/app-nacos/nacos2.2.3-docker//logs/:/home/nacos/logs -v /home/index/server/app/app-nacos/nacos2.2.3-docker/conf/:/home/nacos/conf/ --restart=always nacos/nacos-server
nacos 升级
nacos2.2.3 升级到2.5.0
表结构变更
config_info_gray 新建
config_info.encrypted_data_key 增加
有问题,直接私信或者留言,看见就会回的 。