51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 819|回复: 0

[原创] 如何在Spring 中使用Nacos配置管理?

[复制链接]
  • TA的每日心情
    无聊
    半小时前
  • 签到天数: 919 天

    连续签到: 1 天

    [LV.10]测试总司令

    发表于 2023-2-6 14:03:18 | 显示全部楼层 |阅读模式
    添加依赖
    <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.   }
    复制代码


    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-3-29 09:53 , Processed in 0.064850 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表