[toc]
微服务注册与配置中心Nacos-版本2.1.0
Nacos是一个微服务组件工具,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
在SpringCloudAlibaba微服务架构中,Nacos用于注册中心和配置中心。
目前SpringCloudAlibaba中各个组件的版本搭配
| Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Seata Version |
|---|---|---|---|---|
| 2.2.8.RELEASE | 1.8.4 | 2.1.0 | 4.9.3 | 1.5.1 |
Nacos的安装与运行
windows环境下nacos服务端的单机运行
- github上找到nacos的压缩包,下载解压。注意nacos的版本。目前最新为2.1.0版本
- nacos默认是集群运行的,因此应该编辑startup.cmd。将nacos从默认的集群模式,修改为单机模式。
- 双击运行startup.cmd 或者运行命令
startup.cmd -m standalone,启动nacos服务端。下面是nacos启动截图


- 控制台界面地址:
http://xxxxx:8848/nacos/index.html。
登录页面输入用户名和密码就可以,默认的用户名和密码都是 nacos
注意:nacos单机运行的时候,默认会使用内置数据库。
windows环境下nacos服务端的集群运行
注意:nacos集群运行需要使用外部数据源mysql。3个或3个以上Nacos节点才能构成集群
步骤① github上找到nacos的压缩包,下载解压。注意nacos的版本。目前最新为2.1.0版本
步骤② nacos集群部署需要连接外部数据源mysql。
连接外部数据源mysql步骤如下
- 先把/conf/nacos-mysql.sql文件运行到mysql数据库中,建库建表。
- 修改/conf/application.properties文件中的数据库配置。将下面配置的注释解除
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root步骤③ 修改集群配置文件。将conf/cluster.conf.example文件更名为cluster.conf,根据相应安排,添加nacos节点配置。
cluster.conf文件内容如下
# 这里由于nacos都是运行在同一台机器上所以ip相同。实际根据具体情况来
192.168.11.109:8848
192.168.11.109:8850
192.168.11.109:8852注意:在nacos2.x版本中,每启动一个nacos,会有3个端口被nacos使用。例如:若某个nacos端口为8848,则9848(8848+1000)端口和9849(8848+1001)会被启用。所以设置集群nacos端口时,不要设置连续端口号。
具体步骤如下:
- 进入bin目录,编辑startup.cmd文件,将nacos启动模式改为集群。set MODE="cluster"
- 将下载的nacos目录复制3份,必须先停止nacos再复制,否则会报错
- 分别进入conf/application.properties配置文件,更改端口号,与cluster.conf文件的内容相对应。
- 分别执行这三个nacos的/bin/startup.cmd文件

步骤④ 登录任意一个nacos可视化界面,即可看到nacos集群中的各个节点信息。

将服务和nacos集群连接在一起。
当部署了nacos集群节点的时候,有两种方式把服务端应用和nacos集群连接在一起。
方式一:在每个服务的application.properties中配置多个nacos集群节点的地址
# 多个nacos注册中心地址
spring.cloud.nacos.discovery.server‐addr=192.168.11.109:8848,192.168.11.109:8850,192.168.11.109:8852方式二:使用nginx为nacos集群做反向代理。在服务与Nacos集群之间做一层负载均衡。

步骤如下
①:下载nginx,修改nginx配置文件,之后启动nginx
upstream nacos-cluster {
# nacos节点地址
server 192.168.11.109:8848;
server 192.168.11.109:8850;
server 192.168.11.109:8852;
}
server {
listen 7070;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}②:访问nacos图形化界面 http://192.168.11.109:7070/nacos
③:修改application.properties配置文件
# nacos注册中心地址
# 若使用nginx对nacos进行负载均衡,这里则填上nginx对nacos代理的地址
spring.cloud.nacos.discovery.server‐addr=192.168.11.109:7070/nacosDocker环境中搭建nacos容器
步骤① 先安装docker环境,自行百度。
步骤② 下载nacos镜像文件。最新版或某个旧版本
# 下载最新版的nacos镜像
docker pull nacos/nacos-server
# 下载2.1.0版本的nacos镜像
docker pull nacos/nacos-server:v2.1.0
# 下载2.1.1版本的精简版nacos镜像
docker pull nacos/nacos-server:v2.1.1-slim
# 查询镜像
docker images注意:v2.1.0版本和v2.1.1-slim版本的区别是带有slim的版本是精简版。
步骤③:创建并启动nacos容器
# 创建启动容器
# 38848:8848 是指宿主机端口38848映射到容器端口8848
# -e MODE=standalone 设置环境配置为单机模式
# windows系统中 /d/DockerVolumes 是指D盘的DockerVolumes目录
docker run --name myNacos -e MODE=standalone -p 38848:8848 -p 39848:9848 -p 39849:9849 -v /d/DockerVolumes/nacos/logs:/home/nacos/logs -d nacos/nacos-server:v2.1.1-slim
# 查询容器日志,看是否成功启动。
docker logs myNacos注意:在nacos2.x版本中,会有3个端口被nacos使用。
例如:若某个nacos端口为8848,则9848(8848+1000)端口和9849(8848+1001)会被启用。所以如果设置集群nacos端口时,不要设置连续端口号。
如图是windwos的docker客户端安装nacos容器。 
步骤④:宿主机访问nacos容器界面
宿主机访问地址:http://localhost:38848/nacos/index.html
登录页面输入用户名和密码就可以,默认的用户名和密码都是 nacos

Nacos微服务注册中心
注册中心的演变
注册中心用于管理所有服务、解决服务与服务之间调用关系错综复杂、难以维护的问题;
第一代:直接通过网址调用其他服务。 
第二代:通过注册表维护其他服务的网址 
第三代:通过nginx来维护其他服务的网址 
第四代:通过简单注册中心来维护服务网址和服务名称 
第五代:给注册中心加上心跳机制,并且通过部署注册中心集群等方式来维护服务网址和服务名称 
Nacos注册中心介绍
下图为微服务架构图 
Nacos作为微服务架构中的注册中心,提供了全面的服务管理能力,其核心功能包括:
服务注册:服务实例启动后,会通过Nacos Client向Nacos Server发送注册请求,提供服务名称、IP地址、端口号、健康检查URL等关键元数据。Nacos Server接收到请求后,将这些元数据持久化到内部数据库中。
服务心跳:服务实例注册成功后,Nacos Client会启动一个定时任务(默认每5秒一次)向Nacos Server发送心跳包,表明服务实例处于正常运行状态。心跳包包含服务名称、实例ID等信息,用于维持实例的活跃状态,防止被错误剔除。
服务同步:在Nacos Server集群环境中,各个Nacos节点之间会进行数据同步,确保所有Nacos节点上的服务实例信息保持一致。当一个节点接收到新的注册请求时,会通过集群内部通信机制将数据同步到其他节点,保证高可用和数据一致性。
服务发现:服务消费者(Nacos Client)需要调用其他服务时,会向Nacos Server发送查询请求,获取目标服务的所有可用实例列表。获取到的服务列表会被缓存在客户端本地,并通过定时拉取机制(默认每30秒一次)与服务端保持同步,以确保及时获取服务实例的最新状态变更。
服务健康检查:Nacos Server会主动对已注册的服务实例进行健康状态监控。对于超过15秒未收到心跳的实例,会将其健康状态标记为不可用(healthy=false),此时服务消费者将无法发现该实例;若实例超过30秒(默认配置)未发送心跳,Nacos Server会直接从服务注册表中剔除该实例。被剔除的实例恢复心跳后,会重新触发注册流程,重新加入服务注册表。
服务元数据管理:Nacos支持存储和管理服务的自定义元数据信息,如服务版本、环境、权重等。这些元数据可用于实现灰度发布、环境隔离、权重路由等高级功能,为微服务治理提供了灵活的支持。
集群管理:Nacos提供了完善的集群管理能力,包括节点状态监控、自动故障检测和恢复等功能。通过Nacos控制台,管理员可以直观地查看集群状态、服务分布和健康情况,便于进行运维管理。
这些核心功能共同构成了Nacos作为注册中心的完整服务治理体系,为微服务架构提供了可靠的服务注册发现和管理能力。
Spring Cloud Alibaba 项目的子工程 引入 Nacos注册中心
注意:示例为Spring Cloud Alibaba 子工程
① 确保父工程pom文件中引入spring boot,spring cloud和spring cloud alibaba依赖
<dependencyManagement>
<dependencies>
<!-- Spring Boot 版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud 版本 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba 版本 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>② 给当前子工程pom引入Nacos Discovery依赖,该依赖用于服务注册和发现
<dependencies>
<!-- .....其他依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>注意
- 此处不用写版本号,是因为父工程pom引入了spring-cloud-alibaba的依赖,该依赖中已经定好了nacos Discovery依赖的版本号。
- 若写了版本号,则表示是当前子工程单独引入nacos依赖,而不是继承父工程中指定的nacos Discovery依赖。
③ 子工程的 bootstrap.properties 配置文件中进行nacos注册配置
spring.cloud.nacos.discovery.enabled=true # 是否启用nacos注册中心
spring.cloud.nacos.discovery.server-addr=localhost:38848 # nacos注册中心访问地址
spring.cloud.nacos.username=nacos # nacos注册中心用户名
spring.cloud.nacos.password=nacos # nacos注册中心密码当使用Nacos作为注册中心和配置中心时,建议在bootstrap.properties(而非application.properties)中配置,以确保配置能够优先加载。
因为bootstrap.properties配置文件会比application.properties文件优先加载。
④ 运行当前子工程,访问nacos管理页面 http://localhost:38848/nacos 上可以看到当前服务注册到nacos中
38848是宿主机的端口,8848是nacos容器的端口。通过访问宿主机的38848端口来访问nacos容器的8848端口。

⑤ 测试调用服务
使用restTemplate调用注册中心的服务,注意要给restTemplate添加@LoadBalanced注解,该注解用于开启负载均衡。
//-------------这里是启动类UserApplication.java
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
//-------------这里是控制层类userController.java
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/rest1")
public String restTemplate(){
//用restTemplate调用注册中心的服务
//这里调用其他服务接口的时候,不填写ip端口,直接填写nacos注册中心的服务名。例如:user-service
String a = restTemplate.getForObject("http://user-service/user/get",String.class);
return a;
}
@RequestMapping("/rest2")
public String restTemplate2(){
//用restTemplate调用注册中心的服务
String a = restTemplate.getForObject("http://order-service/order/get",String.class);
return a;
}
@RequestMapping("/rest3")
public String restTemplate3(){
//用restTemplate调用注册中心的服务
String a = restTemplate.getForObject("http://product-service/product/get",String.class);
return a;
}Nacos注册中心的的其他配置信息,详细配置参考官网
| 配置项 | Key | 默认值 | 说明 |
|---|---|---|---|
| 服务端地址 | spring.cloud.nacos.discovery.server-addr | 无 | Nacos Server 启动监听的ip地址和端口 |
| 服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 给当前的服务命名 |
| 服务分组 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 设置服务所处的分组 |
| 命名空间 | spring.cloud.nacos.discovery.namespace | 无 | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等 |
| 是否启用nacos注册中心 | spring.cloud.nacos.discovery.enabled | true | 是否启用nacos注册中心 |
Nacos微服务配置中心
下图为微服务架构图 
配置中心介绍
在微服务架构中,配置中心就是统一管理各个微服务配置文件的服务。
每个微服务都有自己的配置文件,为了统一维护,方便管理,所以出现了配置中心的概念。所有的微服务配置文件都在配置中心中管理和读取,因此,出现了配置中心的概念。
nacos配置中心有三个要点:命名空间Namespace,分组Group,配置集DataId。

nacos 编辑配置文件
① 新增命名空间Namespace 
命名空间默认值为public,如果不单独配置命名空间,那么默认所有的配置信息都在public命名空间中。若配置了命名空间,则namespace的值为命令空间id
Namespace 的常用场景是不同环境的配置的区分隔离,例如开发测试环境和生产环境的隔离等。我们可以通过命令空间来区分不同环境的配置。
② 新增配置文件:分组Group,配置集DataId

Data ID是配置项的唯一标识,它的命名是有一定规范的。规范如下
# Data ID的命名规范是:
${prefix}-${spring.profiles.active}.${file-extension}
# ${prefix} 默认为配置项spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
# ${spring.profiles.active} 即为当前环境对应的 profile。
# 注意:当 ${spring.profiles.active} 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
# ${file-extension} 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。默认为properties类型。支持 properties 和 yaml 类型。例如:某个微服务服务名叫 user-service,开发环境为dev。file-extension扩展格式为properties,则该微服务对应的配置文件的Data ID要命名为 user-service-dev.properties
③ 然后编辑配置文件的具体内容即可。

Spring Cloud Alibaba 项目的子工程引入Nacos配置中心服务
注意:示例为Spring Cloud Alibaba 子工程
① 先确保父工程pom文件中引入spring boot,spring cloud和spring cloud alibaba依赖
① 然后给子工程引入Nacos配置中心依赖
该依赖的版本是直接从父工程继承来的,所以无需填写版本号。
<dependencies>
<!-- .....其他依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>② 创建 bootstrap.properties 配置文件
当项目启动后,启动后的项目去拉取nacos配置中心数据。因此项目拉取 nacos 配置中心的数据,应该是在读取 application.properties 文件之前。
因此需要在项目中创建 bootstrap.properties 配置文件。bootstrap.properties 配置文件是先于 application.properties 文件加载到项目中。
spring.application.name 和 spring.profiles.active 配置可以不写在 bootstrap.properties 配置文件中,这里是为了方便展示
# 服务名称
spring.application.name=user-service
# 当前环境
spring.profiles.active=dev
# 配置中心地址
spring.cloud.nacos.config.server‐addr=localhost:8848
# 配置文件命名空间,不定义的时候默认为public,定义的时候,namespace值为命令空间的ID
# spring.cloud.nacos.config.namespace=public
# 配置文件分组,默认为DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP
# 配置文件后缀,默认为properties
spring.cloud.nacos.config.file-extension=properties根据上面例子的配置,该微服务会拉取public命名空间下DEFAULT_GROUP分组下的user-service-dev.properties配置文件。
注意:只有在配置文件中不定义namespace=public,服务才可以读取配置中心public命令空间中的数据。否则不行。此处为Nacos的一个bug。
③:子工程代码中读取配置中心的配置信息
//@Value注解可以获取到配置中心的值,
//但是无法动态获取配置中心实时修改后的值,需要利用@RefreshScope注解进行动态刷新
package com.example.user.controller;
@RestController
@RequestMapping("/userConfig")
@RefreshScope
public class UserConfigController {
@Value("${username}")
private String username;
@Value("${age}")
private String age;
@RequestMapping("/getConfig")
public String getConfig(){
System.out.println("username:"+username);
System.out.println("age:"+age);
return username+","+age;
}
}④:重启服务运行

当微服务正确监听到配置中心数据后,nacos配置中心可以查询到配置文件正在被那个服务端进行监听。
自定义扩展的 Data Id 配置
nacos配置中心支持自定义扩展的 Data Id 配置。可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
bootstrap.properties 配置文件
# 配置中心地址
spring.cloud.nacos.config.server‐addr=localhost:7070/nacos
# 配置文件命名空间,不定义的时候默认为public,定义的时候,namespace值为命令空间的ID
# spring.cloud.nacos.config.namespace=public
# 配置文件分组,默认为DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP
# 配置文件后缀,默认为properties
spring.cloud.nacos.config.file-extension=properties
## 通过shared-configs可以支持读取多个配置文件,数组形式
# 不同工程下的通用配置 支持共享的 DataId
spring.cloud.nacos.config.shared-configs[0].data-id=shared01.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true
## 通过extension-configs可以支持读取多个配置文件,数组形式
# 支持一个应用多个 DataId 的配置 一定要加扩展名
spring.cloud.nacos.config.extension-configs[0].data-id=extension01.properties
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true- shared-configs:主要用于不同工程下的通用配置。
- extension-configs: 主要用于一个工程下的扩展配置。
不同Data Id 配置的优先级关系:
优先级从高到低:
- 1 useservice-dev.properties 精准配置。不带有profile形式
- 2 useservice.properties 同工程不同环境的通用配置。带有profile形式
- 3 extension-configs: 不同工程 扩展配置
- 4 shared-configs 不同工程通用配置
当bootstrap.properties配置文件同时出现上面三种DataID设置时。对于同一个属性,高优先级的会覆盖低优先级的。例如高优先级的username属性会覆盖低优先级的username属性。
