Spring 中使用Nacos配置管理

发表于:2023-2-06 09:23

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:没事儿写两篇    来源:CSDN

  添加依赖
  <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的配置注解的对应
  Nacos的这些注解的主要作用与Spring对应的注解一样。
  Nacos配置注解说明
  全局 Nacos 属性
  globalProperties 将初始化为其他注解或组件的 “全局 Nacos 属性”。
  globalProperties 是任何 @EnableNacos,@EnableNacosDiscovery 或 @EnableNacosConfig 中的必选属性,其类型为 @NacosProperties。示例:@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = “127.0.0.1:8848”))
  全局 Nacos 属性 定义全局和默认属性。它设置为具有最低优先级,并且也可以被覆盖。覆盖优先级如下:
  *.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:}";
  }
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号