Nacos注册中心使用实战!Spring Cloud集成Nacos使用配置详解

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

基本概念

  • 通过Nacos Serverspring-cloud-starter-alibaba-nacos-config实现配置的动态变更
  • 通过Nacos Serverspring-cloud-starter-alibaba-nacos-discovery实现服务的注册与发现

配置

Nacos config

  • Nacos提供用于存储配置和其余元数据的key-value存储,为分布式系统中的外部化配置提供服务器端和客户端支持
  • 使用Spring Cloud Alibaba Nacos Config, 可以在Nacos Server集中管理你Spring Cloud应用的外部属性配置
  • 初始化Nacos:
    • 启动Nacos, 然后在Nacos添加配置:
Data ID:nacos-config.properties
Group:DEFAULT_GROUP
配置格式:Properties
配置内容:user.name=nacos-config-properties
         user.age=90
复制代码
  • 其中dataid是以默认的文件扩展名方式properties为扩展名

  • 配置:

    • 引入nacos config依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
复制代码
  • 使用bootstrap.properties配置文件来配置Nacos Server地址:
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
复制代码
  • 如果使用域名的方式来访问nacos,spring.cloud.nacos.config.server-addr配置的方式为 [域名:port]
    • 比如nacos的域名为abc.com.nacos, 监听的端口为80. 则配置为spring.cloud.nacos.config.server-addr=abc.com.nacos:80. 端口号80不能省略
  • 启动:
@SpringBootApplication
public class ProviderApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.err.println("user name :"+userName+"; age: "+userAge);
    }
}
复制代码
  • 输出:
user name :nacos-config-properties; age: 90
复制代码

yaml文件配置

  • spring-cloud-starter-alibaba-nacos-config支持yaml格式
  • 在应用的bootstrap.properties配置文件中显示的声明dataid文件扩展名:
spring.cloud.nacos.config.file-extension=yaml
复制代码
  • 初始化Nacos,添加一个dataid为yaml扩展名的配置:
Data ID:nacos-config.yaml
Group:DEFAULT_GROUP
配置格式:YAML
配置内容:user.name:nacos-config-yaml
        user.age:68
复制代码
  • 启动:
@SpringBootApplication
public class ProviderApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.err.println("user name :"+userName+"; age: "+userAge);
    }
}
复制代码
  • 输出:
user name :nacos-config-yaml; age: 68
复制代码

配置动态更新

  • spring-cloud-starter-alibaba-nacos-config支持配置的动态更新
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
        while(true) {
            //当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            System.err.println("user name :" + userName + "; age: " + userAge);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}
复制代码
  • 可以在配置文件中关闭动态更新:
spring.cloud.nacos.config.refresh.enabled=false
复制代码

配置profiles粒度

  • spring-cloud-starter-alibaba-nacos-config加载配置时:
    • 不仅仅加载以dataid[spring.application.name].[file-extension:properties] 为前缀的基础配置
    • 还加载dataid[spring.application.name]-[profile].[file-extension:properties] 的基础配置
  • 多环境下的不同配置,可以通过Spring提供的spring.profiles.active这个配置项来配置:
# spring.profiles.active当通过配置文件来指定时必须放在bootstrap.properties文件中
spring.profiles.active=develop
复制代码
  • 初始化Nacos配置:
Data ID:nacos-config-develop.yaml
Group:DEFAULT_GROUP
配置格式:YAML
配置内容:current.env:develop-env
复制代码
  • 启动:
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
        while(true) {
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            //获取当前部署的环境
            String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
            System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}
复制代码
  • 输出:
in develop-env enviroment; user name :nacos-config-yaml-update; age: 68
复制代码
  • 如果需要切换到生产环境,只需要更改spring.profiles.active参数配置:
spring.profiles.active=product
复制代码
  • 在项目实践中这个变量的值是需要不同环境而有不同的值,通常的做法是通过-Dspring.profiles.active=< profile >参数指定其配置来达到环境间灵活的切换

配置自定义namespace

  • Nacos中的namespace:
    • namespace用于进行租户粒度的配置隔离
    • 不同的命名空间下,可以存在相同的GroupData ID的配置
    • namespace常常用于不同环境的配置的区分隔离
  • 在没有明确指定spring.cloud.nacos.config.namespace配置时,默认使用的是NacosPublic这个namespae. 可以通过配置自定义的命名空间:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
复制代码
  • 该配置必须放在bootstrap.properties文件中,此外spring.cloud.nacos.config.namespace的值是namespace对应的id,id值可以在Nacos的控制台获取.并且在添加配置时注意不要选择其余的namespace, 否则将会导致读取不到正确的配置

配置自定义Group

  • 在没有明确指定spring.cloud.nacos.config.group配置的情况下,默认使用的是DEFAULT_GROUP. 可以通过配置自定义Group:
spring.cloud.nacos.config.group=DEVELOP_GROUP
复制代码
  • 该配置必须放在bootstrap.properties文件中,并且在添加配置时Group的值一定要和 spring.cloud.nacos.config.group的配置值一致

配置自定义Data Id

  • Spring Cloud Alibaba Nacos Config支持自定义Data Id的配置,示例如下:
spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties

# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP

# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true
复制代码
  • spring.cloud.nacos.config.extension-configs[n].data-id配置支持多个Data Id的配置
  • spring.cloud.nacos.config.extension-configs[n].group配置自定义Data Id所在的组,不明确配置的话,默认是DEFAULT_GROUP

Guess you like

Origin juejin.im/post/7034122175544197128