nacos实践记录

依赖版本如下:

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2021.0.1.0</version>
</dependency>

     <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.0.1.0</version>
            <exclusions>
                <exclusion>
                    <groupId>springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

配置管理

配置文件

使用nacos配置管理,需要新建一个bootstrap.properties(yaml)配置文件,如果@Value还是取不到值,可能是因为项目没有识别到bootstrap.properties文件,再加上依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.1.0</version>
        </dependency>
取值方式

@Value(“${minutes:61}”) 冒号后面的值可以当作默认值,也就是当取不到配置值的时候就会使用。我是用@NacosValue就一直取不到值的,但是用@Value就可以,不知道是不是版本问题。

配置参数的时候,不要将参数属性设置为静态的,然后在set方法上加上@Value注解,虽然这样是可以取到值的,但是在配置值刷新的时候会有问题。就还是采用 @Value注解放在属性上,通过使用get方法来获取的方式来获取配置值。

在bootstrap.properties中,如果没有指定spring.application.name,也就是对应${prefix}(默认是spring.application.name的值);我原本以为在applicaiton.properties中指定了spring.application.name,而且启动的时候也确实识别出来了,那在bootstrap.properties中不写应该是可以的,但是启动之后是可以取到配置值的,但是在配置值刷新的时候,后台就不会接收到配置,所以也不能不写。

现象如下,我在控制台中已经修改了两个参数的值,但是就是没有拉取到:

在这里插入图片描述

命名空间如果是使用public的话可以用不写,或者写public,但是如果是使用新建的命名空间,在配置文件中就必须使用创建之后生成的随机字符串,不然识别不出来。

配置动态刷新

在两个打印方法的上面分别加上@PostConstruct @PreDestrtoy注解。

@PostConstruct是在构造函数之后执行的;
@PreDestrtoy则是在Bean销毁之前执行的

在这里插入图片描述

在启动项目的时候,可以看见执行了init方法,这个时候day的值是day2217,week的值是week2217;

然后在控制台修改一下值;这个时候后台会有信息打印出来:

在这里插入图片描述

可以看到调用了destory方法,但是这个时候打印出来的值还是修改以前的,并且也可以知道是哪些配置值做了修改;

接着在页面调用访问配置值的方法,后台会继续打印信息:

在这里插入图片描述

有调用了一遍init方法,这个时候打印出来的值才是修改过后的值。

在使用@RefreshScope注解监听到配置发生了变化之后,会先销毁对象,然后在要使用到配置属性的时候再去初始化对象。

也就是在配置发生变化的时候是会去调用对象的生命周期的方法。

在项目中加入一段代码:

    @Bean
    public ApplicationRunner runner() {
        return args -> {
            String dataId = "one-provider.properties";
            String group = "testGroup1";
            manager.getConfigService().addListener(dataId, group, new AbstractListener() {
                @Override
                public void receiveConfigInfo(String s) {
                    log.info("监听到的内容是:{}", s);
                }
            });
        };
    }

然后重新启动之后,再修改一下配置值,后台打印如下:

在这里插入图片描述

自定义的监听器在配置发生变化之后监听到的是一个字符串,这个字符串包含的是我在这个dataId和group里配置的所有配置。获取到这个配置之后就可以将这个字符串的内容转换为对象,@RefreshScope的作用应该就和这个过程是类似的。

在nacos中可以直接用spring.cloud.nacos.config.name来指定dataId,也就说在bootstrap.properties中写spring.application.name和spring.cloud.nacos.config.file-extension,以及spring.profiles.active。直接用spring.cloud.nacos.config.name就行。

因为在不同的namespace中,dataId是可以相同的,所以可以用namespace来区分不同的环境,开发环境,测试环境,生产环境。

服务发现

spring.cloud.n acos.discover y.service配置是用来配置服务名称的,默认值是spring.application.name配置的值,

spring.cloud.nacos.discovery.weight是配置权重的,数字越大,权重越大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值