文章目录
- [Nacos 配置中心](#Nacos 配置中心)
- 服务部署
- [Nacos 与 Eureka 的区别](#Nacos 与 Eureka 的区别)
Nacos 配置中心
除了注册中心和负载均衡之外,Nacos 还是一个配置中心,具备配置管理的功能
namespace 的常用场景之一是不同环境的配置区分隔离
- 例如开发测试环境和生产环境的配置隔离
为什么需要配置中心
当前项目的配置都在代码中,会存在以下问题:
- 配置文件修改时,服务需要重新部署。微服务架构中,一个服务可能又成百个实例,挨个部署比较麻烦
- 多人开发时,配置文件可能需要经常修改,使用同一个配置文件容易冲突
配置中心就是对这些配置进行统一管理。通过配置中心,可以集中查看、修改和删除配置,无需再逐个修改配置文件。提高效率的同时,也降低了出错的风险
- 服务启动时,从配置中心读取配置项的内容,进行初始化
- 配置项修改时,通知微服务,实现配置的更新加载
快速上手
通过以下操作,我们先来感受一下 Nacos 配置中心的使用
- 参考文档: https://nacos.io/docs/next/ecology/use-nacos-with-spring-cloud/ https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
添加配置
在 Nacos 控制台添加配置项

注意:
- 配置管理的命名空间和服务列表的命名空间是隔离的,两个是分别设置的。默认是
public- 也就是:服务管理命名空间配置 != 配置管理的命名空间
新建配置项

配置内容
nacos.test.num=5
说明:
Data ID设置为项目名称- 配置内容的数据格式, 目前只支持
properties和yaml类型 - 设置配置内容
获取配置
- 引入
Nacos Config依赖
product-service 项目
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.* 之后版本需要引入 bootstrap -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- 配置
bootstrap.properties
微服务启动前,需要先获取Nacos中配置,并与application.yml配置合并。在微服务运行之前,Nacos要求必须使用bootstrap.properties配置文件来配置Nacos Server地址
properties
spring.application.name=product-service
spring.cloud.nacos.config.namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
或者使用 bootstrap.yml
yml
spring:
application:
name: product-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff
spring.application.name需要和nacos配置管理的Data ID一致spring.cloud.nacos.config.server-addr为Nacos Server的地址- 要加上命名空间
配置中心个注册中心的配置是隔离的
Nacos配置中心:spring.cloud.nacos.config.server-addrNacos注册中心:spring.cloud.nacos.discovery.server-addr
- 编写程序
java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/config")
@RestController
@RefreshScope
public class NacosController {
@Value("${nacos.test.num:0}")
private Integer nacosNum;
@RequestMapping("/get")
public Integer get() {
return nacosNum;
}
}
@Value:读取配置:0是默认值,避免启动失败,如果在nacos配置中没找到配置,就使用0:
@RefreshScope:配置进行热更新。当远程配置中心的配置发生变化并被刷新,这个 Bean 会重新创建(refresh),使新的配置生效
- 测试
启动程序,访问接口: http://127.0.0.1:9090/config/get

- 在
Nacos控制台修改:nacos.test.num
- 再次访问接口

配置中心详解
设置命名空间
Nacos 配置管理的命名空间和服务列表的命名空间是分别设置的。默认是 public
Nacos 命名空间配置依然在 bootstrap。properties 中进行配置
spring.cloud.nacos.config.namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff
对应 yml 配置
yml
spring:
cloud:
nacos:
config:
namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff
value 对应命名空间的 ID,如下图所示:
如果设置命名空间后,项目启动时,会从该命名空间下找对应的配置项
Data ID
格式介绍
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix:默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置spring.profiles.active即为当前环境对应的profile。当spring.profiles.active为空时,对应的连接符-也将不存在file-extension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。目前只支持properties和yml,默认为yml
微服务启动时,会从 Nacos 中读取多个配置文件
${prefix}-${spring. profiles. active}.${file-extension},如:product-service-dev.properties${prefix}.${file-extension},如:product-service.properties${prefix},如:product-service
${spring.application.name},${spring.profiles.active}等通过配置⽂件来指定时,必须放在bootstrap.properties⽂件中
观察日志
在 bootstrap.yml 中添加 spring.profiles.active 值
yml
spring:
profiles:
active: dev
启动服务,观察日志

- 三个文件的优先级为
product-service-dev.propertiesproduct-service.propertiesproduct-service
测试
bootstrap.yml 配置如下
yml
spring:
application:
name: product-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff
配置项如下:
访问接口,服务获取到了 product-service-dev.properties 的值
删除这个配置,再次访问

注意:
booststrap.yml设置的配置格式必须和Nacos控制台配置的数据格式保持一致- 不设置配置格式(
(spring.cloud.nacos.config.file-extension))时,默认为properties
服务部署
-
修改数据库,
Nacos等相关配置 -
对两个服务进行打包
-
上传
jar到Linux服务器 -
启动
Nacos(启动前最好把data数据删除掉) -
启动服务
#后台启动order-service, 并设置输出⽇志到logs/order.log
nohup java -jar order-service.jar >logs/order.log &#后台启动product-service, 并设置输出⽇志到logs/order.log
nohup java -jar product-service.jar >logs/product-9090.log &#启动实例, 指定端⼝号为9091
nohup java -jar product-service.jar --server.port=9091 >logs/product-9091.log &
Nacos 与 Eureka 的区别
共同点:
- 都支持服务注册和服务拉取
区别:
-
功能:
Nacos除了服务发现和注册之外,还提供了配置中心,流量管理和DNS服务等功能
-
CAP理论Eureka遵循AP原则,Nacos可以切换AP和CP模式,默认APNacos根据配置识别CP或者AP模式。如果注册Nacos的Client的节点是临时节点,那么Nacos对这个Client节点的效果就是AP,反之是CP。AP和CP可以同时混合存在
-
服务发现
Eureka:基于拉模式。Eureka Client会定期从Server拉取服务信息,有缓存,默认每30s拉取一次Nacos:基于推送服务。服务列表有变化实时推送给订阅者,服务端和客户端保持心跳连接