nacos
1. 概念
namespace 命名空间,用于区分开发和生产环境,也可以区分业务系统
Group:用来分组
DataId 文件名
三者所属关系:DataId属于Group属于namespace
2. 安装管理端
2.1. 启动提示鉴权报错
2.2.2之前,无论服务端是否开启鉴权,都会存在一个登录页
最好升级到大于2.2.1的版本,详情见官方文档:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
2.2. 启动报错总结
2.2.1. cmd启动后闪退
解决办法:startup.cmd/bat文件结尾加2行
pause
endlocal
2.3. docker安装
- 2.0.2 版本亲测成功
dockerhub官方命令:
docker run --name nacos-quick -e MODE=standalone -p 8849:8848 -d nacos/nacos-server:2.0.2
2.4. win版安装
2.4.1. 1.下载server
官网下载:https://nacos.io/download/release-history/
github: https://github.com/alibaba/nacos/releases/download/2.0.3/nacos-server-2.0.3.zip
2.4.2. 2.解压后创建数据库
-
1: zip解压
-
2:本电脑创建库nacos
-
3: 执行初始化脚本(conf目录下)
版本2.3.2,sql文件名为:mysql-schema.sql
成功后的表:
2.4.3. 3.properties文件配置连接信息(conf目录)
- 注意检查手动建的库名是否一致
2.4.4. 修改启动脚本cmd文件(改为单机)
2.4.5. 将"cluster"改为"standalone"
如设置为集群模式,增加一个cluster.conf也可
2.2.2亲测:
2.4.6. 启动
双击startup.cmd
成功页面:
2.4.7. 登录地址
访问:http://127.0.0.1:8848/nacos/index.html
2.4.8. 默认账号
nacos登录面板:默认账号:nacos 默认密码:nacos
3. springboot配置文件
3.1. 用spring.config.import方式(官方推荐)
springboot2.4.0才支持
application.yml配置示例:
spring:
application:
name: tlmall-order-01
config:
import:
# 表示从Nacos配置中心导入tlmall-order-01.yml文件
- optional:nacos:${spring.application.name}.yml
# optional的意义:可选的,如果没有不抛异常,继续往下执行
- optional:nacos:db-common.yml
3.1.1. 订单系统如何整合到配置中心
-
目标
让系统读取配置中心的配置,来做为项目启动。 -
1:Nacos页面创建dataid(即spring.config.import对应的xxx.yml)
-
2:pom引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 3:springboot的application.yml配置Nacos Config地址
spring:
application:
name: tlmall-user-config-demo
config:
import:
- optional:nacos:${spring.application.name}.yml
- nacos:nacos-discovery.yml #nacos注册中心配置
cloud:
nacos:
config:
# nacos配置中心
server-addr: tlmall-nacos-server:8848
username: nacos
password: nacos
3.2. bootstrap.yml(boot2.4以后已不推荐)
springboot项目,application.yml改为bootstrap.yml
boot2.4以后,推荐用spring.config.import方式
3.2.1. spring配置属性
-
DataId名字命名规则
nacos的DataId可以由spring.application.name和spring.cloud.nacos.config.file-extension拼接而成。
-
共享配置
有2种方式
shared-configs
配置的DataId只能是DEFAULT_GROUP
ext-config[下标]
可灵活配置任意GROUP下
3.2.1.1. 配置优先级
三种配置方式:
*A:spring.cloud.nacos.config.shared-configs //读取公共DataId, 只能读取DEFAULT_GROUP组的
*B:spring.cloud.nacos.config.extension-configs //读取公共DataId,可读取任意组的
*C: 通过nacos规则自动映射的配置文件(spring.application.name + spring.cloud.nacos.config.file-extension)
三者方式共同使用时,优先级为:C > B > A
4. nacos集群
4.1. 2.x
注意事项
1:集群部署至少需要3个
2: 将nacos-server下的nacos目录拷贝出来
2.x版本由于nacos2.x后新增了两个grpc的端口,所以修改的时候3个端口不能连续,要不然后造成端口冲突,
所以说这里默认为8848的话,就会占用8848、9848、9849三个端口。所以这里建议三个nacos分别修改成如下
8848, 8248,8348
3: 所有集群的ip和端口都要配置在cluster.conf中
# 示例
127.0.0.1:8242
127.0.0.1:8343
127.0.0.1:8848
192.168.84.162:8848
5. 微服务实例集群
5.1. 引入依赖
<!--nacos-discovery 注册中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
6. 配置中心功能
6.1. 如何集成
- 以订单服务为例
- 1:pom引入依赖
<!-- nacos-config 配置中心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 2:Nacos控制台创建“订单服务”dataId(订单服务application.yml中spring.config.import指定的文件名)
- 3:订单服务application.yml中添加配置
spring:
application:
name: tlmall-account
cloud:
nacos:
# discovery:
# server-addr: tlmall-nacos-server:8848
# 配置中心服务地址
config:
server-addr: tlmall-nacos-server:8848
file-extension: yml #指定配置文件扩展名为yml
config:
import:
# ${spring.application.name}.yml == tlmall-account.yml == dataId文件名
- optional:nacos:${spring.application.name}.yml
- optional:nacos:db-common.yml #数据库公共配置
- nacos:nacos-discovery.yml
- optional:nacos:seata-client.yml
6.2. profile粒度
config:
import:
# ${spring.application.name}.yml == tlmall-account.yml == dataId文件名
- optional:nacos:${spring.application.name}.yml
# profile分支
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yml
6.3. 自定义Namespace
- yml配置项
spring:
application:
name: tlmall-account
cloud:
nacos:
# 配置中心服务地址
config:
namespace: 命名空间id
6.4. 自定义Group配置
6.5. 配置文件优先级
6.5.1. application.yml方式
- config.import方式
自上而下,后面的会替换前面的
config:
import:
# ${spring.application.name}.yml == tlmall-account.yml == dataId文件名
- optional:nacos:${spring.application.name}.yml
# profile分支的配置 > 上面的
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yml
6.6. 配置文件动态刷新
需要添加注解@RefreshScope
- 可以把@Value 集中到一个bean管理
// 加了@RefreshScope后,nacos配置文件“server.port”刷新后,proFile的值可以获取最新的。
@RefreshScope
@Component
public class CommonValue {
@Value("${server.port}")
private String proFile;
public String getProFile() {
return proFile;
}
}
6.6.1. 容易出现的问题
- 现象:
@RefreshScope修饰的bean下面同时有spring的@Scheduled和@Value
@Value的值发生刷新,@Scheduled的定时任务会暂停,当有bean获取@Value的值后,定时任务才会重新开始执行。 - 原因:
@RefreshScope修饰的bean,属性变更后,缓存会被清除,定时任务缓存也被清除了,获取属性时,spring才会重新扫描该bean,重新初始化。
@RefreshScope修饰的bean,和普通的单例bean不一样,被@Scope("refresh")注解修饰,默认代理模式为:
ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
作用是创建一个代理对象,每次调用时用它来调用GenericScope.get方法获取bean.
在GenericScope里面包装了一个内部类 BeanLifecycleWrapperCache 对加了@RefreshScope的bean进行缓存,使其在不刷新时获取的是同一个bean.
如果属性发生变化,会调用ContextRefresher.refresh() --> RefreshScope.refreshAll()清理缓存,并发送刷新事件通知 --> 调用GenericScope.destroy()
清理缓存。
下次使用bean时,代理对象会调用get(String name, ObjectFactory<?> objectFactory),生成一个新的bean,存入缓存,此时属性装配的就是nacos最新的属性了。
- 如何解决:
实现Spring事件监听器,监听RefreshScopeRefreshedEvent事件,监听方法中执行一次该定时任务方法。
@RefreshScope
@Component
public class CommonValue implements ApplicationListener<RefreshScopeRefreshedEvent> {
@Value("${server.port}")
private String proFile;
public String getProFile() {
return proFile;
}
@Scheduled(cron = "*/3 * * * * ?")
public void aa() {
System.out.println("CommonValue.aa()...执行了");
}
public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
aa();
}
}
7. 常见问题
7.1. 如何打印nacos日志
- yml文件配置
logging:
level:
com.alibaba.cloud.nacos: debug
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫