微服务部署下使用Nacos集成服务注册和发现,配置管理。
1、Spring Cloud整合Nacos注册中心
1.1、引入Nacos服务发现组件
1 2 3 4 5
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
|
1.2、下载Nacos Server并启动
- 下载Nacos Server 压缩包
https://github.com/alibaba/nacos/releases
- 启动 Server
进入解压后文件夹或编译打包好的文件夹,找到如下相对文件夹 nacos/bin,并对照操作系统实际情况之下如下命令,-m standalone表示单机模式启动。
1 2 3 4
| sh startup.sh -m standalone
startup.cmd -m standalone
|
1.3、配置Nacos server地址和微服务名称
- 为每个微服务都配置Nacos Server 地址
在每个微服务应用的 /src/main/resources/application.yml配置文件中配置 Nacos Server 地址。
1 2 3 4 5 6 7 8
| spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848
application: name: passjava-question
|
1.4、添加注解
为每个服务使用 @EnableDiscoveryClient 注解开启服务注册与发现功能。
1 2 3 4 5 6 7 8 9 10
| @EnableDiscoveryClient @MapperScan("com.jun.passjava.question.dao") @SpringBootApplication public class PassjavaQuestionApplication {
public static void main(String[] args) { SpringApplication.run(PassjavaQuestionApplication.class, args); }
}
|
1.5、访问Nacos Server后台
登录后台
http://localhost:8848/nacos/index.html#/login
用户名:nacos
密码:nacos
2、Spring Cloud整合Nacos配置中心
2.1、传统配置方式
- application.properties文件中定义两个配置:
1 2
| member.nickname = "jun" member.age = "18"
|
- 示例控制器中定义私有变量nickname和age,@value代表从配置中取值
1 2 3 4 5
| @Value("${member.nickname}") private String nickname;
@Value("$member.age") private Integer age;
|
- 示例控制器中定义方法:获取nick和age的值
1 2 3 4
| @RequestMapping("/test-local-config") public R testLocalConfig() { return R.ok().put("nickname", nickname).put("age", age); }
|
- 测试结果

- 总结
从配置文件中获取配置。这种方式的缺点是什么呢?如果要修改配置参数,则需要重新启动服务。如果服务很多,则需要重启所有服务,非常不方便。
有没有什么办法不停服务修改配置而且使其生效呢?
答案:有的,用Spring Cloud Alibaba的Nacos 组件就可以完成。
2.2、引入Nacos config依赖
1 2 3 4
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
|
2.3、配置Nacos元数据
- 微服务下添加 /src/main/resources/bootstrap.properties 配置文件。
注意:bootstrap.properties 是系统级的,优先级高于其他配置文件, application.properties 是应用级别的,加载比较晚,其次是bootstrap.yml、application.yml,所以引入 Nacos 组件时,需要配置 bootstrap.properties
- 配置 Nacos Config 元数据。
需要配置Nacos的服务名,也就是对应Nacos管理平台的配置文件,和Nacos服务地址。
1 2
| spring.application.name=nacos-demo spring.cloud.nacos.config.server-addr=127.0.0.1:8848
|
2.4、Nacos后台新增配置
Data ID: nacos-demo.properties
Group: DEFAULT_GROUP
配置格式:
1 2
| user.name="jun" user.age=27
|

2.5、开启动态刷新配置
添加注解@RefreshScope开启动态刷新配置功能。
1 2 3 4 5 6
| @RequestMapping("/test-local-config") @RestController @RefreshScope public R testLocalConfig() { return R.ok().put("nickname", name).put("age",age); }
|
日志:
1 2 3
| 2023-09-27 10:59:06.646 INFO 13252 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [user.name] 2023-09-27 10:59:06.646 INFO 13252 --- [-127.0.0.1_8848] c.a.nacos.client.config.impl.CacheData : [fixed-127.0.0.1_8848] [notify-ok] dataId=nacos-demo.properties, group=DEFAULT_GROUP, md5=bd3c381399ca063d5ee908060b8c1afa, listener=com.alibaba.cloud.nacos.refresh.NacosContextRefresher$1@186a3635 2023-09-27 10:59:06.647 INFO 13252 --- [-127.0.0.1_8848] c.a.nacos.client.config.impl.CacheData : [fixed-127.0.0.1_8848] [notify-listener] time cost=2133ms in ClientWorker, dataId=nacos-demo.properties, group=DEFAULT_GROUP, md5=bd3c381399ca063d5ee908060b8c1afa, listener=com.alibaba.cloud.nacos.refresh.NacosContextRefresher$1@186a3635
|
user.name更新了,通知了nacos-demo服务,刷新了配置。对应的配置id为nacos-demo.properties,分组为DEFAULT_GROUP。监听器为com.alibaba.cloud.nacos.refresh.NacosContextRefresher
测试结果:

2.6、更多
命名空间、分组、多配置集用法。