分布式应用配置管理

分布式应用配置管理

发布配置

启动nacos,在dev下发布配置

service1

namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a # 开发环境
Data ID: service1.yaml 
Group : test_group 
配置格式: YAML 
配置内容: 
	common: name: service1 config

service2

namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a # 开发环境
Data ID: service2.yaml 
Group : test_group 
配置格式: YAML 
配置内容: 
	common: name: service2 config
构建项目获取配置

不同项目,可以获取nacos上不同的配置文件

创建一个springboot父工程nacos-config,添加依赖

nacos-config版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。

<!--父工程打包方式-->
<packaging>pom</packaging>


<!--子项目要在module里-->
<modules>
    <module>service1</module>
    <module>service2</module>
</modules>


<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>

子springboot项目service1

1.pom.xml

<!--父项目为nacos-config-->
<parent>
    <artifactId>nacos-config</artifactId>
    <groupId>com.example</groupId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

2.配置文件:bootstrap.yml

配置文件的优先级:

bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

application 作用域在于 当前应用有效
bootstrap 系统级别的配置有效(一般采用远程配置的时候才会用到)

server:
  port: 56010
spring:
  application:
    name: service1
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a # 不指定,就是public下的
        file-extension: yaml
        group: test_group
        # 配置动态刷新,默认就是true
        refresh-enabled: true

3.接口获取配置

@RefreshScope不能配置在启动类上,无效果。

@RestController
@RefreshScope
public class TestController {

    //动态刷新方式1
    @Autowired
    private ConfigurableApplicationContext applicationContext;

    @Value("${common.name}")
    private String config;

    //动态刷新方式2 @RefreshScope注解
    @GetMapping("getConfig")
    public String getConfig(){
        return config;
    }

    @GetMapping("getConfig1")
    public String getConfig1(){
        return applicationContext.getEnvironment().getProperty("common.name");
    }
}

4.访问测试

不同项目会获取到不同的配置

nacos管理界面修改yaml后,不用重启项目,直接请求接口,配置会自动刷新

扩展配置dataId

一个项目要用到多个nacos配置文件怎么办?

nacos发布两个配置

# 配置一
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a # 开发环境
Data ID: ext.config01.properties 
Group : ext_group 
配置格式: properties  
配置内容: 
	common.age=18888
	common.address=beijing
	
# 配置2
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a # 开发环境
Data ID: ext.config02.properties 
Group : ext_group 
配置格式: properties  
配置内容: 
    common.age=288
    common.address=shanghai
    common.string=jpy

bootstrap.yml

server:
  port: 56010
spring:
  application:
    name: service1
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a
        file-extension: yaml
        group: test_group
        # 是否自动刷新配置true,默认true
        refresh-enabled: true
        # 这里加载了另外两个配置文件
        extension-configs:
          - data-id: ext.config01.properties
            group: ext_group
            refresh: true
          - data-id: ext.config02.properties
            group: ext_group
            refresh: true

Test.java

//多个配置文件中如果只有一个common.age直接返回
//有多个common.age,主配置(service1.yaml)中有就返回主配置的
//扩展配置中有多个commn.age,则返回bootstrap.yml中扩展配置中最后一个中的common.age

@RestController
@RefreshScope
public class TestController {
    
    //多个配置文件中如果只有一个common.age直接返回
    //有多个common.age,主配置中有就返回主配置的
    //扩展配置中有多个commn.age,则返回bootstrap.yml中扩展配置中最后一个中的common.age
    @Value("${common.age}")
    private String extConfigAge;

    //获取扩展配置
    @GetMapping("getExtConfigAge")
    public String getExtConfigAge(){
        return extConfigAge;
    }

    @Value("${common.string}")
    private String extConfigString;

    @GetMapping("getExtConfigName")
    public String getExtConfigName(){
        return extConfigString;
    }
}

总结配置优先级:项目名.yaml > 扩展dataId(越靠下越优先)> shar-dataids

关闭配置

bootstrap.yml

spring:
  cloud:
    nacos:
      config:
        enabled: false # 关闭配置
posted @   jpy  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2021-01-25 MQ概述
2021-01-25 缓存穿透,击穿,雪崩
2021-01-25 Redis操作数据命令
点击右上角即可分享
微信分享提示