SpringCloud 整合Nacos config

简介: SpringCloud 整合Nacos config

引入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
目录
相关文章
|
13天前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
76 0
|
2月前
|
NoSQL Java Nacos
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
71 3
|
16天前
|
Cloud Native Java Nacos
Spring Cloud Config、Apollo、Nacos和Archaius对比
这篇文章对比了Spring Cloud Config、Apollo、Nacos和Archaius这四种配置中心的适应场景、优缺点。文中讨论了它们的功能特点,例如Spring Cloud Config的集中化配置管理和动态刷新能力,Apollo的实时配置推送和权限治理,Nacos的服务发现和管理功能,以及Archaius的动态配置更新能力。文章指出选择配置中心应根据项目需求和架构来决定,并提供了一个对比图来帮助读者更直观地理解这些工具的差异。
31 1
Spring Cloud Config、Apollo、Nacos和Archaius对比
|
1月前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
26天前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
|
2月前
|
Java API 开发工具
Spring Boot与Spring Cloud Config的集成
Spring Boot与Spring Cloud Config的集成
|
3月前
|
Java Nacos 微服务
Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册
Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册
|
3月前
|
负载均衡 算法 Nacos
SpringCloud之LoadBalancer自定义负载均衡算法,基于nacos权重
ReactorLoadBalancer接口,实现自定义负载算法需要实现该接口,并实现choose逻辑,选取对应的节点。
257 0
|
3月前
|
Nacos 数据安全/隐私保护
springCloud之nacos服务注册与发现、配置中心
springCloud之nacos服务注册与发现、配置中心
|
14天前
|
移动开发 JavaScript 前端开发
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)
这篇文章介绍了在UniApp H5项目中处理跨域问题的两种方法:通过修改manifest.json文件配置h5设置,或在项目根目录创建vue.config.js文件进行代理配置,并提供了具体的配置代码示例。
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)