51Testing软件测试论坛

标题: 如何在Spring 中使用Nacos配置管理? [打印本页]

作者: lsekfe    时间: 2023-2-6 14:03
标题: 如何在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
  1.  package com.yyoo.nacos.spring.test;
  2.   import com.yyoo.nacos.spring.NacosTestController;
  3.   import org.junit.Test;
  4.   import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  5.   public class NacosTest {
  6.       @Test
  7.       public void testSpring(){
  8.           AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
  9.           context.scan("com.yyoo");
  10.           context.refresh();
  11.           NacosTestController controller = context.getBean(NacosTestController.class);
  12.           System.out.println(controller.getConf1());
  13.       }
  14.   }
复制代码


示例代码执行之后,会输出结果: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界面修改配置:




  1. @Test
  2.       public void testSpring2(){
  3.           AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
  4.           context.scan("com.yyoo");
  5.           context.refresh();
  6.           MyPro pro = context.getBean(MyPro.class);
  7.           System.out.println(pro);
  8.       }
复制代码

输出结果: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的源码

  1. //
  2.   // Source code recreated from a .class file by IntelliJ IDEA
  3.   // (powered by FernFlower decompiler)
  4.   //
  5.   package com.alibaba.nacos.api.annotation;
  6.   import java.lang.annotation.Documented;
  7.   import java.lang.annotation.ElementType;
  8.   import java.lang.annotation.Retention;
  9.   import java.lang.annotation.RetentionPolicy;
  10.   import java.lang.annotation.Target;
  11.   @Target({ElementType.ANNOTATION_TYPE})
  12.   @Retention(RetentionPolicy.RUNTIME)
  13.   @Documented
  14.   public [url=home.php?mod=space&uid=10061]@interface[/url] NacosProperties {
  15.       String PREFIX = "nacos.";
  16.       String ENDPOINT = "endpoint";
  17.       String NAMESPACE = "namespace";
  18.       String ACCESS_KEY = "access-key";
  19.       String SECRET_KEY = "secret-key";
  20.       String SERVER_ADDR = "server-addr";
  21.       String CONTEXT_PATH = "context-path";
  22.       String CLUSTER_NAME = "cluster-name";
  23.       String ENCODE = "encode";
  24.       String CONFIG_LONG_POLL_TIMEOUT = "configLongPollTimeout";
  25.       String CONFIG_RETRY_TIME = "configRetryTime";
  26.       String MAX_RETRY = "maxRetry";
  27.       String ENABLE_REMOTE_SYNC_CONFIG = "enableRemoteSyncConfig";
  28.       String USERNAME = "username";
  29.       String PASSWORD = "password";
  30.       String ENDPOINT_PLACEHOLDER = "${nacos.endpoint:}";
  31.       String NAMESPACE_PLACEHOLDER = "${nacos.namespace:}";
  32.       String ACCESS_KEY_PLACEHOLDER = "${nacos.access-key:}";
  33.       String SECRET_KEY_PLACEHOLDER = "${nacos.secret-key:}";
  34.       String SERVER_ADDR_PLACEHOLDER = "${nacos.server-addr:}";
  35.       String CONTEXT_PATH_PLACEHOLDER = "${nacos.context-path:}";
  36.       String CLUSTER_NAME_PLACEHOLDER = "${nacos.cluster-name:}";
  37.       String ENCODE_PLACEHOLDER = "${nacos.encode:UTF-8}";
  38.       String CONFIG_LONG_POLL_TIMEOUT_PLACEHOLDER = "${nacos.configLongPollTimeout:}";
  39.       String CONFIG_RETRY_TIME_PLACEHOLDER = "${nacos.configRetryTime:}";
  40.       String MAX_RETRY_PLACEHOLDER = "${nacos.maxRetry:}";
  41.       String ENABLE_REMOTE_SYNC_CONFIG_PLACEHOLDER = "${nacos.enableRemoteSyncConfig:}";
  42.       String USERNAME_PLACEHOLDER = "${nacos.username:}";
  43.       String PASSWORD_PLACEHOLDER = "${nacos.password:}";
  44.       String endpoint() default "${nacos.endpoint:}";
  45.       String namespace() default "${nacos.namespace:}";
  46.       String accessKey() default "${nacos.access-key:}";
  47.       String secretKey() default "${nacos.secret-key:}";
  48.       String serverAddr() default "${nacos.server-addr:}";
  49.       String contextPath() default "${nacos.context-path:}";
  50.       String clusterName() default "${nacos.cluster-name:}";
  51.       String encode() default "${nacos.encode:UTF-8}";
  52.       String configLongPollTimeout() default "${nacos.configLongPollTimeout:}";
  53.       String configRetryTime() default "${nacos.configRetryTime:}";
  54.       String maxRetry() default "${nacos.maxRetry:}";
  55.       String enableRemoteSyncConfig() default "${nacos.enableRemoteSyncConfig:}";
  56.       String username() default "${nacos.username:}";
  57.       String password() default "${nacos.password:}";
  58.   }
复制代码







欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2