02-SpringCloud Alibaba Start-Config

Spring Cloud Alibaba Start

Spring Cloud Alibaba入门

开源地址:https://github.com/TyCoding/spring-learn/tree/master/cloud-alibaba-start 欢迎star、fork支持作者

Intruduction

在学习SpringCloud Alibaba之前,你应该具有SpringCloud项目开发经验,那么学习起来将很轻松。如果读者对SpringCloud不是很熟悉,请移步看我的这个SpringCloud基础项目:https://github.com/TyCoding/cloud-template

Spring Cloud Alibaba官方介绍:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

这里不再赘述,直接开始实战。

Nacos Config

在上一篇文章中 https://github.com/TyCoding/spring-learn/blob/master/cloud-alibaba-start/docs/01.Nacos-install.md 我们讲到了如何安装和部署Nacos服务注册与发现。在SpringCloud开发阶段,我们使用spring-cloud-config-依赖安装SpringCloud Config服务端和客户端,当每个服务都引入了spring-cloud-config-client依赖就表示该服务作为Config客户端可以冲Config服务端通过API接口直接拿到Config文件;Config Server端则需需要引入spring-cloud-config-server依赖,作为一个单独的服务,管理各个服务的Config文件,并且支持Git、Local本地存储。

那么在今天我们学习了Spring Cloud Alibaba,使用Nacos作为服务注册与发现,就不需要再手动配置Config Server了。Nacos已经提供了Config Server,可以直接在Nacos控制面板新建Config文件,我们的项目则通过连接Nacos而拿到Nacos存储的指定Config文件。

image-20200626085954049

此页面便是Config的管理页面,在右侧可以新建Config文件。下面我将新建cloud-alibaba-start-nacos-config项目讲解如何使用Nacos Config。

cloud-alibaba-start-nacos-config

注意:

和学习SpringCloud类似,如果你想让该服务的Config存储在Naco Config上,那就是说该服务不需要再配置Config,需要在Nacos控制面板上新建Config文件,该服务仅需配置如何连接到Nacos上指定的Config文件,这样该项目启动时就直接从Nacos上获取Config文件。

这里创建的cloud-alibaba-start-nacos-config仅是用来演示,该项目作为Config的Client端(Nacos作为Config的Server端)可以是任意的服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 演示Nacos配置中心客户端端
*
* @author tycoding
* @date 2020/6/22
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApplication {

public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}

Nacos-Config

启动Nacos后,在Nacos控制面板进入配置列表页面:

image-20200626091108014

选择新建配置,并按照cloud-alibaba-start-nacos-provider服务的application.yml创建cloud-alibaba-start-nacos-config服务的配置:

image-20200626091722107

注意

  • Data ID选项代表配置文件名称,可以随便填,但后缀格式需要和配置格式选项相同。并且后续cloud-alibaba-start-nacos-config需要根据该名称连接到该配置文件。
  • 配置内容选项按照之前cloud-alibaba-start-nacos-providerapplication.yml填写,注意修改服务名称name、端口port,而此时的server-addr仍然填写你连接Nacos的IP端口。

image-20200626092214270

导入依赖

创建cloud-alibaba-start-nacos-config并写入pom.xml

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
34
35
36
37
38
39
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>cn.tycoding</groupId>
<artifactId>cloud-alibaba-start-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>

<artifactId>cloud-alibaba-start-nacos-config</artifactId>
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

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

这里仅多了spring-cloud-starter-alibaba-nacos-config(注意此依赖groupIdcom.alibaba.cloud,在一些文档中使用的低版本可能是org.springframework.cloud)。导入了此依赖,那么此项目将作为Nacos Config的Client端。

Config

上面是在Nacos Config上的写配置文件(Config Servr端),下面需要在本地项目中使用这个配置文件(Config Client端)。在开始写之前,需要搞清楚一个概念:

SpringBoot项目中经常见到application.ymlapplication.propertiesbootstrap.yml等文件,你会发现这些配置文件命名都是固定的,而在SpringBoot中项目加载配置文件有一定优先级顺序:

1
bootstrap.properties > bootstrap.yml > application.properties > application.yml

可见,application.yml文件的优先级最低,bootstrap.properties的优先级最高。那么如果你在application.yml中配置了server.port=8080,而在bootstrap.properties中配置了server.port=8081,你的SpringBoot项目将按照8081端口启动,application.yml中的配置可能永远无法生效。

创建bootstrap.properties,此文件用于连接Nacos上指定的Config文件(也就是我们刚才创建的nacos-config.yaml):

1
2
3
4
5
6
# 这里`name`应该和Nacos Config指定配置中服务名称`spring.application.name`相同
spring.application.name=nacos-config
# 指定配置文件后缀
spring.cloud.nacos.config.file-extension=yaml
# Nacos Server
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  • 此处的application.name不再代表应用名称,而是Nacos上指定Config文件的名称。
  • 同理,config.file-extension就是Nacos上指定Config文件的后缀名。
  • config.server-addr代表Nacos连接的IP端口(必须连接到Nacos才能得到其存储的Config文件)。

image-20200626093517565

测试

创建Controller,提供一个测试接口:

1
2
3
4
5
6
7
8
9
10
11
@RestController
public class ConfigController {

@Autowired
private ConfigurableApplicationContext applicationContext;

@GetMapping("/config")
public String config() {
return applicationContext.getEnvironment().getProperty("server.port");
}
}

注意

在之前获取配置文件中的信息,比如获取服务端口号采用:

1
2
@Value("${server.port}")
private String port;

SpringBoot识别了@Value("${server.port}")将自动把server.port装配到port变量中,那是因为项目的配置文件在本地resources目录下。而在本项目中,配置文件存储在Nacos上,因此必须要从ConfigurableApplicationContext对象中获取配置文件信息(项目启动时会从Nacos获取配置文件并装配到这个上下文对象中)。

启动该项目,访问:localhost:8083/config

image-20200626094439170

端口成功获取到。

动态修改

将配置文件放在云端(Nacos)的一大好处就是可以动态修改(此时本地项目作为Config Client端实时从Nacos上更新Config文件信息)。那我们修改Nacos上nacos-config.yaml新增一个节点:

image-20200626094757062

为了测试,修改Controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
public class ConfigController {

// 从Spring上下文环境中获取配置信息,保证配置实时更新
@Autowired
private ConfigurableApplicationContext applicationContext;

@GetMapping("/config")
public String config() {
return applicationContext.getEnvironment().getProperty("server.port")
+ ", author: "
+ applicationContext.getEnvironment().getProperty("author");
}
}

因为修改了代码,肯定要重启项目(这里重启并不是因为Nacos配置文件修改了,而是因为我们为了测试修改了代码所以必须重启项目。配置文件数据是动态获取的,修改后并不需要重启项目便能得到更新后的数据)

image-20200626095116569

多环境配置

开发SpringBoot项目时,你也可能经常遇到resources下有application.ymlapplication-dev.ymlapplication-prod.yml等配置,其实根据后缀你大概能猜到:

  • -dev 代表开发环境
  • -prod 代表生产环境

这其实并不能说是写死固定的,后缀名称你可以自定义,因为最后还是需要在spring.profiles.active中指定后缀,仅需要按照application-x.yml这种格式命名即可,他识别是最后一个-紧挨的名称。

在Nacos控制面板新建nacos-config-prod.yaml文件,年内容和nacos-config.yaml一样,为了测试我们仅修改端口号即可:

image-20200626100013377

image-20200626100143715

在该项目resources下创建bootstrap-prod.properties

1
2
3
4
5
6
# 指定`active-prod`表示启用生产环境配置,
spring.profiles.active=prod
# 因为此文件与之前区别仅是增加`-prod`,因此文件名称前面的部分不变,服务名称也不需要改变
spring.application.name=nacos-config
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

仅多了spring.profiles.active=prod指定配置文件后缀。

以上我们创建了一个prod环境的配置文件,那么如何让项目按照prod文件的配置启动呢?

image-20200626100515826

在IDEA上指定Active profiles即可:

image-20200626100609652

交流

QQGroup:671017003

WeChatGroup: 关注公众号查看

联系

TyCoding wechat
欢迎关注公众号:程序员涂陌
如果你觉得这篇文章帮助到了你,你可以帮作者买一杯果汁表示鼓励

TOP