Nacos使用
-
使用注册中心
-
本地直接启动nacos
-
引入nacos注册中心依赖
<!--nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>${spring-cloud-alibaba.version}</version> </dependency>
-
创建一个模块,yml文件中添加nacos配置
spring: application: name: Microservice_User cloud: nacos: server-addr: localhost:8848 #配置Nacos地址 discovery: namespace: ccx #配置命名空间
-
这样即可把User服务注册到nacos中
-
-
使用配置中心
-
添加配置中心依赖
<!--nacos配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>${spring-cloud-alibaba.version}</version> </dependency>
-
@RefreshScope注解 配置动态刷新
在controller类上添加这个注解之后就可以动态感知到nacos配置中的变化而不用重启服务。
此注解是通过对标注的该类的Bean对象创建代理类+事件驱动机制实现的配置自动刷新。集成Spring集成Nacos后会注册一个监听器来监控nacos中配置文件的变化,如果nacos中的配置发生变化监听器会收到通知,监听器收到通知后会发布一个更新事件,监听这个更新事件的监听器会将丢弃标记了这个注解的实例,重新走创建Bean的流程(其中就有依赖注入),这样就做到了配置动态刷新。
-
在配置文件中添加nacos配置
bootstrap.yml内容如下:
spring: application: name: Microservice_User cloud: nacos: server-addr: localhost:8848 # 配置nacos地址 config: file-extension: yml # 指定配置文件格式 # extension-configs[0]: # 扩展配置,支持配置多个配置文件。如果不配置这个也会有一个默认的配置文件。名字为:${spring.application.name)}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} # data-id: user.yml # group: ccx # refresh: true # 是否支持应用中可动态刷新,默认不支持 # extension-configs[1]: # data-id: user1.yml # group: ccx # refresh: true # group: ccx discovery: namespace: ccx # 配置命名空间
application.yml内容如下:
server: port: 9090 spring: profiles: active: dev
这样配置之后nacos就会监听如下3个配置文件
2024-06-25 22:49:42.736 INFO 43128 --- [ main] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=Microservice_User, group=DEFAULT_GROUP 2024-06-25 22:49:42.736 INFO 43128 --- [ main] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=Microservice_User.yml, group=DEFAULT_GROUP 2024-06-25 22:49:42.736 INFO 43128 --- [ main] c.a.c.n.refresh.NacosContextRefresher : listening config: dataId=Microservice_User-dev.yml, group=DEFAULT_GROUP
打印这3行监听配置文件信息的类实现了Spring的事件监听接口ApplicationListener
,spring在启动完成后会发布ApplicationReadyEvent事件,当前类的onApplicationEvent()方法会监听这个事件,这个类收到这个事件后打印了监听的nacos的配置文件名,以及做了其他一些动作 他们被构造的源代码如下:
其中传进来的dataIdPrefix是先获取配置文件中的prefix属性值,如果就会获取spring.application.name属性的值
-
在controller类中读取这个test.userId配置
@RefreshScope @RestController public class TestController { @Value("${server.port}") int port; @Value("${test.userId}") String userId; @GetMapping("/nacos/test") public AjaxResult getPort(){ return AjaxResult.success("nacos registry, userId of user.yml: " + userId); } }
在进行Bean的属性注入时spring会从所有配置文件(包括nacos)中寻找test.userId属性,只要上边监听的3个配置文件中任意有值就会被注入。如果这三个配置文件在nacos中都存在,会优先使用名字最全的那个配置文件中的属性,比如按照现在bootstrap.yml中的配置,nacos中最全的配置文件名应为:Microservice_User-dev.yml,所以即使Microservice_User.yml中也有test.userId属性也不会被使用。
-