springboot读取nacos配置中心配置

官方地址:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html

示例:

项目内容如下:

一、nacos编辑配置文件

  • dataId:cloud.service-platform.media
  • Group:service-platform
  • 配置格式没用,只是增加一点颜色,方便编辑
  • 配置了一个port8081和urlhead=test

  • namespace(tenat):命名空间默认是 public 可以添加 dev prod test (相当于 第一层 互相隔离 每个命名空间下面有自己的组)
  • group:组默认是DEFAULT_GROUP(组相当于一个特定场景 )
  • dataid :相当于文件名 默认下是服务名(在每个分组下面互相隔离)

二、客户端 pom依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.7</version>
        </dependency>

三、配置application.properties

#nacos地址
nacos.config.server-addr=localhost:8848
#命名空间id
nacos.config.namespace=ns-dev
#用户名
nacos.config.username=nacos
#密码
nacos.config.password=nacos

也可以去掉application.properties配置文件,改用从环境变量获取配置中心地址(下面两种方式)

//此代码加载启动类中

//第二种方式    
    /**
     * 动态配置配置中心地址。全局NacosProperties
     * @return Properties
     */
    @Bean
    public Properties globalNacosProperties() {
        Properties properties = new Properties();
        //properties.setProperty("serverAddr",System.getProperty("serverAddr"));//从环境变量获取后放入Properties
        properties.setProperty("serverAddr","localhost:8848");
        properties.setProperty("username","nacos");
        properties.setProperty("namespace","ns-dev");
        properties.setProperty("password","nacos");
        return properties;
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }


//第三种方式
    public static void main(String[] args) {
        //设置环境变量
        System.setProperty("nacos.config.serverAddr","localhost:8848");
        System.setProperty("nacos.config.username","nacos");
        System.setProperty("nacos.config.namespace","ns-dev");
        System.setProperty("nacos.config.password","nacos");

        SpringApplication.run(DemoApplication.class,args);
        System.out.println("启动成功");
    }

四、启动类添加@NacosPropertySource注解

@SpringBootApplication
//设置配置源并开启自动更新
@NacosPropertySource(dataId = "cloud.service-platform.media",groupId = "service-platform",autoRefreshed = true)
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

五、controller通过@NacosValue注解取值

@RestController
public class DemoController {

    //使用@value注解取值,它能取到值,但没有自动更新的功能
    @Value(value = "${urlhead}")
    private String urlhead;
    
    //使用@nacosValue注解获取值,并开启自动更新
    @NacosValue(value = "${urlhead}", autoRefreshed = true)
    private String urlheadAutoRefresh;

    @RequestMapping("/getValue")
    public String getValue() {
        System.out.println("urlhead:"+urlhead);
        System.out.println("urlheadAutoRefresh:"+urlheadAutoRefresh);
        return "";
    }
}

六、测试结果

结果可以看出@NacosValue是可以在nacos配置修改后,读取到新值的。但@Value不行。

客户端底层请求nacos配置的位置:

nacos是通过ClientWorker的getServerConfig方法get请求获取的配置文件信息

中途发生的一些小插曲

经检查发现:nacos客户端会把dataId当作文件名。但是客户端不支持media后缀名的配置文件

通过源码分析,发现nacos只支持四种配置解析器:

所以我们可以自定义类实现ConfigParse接口,然后通过SPI方式把类加进来

因为我dataId后缀名不符合要求,但是文件内容依然是Properties的格式,所以我们可以直接继承DefaultPropertiesConfigParse类即可

//自定义类实现ConfigParse接口
public class DefaultMediaConfigParse extends DefaultPropertiesConfigParse {

    @Override
    public String processType() {
        return "media";
    }
}

SPI步骤:

1、在classpath下创建两层META-INF/services/文件夹,里面添加文件,文件名为接口的全类路径名

注意:不要直接在idea上创建META-INF.services文件夹,因为创建的只是一层

2、在文件中加上实现类的全类路径名

java spi机制参考:https://blog.csdn.net/sumengnan/article/details/113243995

自定义解析器加入集合处源码

ConfigParseUtils类的toProperties方法中,会把自定义的配置解析器加入到默认解析器的properties集合里面。

现在就有五种解析器了,可以识别并解析media文件了!!

完事!
 

猜你喜欢

转载自blog.csdn.net/sumengnan/article/details/113247899