Spring 中使用Nacos配置管理

这篇具有很好参考价值的文章主要介绍了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中发布的示例配置

Spring 中使用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界面修改配置
Spring 中使用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的配置注解的对应

Spring Nacos 说明
@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:}";
}

我想不用做过多的解释文章来源地址https://www.toymoban.com/news/detail-402441.html

到了这里,关于Spring 中使用Nacos配置管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Cloud】关于Nacos配置管理的详解介绍

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一起

    2024年02月01日
    浏览(48)
  • Spring Cloud - Nacos 配置统一管理、热部署、多环境配置共享

    目录 一、Nacos 配置统一管理 1.1、启动 Nacos 服务 1.2、Nacos 新建配置 1.3、引入依赖 1.4、Nacos 地址读取   1.5、演示效果 二、Nacos 配置热部署 三、多环境配置共享 在当前文件下打开终端,输入如下指令启动 nacos 服务 访问 nacos 主页,点击配置管理查看配置列表,然后新建配置

    2024年02月10日
    浏览(52)
  • SpringBoot相比于Spring的优点(自动配置和依赖管理)

    我们先看一下我们Spring整合Druid的过程,以及我们使用SpringBoot整合Druid的过程我们就知道我们SpringBoot的好处了。 Spring方式 Spring方式分为两种,第一种就是我们使用xml进行整合,第二种就是使用我们注解进行简化 xml方式 (1)导入坐标  (2)书写jdbc.properties文件和  applicati

    2024年02月08日
    浏览(59)
  • 《Spring Cloud学习笔记:Nacos配置管理 & OpenFeign & LoadBalancer & Getway》

    基于Feign的声明式远程调用(代码更优雅),用它来去代替我们之前的RestTemplate方式的远程调用 首先我们来看一下,微服务架构下关于配置文件的一些问题: 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不

    2024年02月04日
    浏览(52)
  • 【Spring Cloud】深入理解 Nacos 的统一配置管理,配置热更新,多环境配置共享,集群搭建

    在微服务架构中,配置管理是一个至关重要的问题。随着系统规模的扩大,配置的管理和更新变得更加繁琐。Nacos 作为一个全能的服务发现和配置管理平台,为解决这一问题提供了全方位的支持。在本文中,我们将深入理解 Nacos 的配置管理,包括配置的统一管理、热更新、多

    2024年02月02日
    浏览(135)
  • Spring Cloud Day2 Nacos配置管理、Feign远程调用与Gateway服务网关

    Nacos除了可以做注册中心,同样可以做配置管理来使用。 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以

    2024年02月10日
    浏览(66)
  • Spring Boot 中 Nacos 配置中心使用实战

    https://nacos.io/zh-cn/docs/quick-start-spring-boot.html 我的spirngboot版本为2.5.6 由于我没有配置namespace,默认的事public,因此我在配置里面加了下面这条配置导致错误 应该使用 命名空间ID ,此处有很多人踩坑,后来者一定要注意哦。

    2024年02月10日
    浏览(50)
  • Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC

    Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的 反射机制 。简单来说, 反射机制指的是程序在运行时能够获取自身

    2024年02月09日
    浏览(62)
  • 【Spring循环依赖的解决】The dependencies of some of the beans in the application context form a cycle

    启动报错: The dependencies of some of the beans in the application context form a cycle: 两个类相互引用对方,导致Spring在初始化bean的时候不知道先初始化哪个,从而形成循环依赖注入。 类A依赖类B,类B也依赖类A,这种情况就会出现循环依赖。 Bean A → Bean B → Bean A 上面是比较容易发现的

    2024年02月08日
    浏览(48)
  • 【Spring循环依赖报错】The dependencies of some of the beans in the application context form a cycle

           类A需要通过构造函数注入的类B的实例(或者B中声明的Bean),而类B需要通过构造函数注入的类A的实例(或者A中声明的Bean),导致循环依赖注入。 其中一个不要引用对方,避免循环依赖,代码解耦肯定是最优解。 选择其中一个使用@Lazy 注解。        延迟互相

    2024年02月07日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包