Spring Cloud Alibaba系列(二)nacos做为服务配置中心

Nacos 提供用于存储配置和其余元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您能够在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。java

首先咱们来看一下,微服务架构下关于配置文件的一些问题:git

  1. 配置文件相对分散,在一个微服务架构中,配置文件会随着微服务的增多变得愈来愈多,并且分散在各个微服务中,很差统一管理和配置。
  2. 配置文件没法区分环境,微服务项目可能会有多个环境,例如:开发环境、预发布环境、生成环境。每一个环境所使用的配置理论上都是不一样的,一旦须要修改,就须要咱们去各个微服务下手动维护,这比较困难。
  3. 配置文件没法实时更新,咱们修改好了配置文件以后,必须从新启动微服务才能使配置文件生效,这对一个正在运行的项目来讲是很是不友好的。

基于上面这些问题,咱们就须要引入配置中心来解决。github

建立一个config服务

  1. 新建一个config服务,在pom文件中添加必要依赖
<parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.2.5.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <dependencyManagement>
    <dependencies>
      <!--Spring cloud Hoxton.SR3-->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR3</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--Spring cloud alibaba 2.1.0.RELEASE-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.2.1.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
  </dependencies>
  1. 在配置文件指定config地址等信息
    注意:不能使用原来的application.yml做为配置文件,而是新建一个bootstrap.yml做为配置文件

配置文件加载的优先级(由高到低)spring

bootstrap.properties ->bootstrap.yml -> application.properties -> application.ymlbootstrap

server:
  port: 9002
spring:
  profiles:
    active: dev
  application:
    name: nacos-config-server
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 # 配置中心
        file-extension: yaml # 这里指定的文件格式须要和nacos上新建的配置文件后缀相同,不然读不到
  1. 在nacos客户端配置管理新建一个配置

  • Data ID:默认为 ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} 或 ${spring.application.name}.${spring.cloud.nacos.config.file-extension}
  • Group:对应配置文件中的${spring.cloud.nacos.config.group},默认为DEFAULT_GROUP
  • 配置格式:对应配置文件中的${spring.cloud.nacos.config.file-extension},
  • 配置内容:根据你的配置格式按对应的格式填写便可。
  1. 在config服务中获取配置信息
@SpringBootApplication
public class NacosConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigServerApplication.class, args);
    }
    @RestController
    class TestController {

        @Value("${config.info}")
        private String config;

        @GetMapping("/test")
        public String hello() {
            return config;
        }

    }
}

咱们经过@Value注解能够获取到配置中心的值。服务器

@RefreshScope动态刷新配置

在TestController上加个@RefreshScope注解,而后咱们去nacos客户端手动修改config.info的信息,而后从新调用这个/test接口,会发现响应的是修改后的内容。架构

配置自定义的命名空间

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

在没有明确指定命名空间配置的状况下, 默认使用的是 Nacos 上 Public 这个namespae。分布式

首先咱们在nacos客户端新建一个命名空间,spring-boot

而后咱们在配置文件中新增下面这个属性,具体的值填写咱们新增命名空间的ID,这样启动config服务后,就会自动去这个命名空间下寻找对应的配置文件了。

spring:
  cloud:
    nacos:
      config:
        namespace:

多环境配置的三种方式

最开始的时候咱们也说过微服务项目会有多个环境,咱们如何实现和管理这些环境呢?

1.经过Data ID 和profiles实现

咱们能够在配置文件中指定spring.profiles.active = **,而后在nocas客户端新建对应的${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}配置来区分不一样的环境。

2.经过Group实现

咱们能够为不一样的环境新建不一样的分组,而后的配置文件中指定spring.cloud.nacos.config.group=组名,这样也能够实现不一样环境的区分。

3.经过Namespace实现

这种方式是官方建议的方式,在nacos客户端中新建不一样的分组,而后再配置文件中指定namespace就能够区分不一样的环境了。

自定义扩展的Data ID

大多数时候咱们可能更加倾向于将不一样的配置分开写到不一样的配置文件中,好比我想把文件类和日志类的配置拆分开写到两个配置中,nacos也是支持这种写法的。

  1. 咱们在nacos中新建两个Data ID 分别是log.yaml 和 file.yaml 的文件。

咱们在配置文件中分别加入如下内容:log:level: 2,file:url: "http://123.com"。

  1. 如何配置呢
spring:
  cloud:
    nacos:
      config:
        extension-configs[0]:
          data-id: log.yaml
          group: DEFAULT_GROUP   # 默认为DEFAULT_GROUP
          refresh: true   # 是否动态刷新,默认为false
        extension-configs[1]:
          data-id: file.yaml
          group: DEFAULT_GROUP
          refresh: true

为了更加清晰的在多个应用间配置共享的 Data Id,官方推荐使用以下配置:

spring:
  cloud:
    nacos:
      config:
        shared-configs[0]:
          data-id: log.yaml
          group: DEFAULT_GROUP   # 默认为DEFAULT_GROUP
          refresh: true   # 是否动态刷新,默认为false
        shared-configs[1]:
          data-id: file.yaml
          group: DEFAULT_GROUP
          refresh: true
  1. 深刻思考,既然咱们有两个配置文件,假如两个配置文件中出现同样的key值,这样咱们程序中会加载哪一个配置呢,其实nacos在设计的时候也考虑到了优先级问题,下面咱们一块儿来看看。

咱们将file.yaml中的配置改为log:level: 22。这时候咱们加载写个接口取一下配置。看看它取到的是哪一个文件的内容。

RestController
    @RefreshScope
    class TestController {
        
        @Value("${log.level}")
        private String log;

        @GetMapping("/test")
        public String hello() {
            return "log.lelve="+log;
        }

    }

结果取到的是file.yaml中的配置,这是由于多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高。

注意:spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又能够支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。

扩展:不一样方式配置加载优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

  • A: 经过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
  • B: 经过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
  • C: 经过内部相关规则(spring.cloud.nacos.config.prefixspring.cloud.nacos.config.file-extensionspring.cloud.nacos.config.group)自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:A < B < C

代码示例

相关文章
相关标签/搜索