服务配置

服务配置

起男 1,020 2021-08-22

服务配置

微服务下配置文件的一些问题:

  • 配置文件相对分散
  • 配置文件无法区分环境
  • 配置文件无法实时更新

基于这些问题,我们就需要配置中心来解决

思路

  • 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口
  • 当各个服务需要获取配置的时候,就来配置中心拉取自己的配置
  • 当配置中心的各种参数又更新的时候,也能够通知到各个服务实时过来同步最新的信息,使之动态更新

nacos config

使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放到nacos上,然后各个服务从nacos上拉取即可

相关概念

  • 命名空间(namespace):命名空间用于进行不同环境的配置隔离
    • 创建:在控制页面中命名空间里创建
    • 使用:通过设置配置文件spring.cloud.nacos.config.namespace=命名空间id进行使用
  • 配置分组(group):配置分组用于将不同的服务归到一组。一般一个项目下的微服务分为一组
  • 配置集(data id):在系统中,一个配置文件通常就是一个配置集

使用

  1. 导入依赖

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            </dependency>
    
  2. 在微服务中添加nacos config配置

    注意:不能使用application.yml配置文件,而是bootstrap.yml

    优先级由高到低:

    1. bootstrap.properties
    2. bootstrap.yml
    3. application.properties
    4. application.yml
    spring:
      application:
        name: 服务名称
      cloud:
        nacos:
          config:
            server-addr: localhost:8848  #nacos的服务端地址
            file-extension: yaml #配置格式
      profiles:
        active: dev #环境标识
    
  3. 在nacos页面中,配置管理添加一个配置

    Data ID 格式为:服务名称-环境标识.配置格式

动态刷新

  • 硬编码方式:通过ConfigurableApplicationContext的getEnvironment().getProperty方式获取的配置信息本身就可以实现动态刷新
  • 注解方式:通过@Value("${}")的方式默认是不能动态刷新的,需要在类上添加@RefreshScope注解实现动态刷新

配置共享

当配置越来越多时,会发现很多配置是重复的,这时候就考虑将公共的配置文件提前出来,实现共享

同一个微服务的不同环境

配置环境时,data id的格式为:服务名称-环境标识.配置格式,如果去掉-环境标识,这样这个配置就成为了这个服务的公共配置

不同微服务

  1. 在nacos配置管理中添加一个配置文件,名称随意.配置格式

  2. 在微服务中添加配置

    spring:
      cloud:
        nacos:
          config:
            shared-dataids: Data ID #要引入的配置
            refreshable-dataids: Data ID #要实现动态刷新的配置