欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

分布式电商项目十一:使用Nacos作为配置中心

程序员文章站 2022-04-14 23:21:14
...

使用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配置中心,新建一个配置
分布式电商项目十一:使用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配置中心修改配置文件
分布式电商项目十一:使用Nacos作为配置中心
再次访问http://localhost:7000/coupon/coupon/test会发现信息已经修改了

{"msg":"success","code":0,"name":"zhaosi","age":30}

说明我们已经能够动态修改配置文件了。

Nacos命名空间

在项目开发的过程中,会针对不同的环境,例如开发、测试、生产等,这时候就需要使用命名空间来进行配置隔离。Nacos默认的命名空间是public,我们添加开发、测试、生产三种空间进去。
分布式电商项目十一:使用Nacos作为配置中心
随后我们在配置管理界面就能看到不同的空间
分布式电商项目十一:使用Nacos作为配置中心
命名空间的切换
我们在prop中也创建一个配置文件
分布式电商项目十一:使用Nacos作为配置中心
名称相同,内容修改为wangwu,50 。
在配置管理的上端会看到类似ID的内容:
分布式电商项目十一:使用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

之后重启服务,访问http://localhost:7000/coupon/coupon/test返回信息

{"msg":"success","code":0,"name":"wangwu","age":50}

说明已经切换了命名空间的配置文件。

正常使用时,不仅需要对不同的环境进行不同的配置,不同的微服务之间也需要也需要进行配置隔离,添加方法同上。

配置集、配置集ID和配置分组

配置集:各条配置信息的集合成为配置集
配置集ID:类似配置文件名。
配置分组:默认所以配置集ID都属于默认组,也可以自动定义组,以便不同的时候使用,例如“双十一”,“618”等
以上三条信息,是Nacos中用于区分配置文件的定义。
配置文件除了可以进行不同的命名空间加载之后,还可以选择不同的分组。
我们创建一个不同分组的配置文件:
分布式电商项目十一:使用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作为配置中心

Nacos加载多个配置集的方法

在使用配置文件时,我们通常会对其进行拆分,将过多的信息放入到固定一个配置文件中,会显得过于臃肿:对mall-coupon/src/main/resources/application.yml文件进行拆分:先在Nacso配置中心配置多个配置文件:
分布式电商项目十一:使用Nacos作为配置中心
分布式电商项目十一:使用Nacos作为配置中心
分布式电商项目十一:使用Nacos作为配置中心

之后先注解掉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}
相关标签: 电商