Spring 中使用Nacos配置管理

添加依赖

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-spring-context</artifactId>
    <version>${latest.version}</version>
</dependency>

本文使用的版本为:1.1.1

注:我们在Nacos使用SDK的时候引入了nacos-client依赖,nacos-spring-context默认有nacos-client的依赖,本文示例请勿自己添加Nacos-client依赖,否则后续的示例会有意想不到的错误。

  • 我们Nacos的Java SDK一文中引用的nacos-client版本为2.2.0,nacos-spring-context 1.1.1版本依赖的nacos-client版本为1.4.1所以会有版本差异,会出现方法不存在等错误问题。

Spring使用Nacos的配置模块

package com.yyoo.nacos.spring;

import com.alibaba.nacos.api.annotation.NacosProperties;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "com.yyoo.nacos.sdk.CofingServiceTest",groupId = "Nacos:Test"
        ,autoRefreshed = true,type = ConfigType.JSON)
public class NacosConfiguration {

}
  • @EnableNacosConfig 注解启用 Nacos Spring 的配置管理服务
  • globalProperties全局配置,是使用@NacosProperties注解加载的全局配置
  • @NacosProperties 是全局和自定义 Nacos 属性的统一注解。 它充当Java Properties 和 NacosFactory 类之间的中介。
  • @NacosPropertySource其作用与Spring的@PropertySource作用一样,是读取配置到Spring容器中
  • dataId我们在Nacos中的配置id,groupId我们在Nacos中的groupId。
  • autoRefreshed 为true表示,如果配置修改容器将自动更新配置
  • type即我们的配置的类型,这里是Json类型

Nacos中发布的示例配置

在这里插入图片描述

获取配置的示例

package com.yyoo.nacos.spring;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.stereotype.Controller;

@Controller
public class NacosTestController {

    @NacosValue(value = "${conf1:default}", autoRefreshed = true)
    private String conf1;

    public String getConf1() {
        return conf1;
    }
}

我们模拟了一个Controller,获取Nacos中的conf1配置。

  • @NacosValue 的作用相当于Spring中的@Value
package com.yyoo.nacos.spring.test;

import com.yyoo.nacos.spring.NacosTestController;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class NacosTest {

    @Test
    public void testSpring(){

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.scan("com.yyoo");
        context.refresh();

        NacosTestController controller = context.getBean(NacosTestController.class);
        System.out.println(controller.getConf1());

    }

}

示例代码执行之后,会输出结果:test1

  • 注:本示例需要使用Spring的相关依赖和知识。

示例二

package com.yyoo.nacos.spring.bean;

import com.alibaba.nacos.api.annotation.NacosProperties;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosConfigurationProperties(dataId = "com.yyoo.nacos.sdk.CofingServiceTest",groupId = "Nacos:Test"
        ,autoRefreshed = true,prefix = "my",type = ConfigType.JSON)
public class MyPro {
    private String conf1;

    private String conf2;

    public String getConf1() {
        return conf1;
    }

    public void setConf1(String conf1) {
        this.conf1 = conf1;
    }

    public String getConf2() {
        return conf2;
    }

    public void setConf2(String conf2) {
        this.conf2 = conf2;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("MyPro{");
        sb.append("conf1='").append(conf1).append('\'');
        sb.append(", conf2='").append(conf2).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

Nacos界面修改配置
在这里插入图片描述

    @Test
    public void testSpring2(){

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.scan("com.yyoo");
        context.refresh();

        MyPro pro = context.getBean(MyPro.class);
        System.out.println(pro);

    }

输出结果:MyPro{conf1=‘test1’, conf2=‘test3’}

Nacos配置注解与Spring的配置注解的对应

SpringNacos说明
@Value@NacosValue
@ConfigurationProperties@NacosConfigurationProperties对应字段上可以使用@NacosProperty,@NacosIgnore
@PropertySource@NacosPropertySource
@PropertySources@NacosPropertySources

Nacos的这些注解的主要作用与Spring对应的注解一样

Nacos配置注解说明

全局 Nacos 属性

globalProperties 将初始化为其他注解或组件的 “全局 Nacos 属性”

globalProperties 是任何 @EnableNacos,@EnableNacosDiscovery 或 @EnableNacosConfig 中的必选属性,其类型为 @NacosProperties。示例:@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = “127.0.0.1:8848”))

全局 Nacos 属性 定义全局和默认属性。它设置为具有最低优先级,并且也可以被覆盖。覆盖优先级如下:

优先级配置说明
1*.properties()最高优先级
2@EnableNacosConfig.globalProperties() 或 @EnableNacosDiscovery.globalProperties()
3@EnableNacos.globalProperties()最低优先级

*.properties() 定义来自以下之一的自定义 Nacos 属性:

  • @NacosInjected.properties()
  • @NacosConfigListener.properties()
  • @NacosPropertySource.properties()
  • @NacosConfigurationProperties.properties()

自定义的 Nacos 属性也由 @NacosProperties 配置。 不过,它们是可选的,用于在特殊情况下覆盖全局 Nacos 属性。 如果没有定义,Nacos 属性将尝试从 @EnableNacosConfig.globalProperties() 或 @EnableNacosDiscovery.globalProperties() 或 @EnableNacos.globalProperties() 中查找属性。

配置注解的占位符

占位符直接查看源码就行了,比如查看@NacosProperties的源码

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.alibaba.nacos.api.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NacosProperties {
    String PREFIX = "nacos.";
    String ENDPOINT = "endpoint";
    String NAMESPACE = "namespace";
    String ACCESS_KEY = "access-key";
    String SECRET_KEY = "secret-key";
    String SERVER_ADDR = "server-addr";
    String CONTEXT_PATH = "context-path";
    String CLUSTER_NAME = "cluster-name";
    String ENCODE = "encode";
    String CONFIG_LONG_POLL_TIMEOUT = "configLongPollTimeout";
    String CONFIG_RETRY_TIME = "configRetryTime";
    String MAX_RETRY = "maxRetry";
    String ENABLE_REMOTE_SYNC_CONFIG = "enableRemoteSyncConfig";
    String USERNAME = "username";
    String PASSWORD = "password";
    String ENDPOINT_PLACEHOLDER = "${nacos.endpoint:}";
    String NAMESPACE_PLACEHOLDER = "${nacos.namespace:}";
    String ACCESS_KEY_PLACEHOLDER = "${nacos.access-key:}";
    String SECRET_KEY_PLACEHOLDER = "${nacos.secret-key:}";
    String SERVER_ADDR_PLACEHOLDER = "${nacos.server-addr:}";
    String CONTEXT_PATH_PLACEHOLDER = "${nacos.context-path:}";
    String CLUSTER_NAME_PLACEHOLDER = "${nacos.cluster-name:}";
    String ENCODE_PLACEHOLDER = "${nacos.encode:UTF-8}";
    String CONFIG_LONG_POLL_TIMEOUT_PLACEHOLDER = "${nacos.configLongPollTimeout:}";
    String CONFIG_RETRY_TIME_PLACEHOLDER = "${nacos.configRetryTime:}";
    String MAX_RETRY_PLACEHOLDER = "${nacos.maxRetry:}";
    String ENABLE_REMOTE_SYNC_CONFIG_PLACEHOLDER = "${nacos.enableRemoteSyncConfig:}";
    String USERNAME_PLACEHOLDER = "${nacos.username:}";
    String PASSWORD_PLACEHOLDER = "${nacos.password:}";

    String endpoint() default "${nacos.endpoint:}";

    String namespace() default "${nacos.namespace:}";

    String accessKey() default "${nacos.access-key:}";

    String secretKey() default "${nacos.secret-key:}";

    String serverAddr() default "${nacos.server-addr:}";

    String contextPath() default "${nacos.context-path:}";

    String clusterName() default "${nacos.cluster-name:}";

    String encode() default "${nacos.encode:UTF-8}";

    String configLongPollTimeout() default "${nacos.configLongPollTimeout:}";

    String configRetryTime() default "${nacos.configRetryTime:}";

    String maxRetry() default "${nacos.maxRetry:}";

    String enableRemoteSyncConfig() default "${nacos.enableRemoteSyncConfig:}";

    String username() default "${nacos.username:}";

    String password() default "${nacos.password:}";
}

我想不用做过多的解释

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值