上一篇文章在spring cloud alibaba项目中安装使用了nacos,

spring cloud alibaba (1)-引入nacos进行服务管理

并实现了服务发现功能。这篇文章继续记录nacos配置中心功能。

注:实际操作中,需要热更新的配置才会放到nacos中进行配置管理, 基本不会变更的一些配置还是保存到本地中。

1.统一配置管理

随着微服务越来越多,遇到修改微服务的配置时,需要逐个修改,这样非常浪费时间,然后我们可以使用统一配置管理,这样nacos不仅可以将配置集中管理,而且可以在配置变更时,及时通知微服务,实现配置的热更新。

我们在nacos中添加一个配置文件

创建内容如下:

然后我们创建bootstrap.yml文件,初始配置如下:

spring:
  application:
    name: producer-service-dev # 服务名称
  profiles:
    active: dev #开发环境,这里是dev
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # Nacos作为配置中心地址
        file-extension: yml # 文件后缀名
        group: DEFAULT_GROUP
        prefix: test-nacos



注意,这个地方需要说明一下,bootstrap.yml和application-dev.yml都是配置问文件,主要区别就是bootstrap.yml的加载优先于application-dev.yml,所以你可以在某些文章中看到nacos的discovery的配置也放到bootstrap.yml,这个配置影响不大。

另外就是我们把application.yml 改成了application-dev.yml。这个在实际开发中常用(如果不改也不影响本文测试,因为spring boot会一套匹配机制)。dev表示开发环境,prod表示正式环境。而我们bootstrap.yml中的profiles.activie:dev就表示启用开发环境的配置,也就是优先加载application-dev.yml,如果没有再去尝试加载application.yml这个配置。

2.使用配置信息

我们返回到我们Controller的接口部分,我通过@Value注解来读取nacos的配置信息

package site.longkui.controller;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class userController {

    @Value("${student.name}")
    private String name;


    @GetMapping("/getUser")
    public String getUser() {
        return "I`m producer 1 ,return user-"+name;
    }
}

注意,最好给nacos这些配置信息一个默认值,不然启动的时候读取不到配置,会导致启动失败。

比如改成下面这样:

   @Value("${student.name:小猪佩奇}")

这样,nacos如果读取不到student.name这个值,值就变成默认的“小猪佩奇”了。

启动项目,进行测试。

如果启动项目报错,请参考下面两篇文章解决:

nacos 获取配置提示config data not exist

spring boot 读取nacos配置遇到的问题

3.实现效果

可以看到,正确显示了nacos的配置信息。

4.实现自动刷新

我们希望我们修改nacos的配置信息后,客户端可以自动刷新配置信息,默认情况下是不刷新的。如下图:

我们在代码中需要的地方加入@RefreshScope注解就可以:

package site.longkui.controller;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
@RefreshScope//自动刷新配置
public class userController {

    @Value("${student.name}")
    private String name;


    @GetMapping("/getUser")
    public String getUser() {
        return "I`m producer 1 ,return user-"+name;
    }
}

效果如下:

可以看到,在不用重启的情况下,修改了配置信息。