Spring Cloud使用Nacos作为服务配置中心

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

创建一个config服务

(1)新建一个config服务,在pom文件中添加必要依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.7.RELEASE</version>
</parent>

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

<dependencyManagement>
<dependencies>
<!--Spring cloud Hoxton.SR4-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring cloud alibaba 2.2.2.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

(2)在配置文件指定config地址等信息

注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件

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

1
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
1
2
3
4
5
6
7
8
9
10
11
12
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上新建的配置文件后缀相同,否则读不到

(3)在nacos客户端配置管理新建一个配置

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}
  • 配置内容:根据你的配置格式按对应的格式填写即可

(4)在config服务中获取配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@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接口,会发现响应的是修改后的内容。

配置自定义的命名空间

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

在没有明确指定命名空间配置的情况下,默认使用的是NacosPublic这个Namespace

首先我们在Nacos服务端新建一个命名空间:

Nacos新建命名空间

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

1
2
3
4
5
spring:
cloud:
nacos:
config:
namespace:

多环境配置的三种方式

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

通过Data ID 和profiles实现

可以在配置文件中指定spring.profiles.active = **,然后在Nocas服务端新建对应的${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}配置来区分不同的环境。

通过Group实现

可以为不同的环境新建不同的分组,然后的配置文件中指定spring.cloud.nacos.config.group=组名,这样也可以实现不同环境的区分。

通过Namespace实现

这种方式是官方建议的方式,在Nacos客户端中新建不同的分组,然后再配置文件中指定namespace就可以区分不同的环境。

自定义扩展的Data ID

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

(1)在Nacos中新建两个Data ID分别是log.yamlfile.yaml的文件

我们在配置文件中分别加入以下内容:log:level: 2file:url: "http://www.appblog.cn"

(2)如何配置

1
2
3
4
5
6
7
8
9
10
11
12
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,官方推荐使用如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
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

(3)深入思考,既然我们有两个配置文件,假如两个配置文件中出现一样的key值,这样我们程序中会加载哪个配置呢

其实Nacos在设计的时候也考虑到了优先级问题,下面我们一起来看看。

我们将file.yaml中的配置改成log:level: 22。写个接口取一下配置,看看它取到的是哪个文件的内容。

1
2
3
4
5
6
7
8
9
10
11
@RefreshScope
class TestController {

@Value("${log.level}")
private String log;

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

Nacos公共配置优先级测试

结果取到的是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

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2021 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :