菜单

Juning
发布于 2020-10-26 / 1376 阅读
2
0

九、Spring Cloud Alibaba 服务配置

Spring Cloud Alibaba 服务配置

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。

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

Spring Cloud Alibaba Nacos Config 是 Spring Cloud Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。

在Nacos控制台中创建配置文件

在 Nacos Server 中创建配置文件,Nacos创建配置文件格式支持TEXT、JSON、XML、YAML、HTML、Properties,我们采用 YAML 的方式部署配置文件,操作流程如下:

  • 浏览器打开 http://localhost:8848/nacos ,访问 Nacos Server的配置管理 --> 配置列表,点击新建配置文件,此处我们以之前创建的idreamyou4cloud-upms为例:

image.png

image.png

  • 发布成功后在 “配置列表” 一栏即可看到刚才创建的配置项:

image.png

Nacos Config 客户端的使用

此处我们以之前创建的 idreamyou4cloud-upms 项目为例,在 pom.xml 中增加 org.springframework.cloud:spring-cloud-starter-alibaba-nacos-config 依赖

<!--nacos配置-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

完整的 pom.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>idreamyou4cloud</artifactId>
        <groupId>cn.idreamyou</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>idreamyou4cloud-upms</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <!--web 模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--注册中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

在资源目录新建bootstrap.yml配置文件,然后删除之前创建的application.yml配置文件,由于已经在服务端配置,此处不再赘述,完整的配置文件如下:

spring:
  application:
    # 应用名称,对应 Nacos Config 中的 Data ID,实际应用名称以配置中心的配置为准,这里采用Maven项目的模块名
    name: @artifactId@
  cloud:
    nacos:
      # 注册重新nacos的地址
      server-addr: localhost:8848
      config:
        # 指定查找名为 idreamyou4cloud-upms.yaml 的配置文件
        file-extension: yaml
        # Nacos Server 的地址
        server-addr: ${spring.cloud.nacos.server-addr}

注意:Spring Boot 配置文件的加载顺序依次为 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,其中 bootstrap.properties 配置为最高优先级

启动应用程序

启动应用后我们可以通过日志看到,已经成功加载到了配置文件:

image.png

配置的动态更新

Nacos Config 也支持配置的动态更新,操作流程如下:

  • 修改服务端配置,增加一个 user.name 的属性

image.png

  • 修改 Controller ,增加一个请求方法,测试配置更新效果:
package cn.idreamyou.idreamyou4cloud.upms.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * nacos服务提供者
 *
 * @author juning
 * @date 2020/9/14
 */
@RestController
// 自动刷新配置文件
@RefreshScope
public class NacosProviderController {

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

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

    @GetMapping(value = "/test/{message}")
    public String test(@PathVariable String message) {
        return "Hello Nacos Discovery " + message + " i am from port " + port + " username " + username;
    }

}

image.png

  • 修改服务端配置:

image.png

此时观察控制台日志,你会发现我们已经成功刷新了配置:

image.png

  • 刷新浏览器,浏览器显示:

image.png

注意:

实现自动刷新的方法有两种,一种是本文所用的@RefreshScope注解,第二种是通过从上下文中读取配置,如果只是使用@Value("${user.name}"),配置不会刷新;通过从上下文中读取配置代码如下:

    // 注入配置文件上下文
    @Autowired
    private ConfigurableApplicationContext applicationContext;

    @GetMapping(value = "/test1/{message}")
    public String test1(@PathVariable String message) {
        return "Hello Nacos Discovery " + message + " i am from port " + port + " username " + applicationContext.getEnvironment().getProperty("user.name");
    }

你可以使用 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新

Nacos Config 多环境的配置

Spring Boot Profile

我们在做项目开发的时候,生产环境和测试环境的一些配置可能会不一样,有时候一些功能也可能会不一样,所以我们可能会在上线的时候手工修改这些配置信息。但是 Spring 中为我们提供了 Profile 这个功能。我们只需要在启动的时候添加一个虚拟机参数,激活自己环境所要用的 Profile 就可以了。

操作起来很简单,只需要为不同的环境编写专门的配置文件,如:application-dev.ymlapplication-prod.yml, 启动项目时只需要增加一个命令参数 --spring.profiles.active=环境配置 即可,启动命令如下:

java -jar idreamyou4cloud-upms.jar --spring.profiles.active=prod

Nacos Config Profile

spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了 dataid 为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过 Spring 提供的 ${spring.profiles.active} 这个配置项来配置。

此处我们以之前创建的 idreamyou4cloud-upms 项目为例:

  • 在 Nacos Server 中增加配置

增加一个名为 idreamyou4cloud-upms-dev.yaml 的配置:

image.png

注意:将配置文件中的端口由 8081 -> 8082,而且文件后缀一定要为.yaml,不然环境区分会失效!在修改端口的同时修改之前不规范的文件名:

image.png

  • 修改bootstrap.yml配置文件

spring:
  application:
    # 应用名称,这里采用Maven项目的模块名
    name: @artifactId@
  profiles:
    active: dev
  cloud:
    nacos:
      # 注册重新nacos的地址
      server-addr: localhost:8848
      config:
        file-extension: yaml
        server-addr: ${spring.cloud.nacos.server-addr}

主要增加了 spring.profiles.active=dev 配置,用于指定访问 Nacos Server 中的 idreamyou4cloud-upms-dev.yaml 配置

  • 启动程序,查看是否加载:

image.png

成功切换到8082端口


评论