一止长渊

Nacos:如何统一配置(下)

N 人看过
字数:1.6k字 | 预计阅读时长:6分钟
我们项目部署期间,如果修改配置,则需要重新打包部署到服务器上,这一过程十分繁琐,有什么简便的方法能够实现在服务不停机的情况下,动态修改配置呢?这里就要使用 Nacos 来统一管理我们的配置了。

一、传统使用配置模式

之前我们的开发模式为,我们将需要的配置防止在 application.properies 中,然后需要使用时通过@Value(“$(配置名)”)的方式来进行引入配置,如同下面一样 👇
application.properties 配置

coupon.user.name=test1
coupon.user.age=1234

使用配置

@RefreshScope //开启Nacos配置自动刷新
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${coupon.user.name}")
    private String userName;
    @Value("${coupon.user.age}")
    private int age;

    @RequestMapping("/getvalue")
    public R getValue(){
        return R.ok().put("name", userName).put("age", age);
    }
}

缺点:上述的缺点在于我们如果想在服务运行期间修改 application.properties,网页访问 getvalue,是不会发生修改的,因为注入是在项目启动访问时注入了,之后无法再修改,只能通过下线该服务->修改 application.properties->打包重新上线使用

二、Nacos 统一配置

如果我们该服务有很多集群,不可能每台服务都要通过以上的步骤,所以我们使用 Nacos 来同一存取我们的配置
优点:

  • 在项目运行期间可以动态修改配置
  • 当有服务集群时,可以实现修改一处,所有同集群的服务配置都发生修改

使用方式
1.引入依赖

        <!--Nacos实现微服务配置统一管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
2. 创建一个 bootstrap.properties

告诉该微服务 Nacos 配置中心地址以及该服务模块名称,这样该微服务模块才能去 Nacos 以模块名.properties 读取配置
bootstrap.properties

# 配置中心地址以及该微服务名称
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=doermail-coupon

3.在 Nacos 自带的前端控制台新建一个应用名.properties 文件,写入配置
截屏2021-03-13 23.46.00.png
截屏2021-03-13 23.46.41.png
4.项目需要引入配置的类上(不是应用启动类)添加@RefreshScope 注解表示动态获取配置以及 Value 注解

@RefreshScope //开启Nacos配置自动刷新
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${coupon.user.name}")
    private String userName;
    @Value("${coupon.user.age}")
    private int age;

    @RequestMapping("/getvalue")
    public R getValue(){
        return R.ok().put("name", userName).put("age", age);
    }
}

5.项目启动时可以看到会从 Nacos 以应用名.properties 访问配置文件,访问 getvalue
截屏2021-03-13 23.46.16.png
截屏2021-03-13 23.47.33.png

  1. 运行期间修改配置,动态生效

截屏2021-03-13 23.46.55.png
截屏2021-03-13 23.47.51.png
截屏2021-03-14 00.21.15.png截屏2021-03-14 00.21.36.png

当本地有 application.properties 时,又使用了 Nacos 来统一管理配置时,这时候是 Nacos 配置优先级高于本地 application.properties,优先使用 Nacos 配置

三、细节

1.命名空间
命名空间主要是为了用作配置隔离,在不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置,NameSpace 主要的常用场景就是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离。

  • 在 Nacos 创建命名空间

截屏2021-03-14 17.35.50.png
截屏2021-03-14 17.39.13.png

  • 在 bootstrap.properties 中添加需引用哪个命名空间的配置信息
spring.cloud.nacos.config.namespace=c2d59cfd-4549-493b-b741-1cc29e9101ec
  • 上线刷新

截屏2021-03-14 17.40.21.png
2.配置集
一组相关或者不相关的配置项的集合称为配置集,一个配置集可能包含了数据源、线程池、日志级别等各种各样的配置项
3.配置集 ID
类似于配置文件名 application.properties,这里就是指应用名.properties
4.配置分组
默认所有的配置集都属于:DEFAULT_GROUP ,通常是根据活动来划分,例如双十一采取某个配置截屏2021-03-14 17.50.52.png
截屏2021-03-14 17.52.10.png
可以看到该微服务有两个配置文件,属于同一个命名空间,但是不同分组,默认微服务是使用默认分组的配置文件
在 bootstrap.properties 中添加如下信息,就可以使用指定分组的配置了

spring.cloud.nacos.config.namespace=9d4cb79e-bd03-467f-9e2f-2a7bcfe2fe55
spring.cloud.nacos.config.group=11-11

开发规范:每个微服务拥有自己的命名空间,使用配置分组区分环境:test、dev、prod截屏2021-03-14 18.48.48.png
**

四、同时加载多个配置

1)微服务任何配置信息,任何配置文件都可以放在配置中心中
2)只需要在 bootstrap.properties 说明加载配置中心哪些配置文件即可(指定好 group)
3)@Value、@ConfigurationProperties 都可以进行配置代码中的注入
4)配置中心有的优先 使用
一般随着业务不断壮大,数据源、mybatis、拦截器配置不可能都放在微服务下面的 application.yml 中,这里对不同的配置进行拆分,放置在 Nacos 中进行统一管理。

  • 数据源:将 application.yml 中数据源在 Nacos 中抽取出来,新建 datasouce.yml

截屏2021-03-14 19.55.24.png

  • mybatis 配置:将 application.yml 中 mybatis 在 Nacos 中抽取出来,新建 mybatis.yml

截屏2021-03-14 19.57.19.png

  • 其他配置:例如注册中心地址、应用名

截屏2021-03-14 19.58.22.png
经过上面已经将应用的数据源配置、端口号之类的搬迁到了 Nacos 中,那么接下来本地如何引用这些配置呢?还是在bootstrap.properties中进行配置
通过 ext-config 属性指定,可以看到是一个 List,然后每个配置下面设置好 dataId,group 属性,以及是否采用动态配置 refresh
本地的 application.yml 可以完全删除,直接实现 Nacos 统一配置管理

# 配置中心地址以及该微服务名称
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=9d4cb79e-bd03-467f-9e2f-2a7bcfe2fe55
spring.cloud.nacos.config.group=dev
spring.application.name=doermail-coupon

# 数据源Nacos
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

# mybatis
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.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

image.pngimage.png

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。