五、SpringCloud alibaba 之 nacos配置中心

https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

5.1、创建配置文件

进去Nacos的服务端,在服务端的配置管理 功能里面的配置列表 里面创建一个配置文件

在创建配置文件时,要填写dataId

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。

  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。

创建的配置文件内容如下:

 

5.2、配置nacos客户端

入门示例

在5.1中 在nacos的服务端配置好文件之后,需要在客户端读取配置文件的内容。首先在application.propertis或者application.yml中连接nacos的服务端。

server.port=8083
#配置的dataId的prefix, 默认读取的是spring.application.name的值,也可以通过spring.cloud.nacos.config.prefix来配置
spring.application.name=test
# nacos服务端地址
spring.cloud.nacos.server-addr=localhost:8848

创建一个配置类

@Data
@Component
@ConfigurationProperties(prefix = "user")
public class UserProperties {
    private String name;
    private String password;
}

创建一个controller类

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


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

    @Autowired
    private UserProperties userProperties;

    @RequestMapping("/getUserName")
    public String getUserName(){
         System.out.println(userProperties);
        System.out.println(userName);
         return "success";
    }
}

运行结果

把配置文件中的user.name的值改成李四,运行结果

我们可以看到通过UserProperties配置类接收的配置信息更新了,但是在UserController类中通过@Value接收的配置信息没有更新。

如果想要UserController类中通过@Value接收的配置信息也实时更新,需要在类是添加@RefreshScope注解,因此我们建议nacos配置类的配置信息尽量采取配置类和@ConfigurationProperties结合的方式来接收。

 

共享配置

本笔记采取的是spring cloud alibaba版本是2.2.6.RELEASE,springboot版本是2.3.2.RELEASE,因此该配置必须放在 bootstrap.properties 文件中才会生效,放在application配置文件中是不生效的。关于这部分详细的设计可参考 这里。 一个完整的配置案例如下所示

# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=test1

# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=test2
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP

# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=test3
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true

可以看到:

  • 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式来支持多个 Data Id 的配置。

  • 通过 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。

  • 通过 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等

在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespace。如果需要使用自定义的命名空间,可以通过以下配置来实现:

spring.cloud.nacos.config.group=DEVELOP_GROUP

该配置必须放在 bootstrap.properties 文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group 的配置值一致。

application与bootstrap的优先级

我们要在微服务拉取共享配置。将拉取到的共享配置与本地的application.yaml配置合并,完成项目上下文的初始化。

不过,需要注意的是,读取Nacos配置是SpringCloud上下文(ApplicationContext)初始化时处理的,发生在项目的引导阶段。然后才会初始化SpringBoot上下文,去读取application.yaml

也就是说引导阶段,application.yaml文件尚未读取,根本不知道nacos 地址,该如何去加载nacos中的配置文件呢?

SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml(或者bootstrap.properties)的文件,如果我们将nacos地址配置到bootstrap.yaml中,那么在项目引导阶段就可以读取nacos中的配置了。

posted @ 2024-04-03 22:15  阿瞒123  阅读(166)  评论(0编辑  收藏  举报