暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringCloud 整合Nacos config

李二狗搞程序 2021-08-08
919

引入nacos config依赖

<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>

编写bootstrap.properties 文件内容

spring.application.name=nacosconfig
spring.cloud.nacos.config.server-addr=localhost:8848
${spring.application.name}.${file-extension.properties}

编写nacos config 配置  命名为  nacosconfig.properties

修改StudyNacosConfigApplication 类

package com.jiuge.study;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;


@SpringBootApplication
public class StudyNacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(StudyNacosConfigApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("common.name");
String userAge = applicationContext.getEnvironment().getProperty("common.age");
System.out.println("common name :"+userName+"; age: "+userAge);
}
}

启动,测试, 控制台输出一下内容

common name :fox; age: 33

支持配置的动态更新, 修改启动类

package com.jiuge.study;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.concurrent.TimeUnit;


@SpringBootApplication
public class StudyNacosConfigApplication {
public static void main(String[] args) throws InterruptedException {


ConfigurableApplicationContext applicationContext = SpringApplication.run(StudyNacosConfigApplication.class, args);
while (true) {
String userName = applicationContext.getEnvironment().getProperty("common.name");
String userAge = applicationContext.getEnvironment().getProperty("common.age");
System.err.println("common name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
    }
}

启动,测试, 控制台每隔一秒输出内容

common name :haha; age: 22
common name :haha; age: 22
common name :haha; age: 22
common name :aaaa; age: 23
common name :aaaa; age: 23
common name :aaaa; age: 23
common name :aaaa; age: 23
common name :aaaa; age: 23
common name :aaaa; age: 23

支持profile粒度的配置

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=dev

nacos 注册中心上添加配置  nacosconfig-prod.properties

内容如下

common.name=jiuge
common.age=27

修改bootstrap.properties文件

spring.application.name=nacosconfig
spring.cloud.nacos.config.server-addr=localhost:8848
# 通过 变量扩展名的方式进行命名
#${spring.application.name}.${file-extension.properties}
spring.profiles.active=prod
#profile粒度的配置
${spring.application.name}-${profile}.${file-extension.properties}

变换成yml 配置

spring:
cloud:
nacos:
config:
server-addr: localhost:8848
application:
name: nacosconfig
profiles:
active: prod

在nacos 上配置 nacosconfig-prod.properties

内容如下

common.name=jiuge
common.age=27

控制台输出

common name :小苗; age: 30
common name :小苗; age: 30

支持自定义namespace的配置

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespace。如果需要使用自定义的命名空间,可以通过以下配置来实现:


spring.cloud.nacos.config.namespace=e39f93ae-bcc9-4539-99b8-38b9a9054224

nacos 配置中心上添加命名空间

在新建的命名空间下 新建内容

内容为

common.name=小舞
common.age=19

bootstrap.yml 配置如下

spring:
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224
application:
name: nacosconfig
profiles:
active: dev

测试,验证,控制台输出

common name :小舞; age: 19
common name :小舞; age: 19
common name :小舞; age: 19

支持自定义Group 的配置

Group是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULTGROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 databaseurl 配置和 MQtopic 配置。在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下,默认是DEFAULTGROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:

spring.cloud.nacos.config.group=DEVELOP_GROUP

添加DEVELEOP_GROUP配置

common.name=宁荣荣
common.age=21

修改yml配置

spring:
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224
group: DEVELOP_GROUP
application:
name: nacosconfig
profiles:
active: dev

验证,控制台输出

common name :宁荣荣; age: 21
common name :宁荣荣; age: 21

nacos 配置中心加上 nacosconfig-prod.properties 配置

nacosconfig-prod.properties 的配置内容为

common.name=竹清
common.age=20

修改yml配置


spring:
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224
group: DEVELOP_GROUP
application:
name: nacosconfig
profiles:
active: prod


测试,验证, 控制台输出

common name :竹清; age: 20
common name :竹清; age: 20

支持自定义扩展的Data Id 配置

Data ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

通过自定义扩展的Data Id 配置, 既可以解决多个应用间配置共享的问题, 又可以支持一个应用有多个配置文件

# 自定义 Data Id 的配置
#不同工程的通用配置 支持共享的 DataId
spring.cloud.nacos.config.sharedConfigs[0].data-id= common.yaml
spring.cloud.nacos.config.sharedConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.sharedConfigs[0].refresh=true


# config external configuration
# 支持一个应用多个 DataId 的配置
spring.cloud.nacos.config.extensionConfigs[0].data-id=ext-config-common01.properties
spring.cloud.nacos.config.extensionConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.extensionConfigs[0].refresh=true


spring.cloud.nacos.config.extensionConfigs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extensionConfigs[1].group=REFRESH_GROUP
spring.cloud.nacos.config.extensionConfigs[1].refresh=true

nacos 配置中心添加配置 common.yaml 文件

内容如下

common:
age: 20
name: 小奥

修改bootstrap.yml 配置文件内容为

spring:
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224
shared-configs[0].data-id: common.yaml
shared-configs[0].group: DEFAULT_GROUP
shared-configs[0].refresh: true
application:
name: studyconfig

在nacos 配置中心上添加配置 文件 common-ext.yaml

common:
type: 男生女生
name: helloc

修改bootstrap.yml 配置文件内容为

spring:
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: e39f93ae-bcc9-4539-99b8-38b9a9054224
shared-configs[0].data-id: common.yaml
shared-configs[0].group: DEFAULT_GROUP
shared-configs[0].refresh: true
shared-configs[1].data-id: common-ext.yaml
shared-configs[1].group: REFRESH_GROUP
shared-configs[1].refresh: true
shared-configs[2].data-id: common-share.yaml
shared-configs[2].group: REFRESH_GROUP
shared-configs[2].refresh: true
application:
name: studyconfig

spring启动程序

package com.jiuge.study;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;


import java.util.concurrent.TimeUnit;


@SpringBootApplication
public class StudyNacosConfigApplication {


public static void main(String[] args) throws InterruptedException {


ConfigurableApplicationContext applicationContext = SpringApplication.run(StudyNacosConfigApplication.class, args);
while (true) {
String userName = applicationContext.getEnvironment().getProperty("common.name");
String userAge = applicationContext.getEnvironment().getProperty("common.age");
String ddd = applicationContext.getEnvironment().getProperty("common.type");
String eee = applicationContext.getEnvironment().getProperty("common.name");


System.err.println("common name :" + userName + "; age: " + userAge + ", type=" + ddd + " ; eee:=" + eee);
TimeUnit.SECONDS.sleep(1);
}
}
}

测试,验证,输出

common name :gaogao; age: 20, type=男生女生 ; eee:=gaogao
common name :gaogao; age: 20, type=男生女生 ; eee:=gaogao
common name :gaogao; age: 20, type=男生女生 ; eee:=gaogao

配置的优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

A: 通过 spring.cloud.nacos.config.shared-configs 支持多个共享 Data Id 的配置

B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置

C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:A < B < C

优先级从高到低

优先级从高到低:
1) nacos-config-product.yaml 精准配置
2) nacos-config.yaml 同工程不同环境的通用配置
3) ext-config: 不同工程 扩展配置
4) shared-dataids 不同工程通用配置: common2.yml > common1.yml

@RefershScope 注解

@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解

package com.jiuge.study.controller;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RefreshScope
public class ScopeRefershController {


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


@GetMapping("/common")
public String hello() {
return "name =" + name + ",age = " + age;
}
}

测试,验证

nacos 配置中心的配置如下

common.name=rrw
common.age=12

请求接口  http://localhost:8080/common/      输出

name =rrw,age = 12

修改nacos 的配置

common.name=jiuge   
common.age=18

请求接口  http://localhost:8080/common/   , 输出

name =jiuge ,age = 18


至此,nacos config 的简单的使用就介绍完毕了。

文章转载自李二狗搞程序,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论