Spring Cloud Alibaba Nacos之服务配置中心

目录

一、简介

二、搭建服务配置中心

三、Namespace/Group/DataId的介绍

四、Nacos之Data ID配置

五、Nacos之Group分组方案

六、Nacos之Namespace命名空间配置

七、总结


一、简介

Nacos除了提供服务注册发现的功能之外,还提供了动态配置功能:

  1. 动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置
  2. 动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
  3. 配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

接下来,我们就通过示例说明如何让nacos作为我们的服务配置中心以及实现动态刷新配置功能。

二、搭建服务配置中心

新建一个module【springcloudalibaba-nacos-config-server3377】,通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。

【a】pom.xml依赖:加入spring-cloud-starter-alibaba-nacos-config依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud2020</artifactId>
        <groupId>com.wsh.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloudalibaba-nacos-config-server3377</artifactId>

    <dependencies>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--web + actuator-->
        <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>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

【b】bootstrap.yml:指定nacos为服务注册中心地址、配置中心地址

server:
  port: 3377
spring:
  application:
    name: springcloudalibaba-nacos-config-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848   #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848   #Nacos作为配置中心地址
        file-extension: yaml    #指定yaml格式的配置 (可选值:yaml、properties)

说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。 

【c】application.yml

spring:
  profiles:
    active: dev # 表示开发环境
    #active: test # 表示测试环境
    #active: prod #表示生产环境

【d】主启动类

package com.wsh.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigServerServiceApplication3377 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigServerServiceApplication3377.class, args);
    }
}

【e】业务方法:注意加上@RefreshScope:表示支持Nacos的动态刷新功能,用于动态刷新配置功能。

package com.wsh.springcloud.alibaba.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.RestController;

@RestController
//@RefreshScope: 表示支持Nacos的动态刷新功能
@RefreshScope
public class NacosConfigServerController {
    @Value("${nacos.config.info}")
    private String configInfo;

    @GetMapping("/nacos/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新 。

【f】Nacos服务端新增对应的配置文件

 此处需要额外说明我们的Data ID的值是怎么来的,注意千万不能写错了。

 在 Nacos Spring Cloud 中,DataId的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}.
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

【g】测试

启动项目,注意启动项目之前,需要确保nacos服务器有对应的配置文件,否则会报错。

浏览器访问:http://localhost:3377/nacos/config/info

可见,我们成功从nacos中读取到配置信息,下面我们测试一下动态刷新配置的功能,手动修改nacos服务器中的配置文件,修改version = 2:

再次访问:http://localhost:3377/nacos/config/info

可以发现,应用程序直接感知到配置文件有变化,直接加载出最新的配置信息。这一点跟Spring Cloud + Bus还得手动发送post请求去刷新配置比较起来,方便了不少。

三、Namespace/Group/DataId的介绍

首先来看一个问题:多环境多配置问题

  • 实际开发中,通常一个系统会准备dev开发环境、test测试环境、prod生产环境。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
  • 一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、正式环境....那怎么对这些微服务配置进行管理呢?

Nacos有分类管理的操作,Nacos中提供了Namespace + Group + Data ID的概念来兼容上述的问题。

首先得搞明白, Namespace + Group + Data ID是什么?

  • 命名空间Namespace

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。默认是有一个叫public的保留空间,不支持删除。

  • 配置分组Group

Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。

  • 配置集ID  Data ID

Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

看完上述官网的概念,可能很多小伙伴们跟我一样,就如下面的表情一般,问题不大,接着看,先混个眼熟再说。

  • 三者的关系如下图

在这里插入图片描述

默认情况下,Namespace = public,Group = DEFAULT_GROUP,默认cluster是DEFAULT。 前面的官方定义都比较抽象,没那么好理解,下面是通俗易懂的说明:

  1. Nacos默认的命名空间是public,Namespace主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境。我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
  2. Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去;比如用户系统和订单系统的配置文件都可以放在同个组中。
  3. Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对微服务的一个虚拟划分,比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
  4. Instance指的就是微服务的实例

总的来说,namespace是可以用于区分部署环境的,GroupDataID逻辑上区分两个目标对象。

四、Nacos之Data ID配置

我们通过指定spring.profile.active和配置文件的Data ID来使不同环境下读取不同的配置。

【a】默认空间 + 默认分组 + 新建dev和test两个Data ID

(1)、新建dev的Data ID:其实就是我们前面已经创建的【springcloudalibaba-nacos-config-server-dev.yaml】文件。

(2)、新建test的Data ID,如下图所示:

添加完后如下图所示:

【b】通过spring.profile.active属性就能进行多环境下配置文件的读取

spring:
  profiles:
#    active: dev   # 表示开发环境
    active: test # 表示测试环境

【c】测试

启动项目,浏览器访问:http://localhost:3377/nacos/config/info

可见,此时spring.preofile.active=test,根据data id的规则,它会去Nacos上面查找名字为【springcloudalibaba-nacos-config-server-test.yml】的配置文件。

五、Nacos之Group分组方案

通过Group进行环境区分。

【a】在nacos控制台界面新增配置:注意Group组名为:PROD_GROUP

 【b】在nacos控制台界面新增配置:注意Group组名为:TEST_GROUP

添加完成后,如下图所示,两个配置文件属于两个不同的组。 

 【c】修改bootstrap.yml

通过spring.cloud.nacos.config.group:xxxx来指定读取哪个分组下的配置文件。

server:
  port: 3377
spring:
  application:
    name: springcloudalibaba-nacos-config-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848   #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848   #Nacos作为配置中心地址
        file-extension: yaml    #指定yaml格式的配置 (可选值:yaml、properties)
#        group: PROD_GROUP
        group: TEST_GROUP   #表示读取哪个分组的配置文件

 【d】修改spring.profile.active=prod

spring:
  profiles:
#    active: dev   # 表示开发环境
#    active: test # 表示测试环境
    active: prod #表示生产环境

 【e】测试

重启配置中心,浏览器访问:http://localhost:3377/nacos/config/info

由于上面我们配置的spring.profile.active = prod,并且spring.cloud.nacos.config.group = TEST_GROUP,所以它会去nacos中查找TEST_GROUP分组下的springcloudalibaba-nacos-config-server-prod.yaml配置文件。

我们修改一下:spring.cloud.nacos.config.group = PROD_GROUP,重启项目,继续访问:http://localhost:3377/nacos/config/info

可见,这次查找的是PROD_GROUP分组下的springcloudalibaba-nacos-config-server-prod.yaml配置文件。

六、Nacos之Namespace命名空间配置

【a】新建dev、test、prod三个Namespace命名空间

 

 前面两个命名空间我们都没有指定ID,当然我们也可以指定,方便在应用程序中引用,如下图:

 【b】回到服务管理-服务列表查询

【c】bootstrap.yml:指定namespace命名空间的ID

server:
  port: 3377
spring:
  application:
    name: springcloudalibaba-nacos-config-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848   #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848   #Nacos作为配置中心地址
        file-extension: yaml    #指定yaml格式的配置 (可选值:yaml、properties)
#        group: PROD_GROUP
        group: TEST_GROUP   #表示读取哪个分组的配置文件
        namespace: prod-namespace  #指定命令空间的ID (这里没有使用自动生成的UUID的命令空间ID,是自定义的)

【d】修改application.yml

spring:
  profiles:
    active: dev   # 表示开发环境

【e】新建配置

(1)、新建 springcloudalibaba-nacos-config-server-dev.yaml  +  【group组名】DEFAULT_GROUP

(2)、新建springcloudalibaba-nacos-config-server-dev.yaml + 【group组名】DEV_GROUP 

 

(3)、新建 springcloudalibaba-nacos-config-server-dev.yaml + 【group组名】TEST_GROUP 

 

 添加完成如下图:

【f】测试

重启项目,浏览器访问:http://localhost:3377/nacos/config/info

可见,应用程序将会去nacos上查找prod-namespace命名空间下的TEST_GROUP分组下的springcloudalibaba-nacos-config-server-dev.yaml配置文件。

七、总结

本文主要介绍了如何使用nacos搭建我们的服务配置中心,并研究了nacos提供的namespace + group + data id三级控制多环境多配置的功能。以上相关项目的代码我已经放在Gitee上,有需要的小伙伴可以去拉取进行学习:https://gitee.com/weixiaohuai/springcloud_Hoxton,由于笔者水平有限,如有不对之处,还请小伙伴们指正,相互学习,一起进步。

参考资料:

https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-config-example

下面是笔者总结的关于Spring Cloud Alibaba教程系列文章目录,有需要的小伙伴可以前往学习:

1. Spring Cloud Alibaba入门简介

2. Spring Cloud Alibaba Nacos之服务注册中心

3. Spring Cloud Alibaba Nacos之服务配置中心

4. Spring Cloud Alibaba Nacos集群和持久化配置

5. Spring Cloud Alibaba Sentinel之入门篇

6. Spring Cloud Alibaba Sentinel之流控规则篇

7. Spring Cloud Alibaba Sentinel之服务降级篇

8. Spring Cloud Alibaba Sentinel之热点参数限流篇

9. Spring Cloud Alibaba @SentinelResource配置详解

10. Spring Cloud Alibaba Sentinel之服务熔断篇

11. Spring Cloud Alibaba Sentinel之持久化篇

12. Spring Cloud Alibaba Seata处理分布式事务及案例实战

13. Spring Cloud Alibaba Seata工作原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值