分布式电商项目十一:使用Nacos作为配置中心
使用Nacos作为配置中心
同Nacos作为注册中心一样,我们同样参考alibaba的官方文档:Nacos配置中心
导入依赖
我们同样把Nacos作为配置中心的相关依赖导入到common模块中,因为我们自己设计的微服务都需要使用Nacos进行配置管理。
<!-- Nacos配置中心和注册中心的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
添加配置文件
我们同样以mall-coupon模块作为示例
在微服务的目录文件 /src/main/resources/bootstrap.properties配置 Nacos Config 元数据:
spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
分别是微服务的名称和连接的nacos配置中心地址。注意,Nacos同时能够兼顾配置中心和注册中心,所以两个地址是一样的。
完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。这里我们使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能。
@Value("${user.name}")
String userName;
@Value("${user.age}")
int age;
测试一下Nacos测试中心
为了测试我们配置中心配置的数据是否生效,我们做一个简单的请求控制,在com.lastingwar.mall.coupon.controller.CouponController文件中添加如下代码:
@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);
}
代码含义是调取配置环境中的coupon.user.name和coupon.user.age,在访问coupon/coupon/test链接时,返回json格式的信息内容。
同时在mall-coupon/src/main/resources/application.properties 配置文件中添加内容:
coupon.user.name=zhangsan
coupon.user.age=20
重启微服务coupon,之后访问http://localhost:7000/coupon/coupon/test
会看到返回信息是配置文件中的信息
{"msg":"success","code":0,"name":"zhangsan","age":20}
之后我们在Nacos配置中心中进行配置修改这两条信息:
进入到Nacos配置中心,新建一个配置
之后重启服务,控制台会多出一条信息:
2020-05-30 13:55:14.518 INFO 2892 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'mall-coupon.properties', group: 'DEFAULT_GROUP'
再次访问http://localhost:7000/coupon/coupon/test会发现信息已经修改了
{"msg":"success","code":0,"name":"zhangsan","age":25}
每次修改配置都需要重新服务太麻烦了,可以在映射控制上添加注解@RefreshScope 打开动态刷新功能如下:
@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@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);
}
添加注解之后重新启动服务。
访问http://localhost:7000/coupon/coupon/test返回信息
{"msg":"success","code":0,"name":"zhangsan","age":25}
之后我们在Nacos配置中心修改配置文件
再次访问http://localhost:7000/coupon/coupon/test会发现信息已经修改了
{"msg":"success","code":0,"name":"zhaosi","age":30}
说明我们已经能够动态修改配置文件了。
Nacos命名空间
在项目开发的过程中,会针对不同的环境,例如开发、测试、生产等,这时候就需要使用命名空间来进行配置隔离。Nacos默认的命名空间是public,我们添加开发、测试、生产三种空间进去。
随后我们在配置管理界面就能看到不同的空间
命名空间的切换
我们在prop中也创建一个配置文件
名称相同,内容修改为wangwu,50 。
在配置管理的上端会看到类似ID的内容:
添加到微服务的配置文件中 mall-coupon/src/main/resources/bootstrap.properties
spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=5592ccde-06e6-4037-a6e4-4875689133fb
之后重启服务,访问http://localhost:7000/coupon/coupon/test返回信息
{"msg":"success","code":0,"name":"wangwu","age":50}
说明已经切换了命名空间的配置文件。
正常使用时,不仅需要对不同的环境进行不同的配置,不同的微服务之间也需要也需要进行配置隔离,添加方法同上。
配置集、配置集ID和配置分组
配置集:各条配置信息的集合成为配置集
配置集ID:类似配置文件名。
配置分组:默认所以配置集ID都属于默认组,也可以自动定义组,以便不同的时候使用,例如“双十一”,“618”等
以上三条信息,是Nacos中用于区分配置文件的定义。
配置文件除了可以进行不同的命名空间加载之后,还可以选择不同的分组。
我们创建一个不同分组的配置文件:
切换方法和切换命名空间类似,添加内容到mall-coupon/src/main/resources/bootstrap.properties
spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=5592ccde-06e6-4037-a6e4-4875689133fb
spring.cloud.nacos.config.group=1111
之后重启服务,访问http://localhost:7000/coupon/coupon/test返回信息
{"msg":"success","code":0,"name":"zhaoliu","age":60}
可以看到已经切换到了不同的分组。
Nacos配置中心的推荐使用方法
推荐使用命名空间来区分不同的微服务,避免不同微服务之间进行重复加载,通过组名来区分使用环境。
Nacos加载多个配置集的方法
在使用配置文件时,我们通常会对其进行拆分,将过多的信息放入到固定一个配置文件中,会显得过于臃肿:对mall-coupon/src/main/resources/application.yml文件进行拆分:先在Nacso配置中心配置多个配置文件:
之后先注解掉mall-coupon/src/main/resources/application.yml的内容:
#spring:
# datasource:
# username: root
# password: 123456
# url: jdbc:mysql://47.99.247.20:3306/mall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
# driver-class-name: com.mysql.cj.jdbc.Driver
# cloud:
# nacos:
# discovery:
# server-addr: 127.0.0.1:8848
# application:
# name: mall-coupon
#mybatis-plus:
# mapper-locations: classpath:/mapper/**/*.xml
# global-config:
# db-config:
# id-type: auto
#server:
# port: 7000
之后配置mall-coupon/src/main/resources/bootstrap.properties 文件:
spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=5592ccde-06e6-4037-a6e4-4875689133fb
spring.cloud.nacos.config.group=dev
spring.cloud.nacos.config.ext-config[0].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=spring.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
注意这里的data-id名称是可以自己取的,后缀一定要正确,不然无法读取,同时会默认加载对应组的mall-coupon.properties
spring.cloud.nacos.config.ext-config[0].refresh 是指是否动态刷新,默认是false。
访问http://localhost:7000/coupon/coupon/test返回的是mall-coupon.properties group:dev中的内容。
{"msg":"success","code":0,"name":"zhangsan","age":21}
上一篇: 豆B学生那超搞笑填词
下一篇: 轻松一刻到了,生活需要加点料