Spring Cloud Alibaba 系列之 Nacos 篇(配置中心)

举报
苏州程序大白 发表于 2022/06/01 11:00:57 2022/06/01
【摘要】 Spring Cloud Alibaba 系列之 Nacos 篇(配置中心) 二、简单介绍Nacos 提供用于存储配置和其他元数据功能,为分布式系统中的外部化配置提供服务器端和客户端支持,使用 Spring Cloud Alibaba Nacos Config 就可以在 Nacos Server 集中管理 Spring Cloud 应用的外部属性配置。 2.1 实现目的不使用配置中心之前,...

Spring Cloud Alibaba 系列之 Nacos 篇(配置中心)

二、简单介绍

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

2.1 实现目的

不使用配置中心之前,我们在管理项目配置会遇到如下问题:

  1. 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
  2. 配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
  3. 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

这些问题通过使用 Nacos 的配置中心功能快捷、简便的解决。

2.2 基础概念

为了区分环境或项目间的配置,我们需要了解 Nacos 给出的如下3个概念:

命名空间(Namespace)

命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间
 复制

配置分组(Group)

配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组
 复制

配置集(Data ID)

在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集
 复制

其中,这三者的关系如下图:

上边都是一堆定义和文字,无法真实感受到 Nacos 作为配置中心的功效,下边开始通过实战演练加深大家对 Nacos 的认知。

三、实战演练

首要条件就是启动 Nacos 的服务环境。我们使用上一篇文章搭建好的 Nacos 服务,不清楚的读者可以先移步至上一篇浏览前置内容。

3.1 基础配置

搭建名为 nacos-config-testSpring Boot 项目。

注意:Spring Boot、Spring Cloud 与 Spring Cloud Alibaba 版本依赖关系

第一步,添加依赖:

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </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>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
        
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- spring cloud 依赖 -->
        <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 依赖-->
        <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>
 复制

第二步,创建 bootstrap.propertiesbootstrap.yaml文件:

使用配置中心后,我们通常会把 application.propertiesapplication.yaml中的配置移植到 Nacos 服务上,但项目连接配置中心服务需要单独配置,因此需要用到 bootstrap.propertiesbootstrap.yml文件。

其中,这 4 种文件的加载顺序由高到低依次是:

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

我们配置如下:

spring.application.name=nacos-config

spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
 复制

第三步,移植配置数据:

即将 application.propertiesapplication.yml 中的业务配置数据移植到配置中心服务上。

本次演练,我们使用如下配置数据进行测试:

database.url=xxx
database.username=root
database.password=riger
 复制

登录Nacos管理后台,管理配置 -> 配置列表,,操作如下图:

新建配置界面中,Data ID 通常对应 spring.application.name 的值 + (.properties 或 .yaml)。

数据配置格式,目前只支持 propertiesyaml

第三步,创建测试类:

用于封装上文在 Nacos 服务上配置的数据

@Data
@Component
@ConfigurationProperties(prefix = "database")
public class DataBaseConfig {

    private String url;

    private String username;

    private String password;
    
    private String env;
}
 复制

用于测试获取配置数据

@RestController
@RefreshScope
public class ConfigController {

    @Autowired
    private DataBaseConfig dataBaseConfig;

    @Value("${database.url}")
    private String url;

    @RequestMapping("/getConfig")
    public DataBaseConfig getConfig() {
        return dataBaseConfig;
    }

    @RequestMapping("/getUrl")
    public String getUrl() {
        return url;
    }
}
 复制

接下来进行接口请求测试,启动项目,请求 http://localhost:8080/getConfig 结果如下图:

成功请求获取配置中心的数据。

3.2 动态刷新

所谓动态刷新就是在不重启项目的基础上,修改配置中心的数据,项目能立即获取最新数据,接下来我们操作一遍:

将配置数据改成:

database.url=xxxyyy
database.username=rootyyy
database.password=rigeryyy
 复制

img

修改配置后,不重启项目,再次请求接口,成功获取修改后的配置数据。

3.3 环境隔离

项目开发一般分为,开发、测试、预发和生产这4个阶段,每个阶段都有对应的配置数据(数据库、redis、MQ 连接配置等),这些数据都各不相同,为了更好的区分和维护这些数据,环境隔离功能必不可少。

那配置中心如何做环境隔离呢?需要用到上文提到的命名空间,操作如下:

第一步,登录 Nacos 管理后台,命名空间菜单,新建一个名为 TEST 的命名空间:

该命名空间就作为测试环境的专属空间。

第二步,在新建的命名空间下,创建一个配置:

database.url=xxx
database.username=root
database.password=riger
database.env=TEST
 复制

第三步,修改项目中的 bootstrap.propertiesbootstrap.yml文件,新增:

spring.cloud.nacos.config.namespace=fea20266-ae0e-4401-b686-de0fe63c1856
 复制

其中,spring.cloud.nacos.config.namespace的值就是创建 TEST 命名空间生成的 id 值。

最后,重启项目,请求接口,结果如下图:

成功请求 TEST 命名空间下的配置数据。

3.4 数据持久化

Nacos 默认情况下是采用 apache derby 内嵌数据库进行数据存储,在单机模式时可以使用 Nacos 嵌入式数据库实现数据存储,但是 derby 数据库不方便观察数据存储的基本情况,从 Nacos 0.7 版本开始增加了支持 mysql 数据源能力。

接下来,我们实现持久化功能。

第一步,创建名为 nacos_config 的数据库,在 Nacos 的程序包下,有个 conf 目录,将里边的 nacos-mysql.sql 导入到新建的数据库中。

第二步,修改 conf/application.properties 的数据库连接配置:

将注释打开:

spring.datasource.platform=mysql

db.num=1

# 注意修改数据库名、账号和密码
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=tiger
 复制

第三步,重启 Nacos 服务,再次访问 http://localhost:8848/nacos ,如下图:

登录发现,之前配置的数据都消失,因为我们更换了存储源(MySQL)。现在数据库中的数据都是空的,在 Nacos 管理后台中,我们尝试新建一条配置:

database.url=abc
database.username=root
database.password=riger
 复制

保存后,查看数据库信息,如下图:

配置数据成功持久化。

3.5 集群部署

为保证配置中心的高可用性,集群部署是必不可少的整合方案。

我们在本地测试,将 Nacos 安装包拷贝成 3 份,在持久化模式的基础上,操作步骤如下:

第一步,将 Nacos 程序包下的 conf/cluster.conf.example 改名为 conf/cluster.conf,修改内容:

127.0.0.1:8801
127.0.0.1:8802
127.0.0.1:8803
 复制

第二步,修改 3 份 Nacos 安装包下的 conf/application.properties 文件,将 server.port 依次改成 880188028803

保存后,启动 3 份 Nacos 即可:

cd nacos/bin

# windows 单机模式启动
./startup.cmd

# linux/mac 
./startup.sh
 复制

注意,启动命令无需加 -m standalone 参数

引申问题:Nacos 做了集群,有 3 个访问地址,客户端如何配置请求呢?有 2 种请求方案:

  1. 修改 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8801,127.0.0.1:8802,127.0.0.1:8803
  2. 使用 Nginx 反向代理 Nacos 集群。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。