02-SpringCloud Alibaba Start-Config
0 Views SpringCloud with
本文字数:2.1k 字 | 阅读时长 ≈ 9 min

02-SpringCloud Alibaba Start-Config

0 Views SpringCloud with
本文字数:2.1k 字 | 阅读时长 ≈ 9 min

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文件。

此页面便是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端)可以是任意的服务。

/**
 * 演示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控制面板进入配置列表页面:

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

注意

导入依赖

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

<?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中项目加载配置文件有一定优先级顺序:

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):

# 这里`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

测试

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

@RestController
public class ConfigController {

    @Autowired
    private ConfigurableApplicationContext applicationContext;

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

注意

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

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

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

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

端口成功获取到。

动态修改

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

为了测试,修改Controller:

@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配置文件修改了,而是因为我们为了测试修改了代码所以必须重启项目。配置文件数据是动态获取的,修改后并不需要重启项目便能得到更新后的数据)

多环境配置

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

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

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

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

# 指定`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文件的配置启动呢?

在IDEA上指定Active profiles即可:

交流

QQGroup:671017003

WeChatGroup: 关注公众号查看

联系

如果这篇文章帮助到了你,你可以请作者喝一杯咖啡