Nacos也可以作为配置中心,配置中心的意思是不在application.properties等文件中配置了,而是放到nacos配置中心公用,这样无需每台机器都改。
官方教程:https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md
在common项目中添加pom依赖(需要在discover之上)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在coupon项目resources中创建bootstrap.properties,配置 Nacos server 的地址和应用名,这个文件是SpringBoot里规定的,他优先级别比application.properties高。
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=gulimall-coupon
在application.properties文件中配置:
coupon.user.name=zhangsan
coupon.user.age=18
在com.atguigu.gulimall.coupon.controller.CouponController中添加测试代码@RequestMapping(“/test”)
//从application.properties中获取
// 不要写user.name,他是环境里的变量
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;
@RequestMapping("/test")
public R test(){
return R.ok().put("name",name).put("age",age);
}
运行application后可以在coupon/coupon/test中获得返回的结果
使用nacos配置管理中心
2022-09-19 13:32:19.952 INFO 23500 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='gulimall-coupon.properties'}]}
启动服务的时候可以看到在读取nacos中的配置文件
登陆Nacos,在配置管理-配置列表中增加名为gulimall-coupon.properties的properties文件填入配置内容
Data Id=gulimall-coupon.properties
coupon.user.name=李四
coupon.user.age=22
com.atguigu.gulimall.coupon.controller.CouponController中的public class CouponController{}上添加注解@RefreshScope即可动态从配置中心获取配置
此时在配置中心更改配置内容发布后即可实时更改服务中的配置内容
通过
@RefreshScope–动态刷新注解
@Value(${配置项的名})–获取某个配置的值
这两个注解就可以做到动态获取并刷新配置
如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置
- 细节
1/命名空间
2/配置集
3/配置集ID
4/配置分组
1/命名空间:配置隔离(默认为public),默认新增的所有配置都在public空间
1.开发,测试,生产可能都有不同的配置.
![请添加图片描述](https://img-blog.csdnimg.cn/13a6883406be4942b46753f7d67e8725.png)创建3个命名空间
在prop里也创建一个名字和内容跟public相同的配置文件
重启coupon,会发现application还是默认获取public命名空间中的配置
如果想启动application使用其他命名空间的配置,则需要在bootstrap.properties中增加配置
spring.cloud.nacos.config.namespace=9d7d11f2-7dc2-42b3-9230-c6c8f0562a53
9d7d11f2-7dc2-42b3-9230-c6c8f0562a53为命名空间后的值(新版可以直接输入命名空间的名称)这样就可以利用命名空间来做环境隔离.
也可以每一个微服务之间相互隔离配置,为每一个微服务都创建自己的命名空间.只加载自己的命名空间下的配置.
创建优惠券与会员的命名空间,并连接至自己的命名空间.
2/配置集:所有配置的集合
3/配置集ID:类似于配置文件名
4/配置分组(重要):默认所有的配置集都属于DEFAULT_GROUP
比如双11用某种配置,618用某种配置.
配置管理中设置了一个1111的优惠券分组,
在bootstrap.properties中设置spring.cloud.nacos.config.group=1111就可以把配置文件切换到1111的分组,如果不设置就是使用默认分组
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=gulimall-coupon
#连接至gulimall-coupon命名空间
spring.cloud.nacos.config.namespace=2dc1f8fe-f5a4-4336-b9f1-c8c8d0643d93
#启用命名空间中group=1111的配置
spring.cloud.nacos.config.group=1111
每个微服务创建自己的命名空间,使用配置分组区分使用环境,如dev,test,prop环境.
通过在bootstrap.properties中修改分组名就可以确认使用哪个环境.
随着业务不断壮大,微服务的配置会非常多,将所有配置写在一个配置文件中不现实.一般的做法是拆分成不同的配置文件,比如跟数据源有关的配置文件写在一起,跟框架有关的写在一起等等.
这时就可以将配置文件拆分开来
在配置管理中新建
datasource.yml
mybatis.yml
other.yml
将模块中的application.yml中的原配置文件拆分开来
原配置文件↓
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.56.10:3306/gulimall_sms
driver-class-name: com.mysql.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
server:
port: 7000
datasource.yml
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.56.10:3306/gulimall_sms
driver-class-name: com.mysql.jdbc.Driver
mybatis.yml
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
other.yml
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
server:
port: 7000
此时需要让微服务启动的时候同时加载这三个配置文件
在bootstrap.properties中注释掉之前的config.grouup,然后加入下面配置(新版没有使用)
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=gulimall-coupon
#连接至gulimall-coupon命名空间
spring.cloud.nacos.config.namespace=2dc1f8fe-f5a4-4336-b9f1-c8c8d0643d93
##启用命名空间中group=1111的配置
#spring.cloud.nacos.config.group=dev
#发现.ext-config是一个数组
#加载的data-id
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
#加载的group
spring.cloud.nacos.config.ext-config[0].group=dev
#是否动态刷新,默认是否
spring.cloud.nacos.config.ext-config[0].refresh=true
#加载的data-id
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
#加载的group
spring.cloud.nacos.config.ext-config[1].group=dev
#是否动态刷新,默认是否
spring.cloud.nacos.config.ext-config[1].refresh=true
#加载的data-id
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
#加载的group
spring.cloud.nacos.config.ext-config[2].group=dev
#是否动态刷新,默认是否
spring.cloud.nacos.config.ext-config[2].refresh=true
重启服务
可以看到console中读取了设置好的配置文件,和默认读取的配置文件
2022-09-19 21:21:15.020 INFO 17508 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'datasource.yml', group: 'dev'
2022-09-19 21:21:15.030 INFO 17508 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'mybatis.yml', group: 'dev'
2022-09-19 21:21:15.036 INFO 17508 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'other.yml', group: 'dev'
2022-09-19 21:21:15.044 INFO 17508 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='gulimall-coupon.properties'}, NacosPropertySource {name='other.yml'}, NacosPropertySource {name='mybatis.yml'}, NacosPropertySource {name='datasource.yml'}]}
但是此时无法在我们配置的coupon命名空间中找到属于Group内dev分组的gulimall-coupon.properties,所以就使用了项目中的gulimall-coupon.properties.
再次修改配置文件bootstrap.properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=gulimall-coupon
#连接至gulimall-coupon命名空间
spring.cloud.nacos.config.namespace=2dc1f8fe-f5a4-4336-b9f1-c8c8d0643d93
##启用命名空间中group=1111的配置
spring.cloud.nacos.config.group=prod
#发现.ext-config是一个数组
#加载的data-id
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
#加载的group
spring.cloud.nacos.config.ext-config[0].group=dev
#是否动态刷新,默认是否
spring.cloud.nacos.config.ext-config[0].refresh=true
#加载的data-id
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
#加载的group
spring.cloud.nacos.config.ext-config[1].group=dev
#是否动态刷新,默认是否
spring.cloud.nacos.config.ext-config[1].refresh=true
#加载的data-id
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
#加载的group
spring.cloud.nacos.config.ext-config[2].group=dev
#是否动态刷新,默认是否
spring.cloud.nacos.config.ext-config[2].refresh=true
重启微服务发送/coupon/coupon/test可以得到返回的数据即可认为配置已生效
以后只需要在bootstrap.properties中说明加载了配置中心中的哪些配置文件即可
@Value
@ConfiggurationProperties…等等注解也可以获取到配置中心中的配置值
以前SpringBoot任何方法从配置文件中获取值,都能使用
配置中心有的优先使用配置中心的
Nacos的更多详细使用方法还可以参照Nacos的官方文档
https://nacos.io/zh-cn/docs/what-is-nacos.html