java微服务Nacos配置管理

本文介绍了Nacos配置管理服务,包括命名空间、配置项、配置集和配置分组的概念。通过启动Nacos服务,展示了如何在Spring Boot、Spring Cloud应用中集成Nacos进行配置管理,并详细阐述了多环境配置管理的实现。最后讨论了Namespace的最佳实践,强调其在环境和租户数据隔离中的作用。
部署运行你感兴趣的模型镜像

介绍Nacos配置管理

Nacos 提供了动态配置服务,能让我们可以实时进行服务应用的配置变更,让配置管理变得更加高效和快捷。它基于 key/value 方式存储应用配置和其他元数据信息,为分布式系统中的外部化配置提供服务器端和客户端支持。

首先了解下 Nacos 在配置管理模块上的几个重要概念,能帮助我们更好的理解和正确的使用 Nacos 进行配置管理。

命名空间(Namespace)
用于进行租户粒度的配置隔离,可用于对不同环境配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
配置项 (Configuration Item)
一个具体的可配置的参数与其值,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
配置集 (Configuration Set)
一组相关或者不相关的配置项的集合。一个配置文件通常就是一个配置集,它可能包含了数据源、线程池、日志级别等配置项。
配置集 ID(Data ID)
某个配置集的标识 ID,用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集。官方推荐采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则定义 Data ID 来保证全局唯一性。
配置分组(Group)
对配置集进行分组,用于区分 Data ID 相同的配置集。默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 消息队列 Topic 配置等。

启动Nacos配置管理

要使用 Nacos 进行配置管理,首先需要启动 Nacos 服务端,然后客户端接入,关于 Nacos 的服务端启动具体操作可以参见 Java微服务新生代之Nacos 。
在这里插入图片描述

  • 启动了 Nacos 服务端,首先我们在 Nacos 控制台上的配置管理里新建一个最简单的配置,如图:
    在这里插入图片描述

  • 保存成功后能列表里看下创建的配置记录如下:
    在这里插入图片描述

  • 每个配置集的操作栏都提供了配置的查看修改和清除功能,还有额外的示例代码查看,来引导我们如何在客户端使用 Nacos 读取该配置集,目前只支持 Java,Spring Boot,Spring Cloud,其他语言的版本还在完善语言。

  • 接下里看下Nacos 基于 Spring 技术栈的集成方式Nacos Spring

  • 首先给 Spring 程序添加依赖

<dependency>
 <groupId>com.alibaba.nacos</groupId>
 <artifactId>nacos-spring-context</artifactId>
 <version>0.2.3-RC1</version>
</dependency>
  • 添加 @EnableNacosConfig 注解启用 Nacos Spring 的配置管理服务。如下示例,我们使用了@NacosPropertySource 注解加载了我们先前创建的配置集,并且指定为自动刷新配置。

在这里插入图片描述

  • 通过Nacos 的 @NacosValue 注解将配置项与属性进行绑定。

在这里插入图片描述

  • 启动程序后,打开 http://localhost:8080/config/hello 获取返回结果hello,test,内容如下就表示读取配置成功。
    在这里插入图片描述
  • 读取成功后我们再尝试修改这个配置项验证下 Nacos 的配置信息的动态刷新特性。修改有两种方式,一种在 Nacos 控制台上手动修改,另一种在命令行使用提供的 API 直接进行修改:
curl -X POST "http://127.0.0.1:8848/nacos/v1.0.1/cs/configs?

dataId=com.one.learn.nacos.config&group=DEFAULT_GROUP&content=message=nacos-spring"

再次访问 http://localhost:8080/config/hello,此时返回内容为hello,nacos-spring,返回信息变化说明程序中的message值已经被动态更新了。
在这里插入图片描述

Nacos Spring Boot

  • 添加配置动态变更的依赖:
    <dependency>
     <groupId>com.alibaba.boot</groupId>
     <artifactId>nacos-config-spring-boot-starter</artifactId>
     <version>0.2.1</version>
    </dependency>

注意: 这里的版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。

在 application.properties 中配置 Nacos Server 的地址:

nacos.config.server-addr=127.0.0.1:8848

使用 @NacosPropertySource 加载 dataId 为 com.one.learn.nacos.config 的配置源,并开启自动更新:
在这里插入图片描述

  • 通过 Nacos 的 @NacosValue 注解设置属性值,与集成 Spring 的步骤内容一样。

  • 启动引导类,打开 http://localhost:8080/config/hello 获取返回结果hello,nacos, 说明程序中的配置已经读取成功。

Nacos Spring Cloud

如果使用 Spring Cloud 程序,Nacos 提供了依赖库 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。

添加依赖:

<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 <version>0.9.0.RELEASE</version>
</dependency>

注意:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。

在 bootstrap.properties 中配置 Nacos server 的地址和应用名如下,在 Nacos Spring Cloud 中,dataId 默认为

spring.application.name 加上 properties 文件后缀,所以,为了能正确读取配置,我们需要将 Nacos 上配置集 ID 为

com.one.learn.nacos.config 调整为 com.one.learn.nacos.config.properties

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=com.one.learn.nacos.config

这里使用 bootstrap.properties 作为配置 Nacos 地方,是因为 Spring Boot 配置文件的加载顺序,依次为 bootstrap.properties ->

bootstrap.yml -> application.properties -> application.yml ,在 application 层级上配置 Nacos 时无法生效。

注意:当使用域名的方式来访问 Nacos 时,spring.cloud.nacos.config.server-addr 配置的方式必须为 域名:port。 即使使用域名,端口不能省略。例如 Nacos 的域名为 abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。

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

在这里插入图片描述

Nacos 多环境配置管理

上面实现了Nacos基本的配置读取和更新后,接下来我们看下 Nacos 如何进行多环境配置的管理,需要注意的是此特性仅针对于 Spring Cloud 应用。

假设我们程序有两个环境:测试,生产环境需要管理配置,在 Spring Boot 程序中,默认的配置文件为 application.properties

传统的方式是,利用 Spring Profile 特性,在项目里存放多个环境对应的配置文件,文件格式为 application-${env}-properties,

并且需要用 spring.profile.active 指定启动时应用哪个环境的配置。

Nacos Config 主要通过 dataId 和 group 来唯一确定一条配置,在 Nacos Spring Cloud 中,dataId 的完整格式如下:

 ${prefix}-${spring.profile.active}.${file-extension}

prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。

注意*:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 {prefix}.{file-extension}

file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持

properties 和 yaml 类型。

group 默认为 DEFAULT_GROUP,可以通过 spring.cloud.nacos.config.group 自定义指定名称。

基于上面的配置规则描述,我们可以先在 Nacos 控制台上新建两个不同环境的配置集,如下
在这里插入图片描述

  • 都存放两个配置项,以 property 文件格式存储。
    #nacos-config-prod.properties
    server.port=8091
    message=nacos-config-prod
    #nacos-config-test.properties
    server.port=8081
    message=nacos-config-test
  • 然后在程序的主配置文件 application.properties 中配置如下:
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    spring.application.name=nacos-config
    spring.cloud.nacos.config.file-extension=properties
    spring.profile.active=test
  • 编写测试控制器类 ConfigController,将配置项与属性值进行绑定。
    在这里插入图片描述

  • 启动程序,可以看到如下数据结果,说明测试环境下端口配置已经生效。
    在这里插入图片描述

  • 再通过浏览器访问 http://localhost:8081/config/hello,返回 hello,nacos-config-test 。

  • 修改配置文件 application.properties 的 spring.profile.active ,重新启动程序并访问 http://localhost:8091/config/hello

    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    spring.application.name=nacos-config
    spring.cloud.nacos.config.file-extension=properties
    spring.profile.active=prod

  • 能获取到返回结果 hello,nacos-config-prod , 也说明程序另一个环境的配置切换成功。

配置监听

除了主动检验配置生效之外,我们可以通过添加监听器的方式来监听配置的变化,实现很简单,使用 @NacosConfigListener 即可,一旦指定的配置集 ID 对应配置发生了变化,监听器就会受到回调,将所有的配置信息以字符串形式返回。当存在多个配置项时,回调接收到的配置字符串中带有换行格式,需要自己处理。
在这里插入图片描述
当然 @NacosConfigListener 也支持类型转换,比如转换为 Properties 对象

Namespace 最佳实践

Nacos 里 Namespace 作为租户颗粒度细分而存在,主要为了解决多环境以及多租户数据(配置和服务)隔离的问题。

如果只是一个租户(用户),不同的 namespce 可以对应不同的环境,以此实现环境配置的隔离,效果就跟上节内容:Nacos 多环境配置管理 相似。

如果存在多个租户,为每个租户分配不同的 namespace,这样每个租户(用户)的配置数据以及注册的服务数据都会归属到自己的 namespace 下,就可以实现多租户配置数据隔离作用。
在这里插入图片描述

注意:Nacos 目前还没实现账号权限的分配和隔离,无法让各租户自己管理自己的配置,这一块功能仍在规划中。

简单介绍之后,再来看下 namespace 相关的最佳实践:

如何来获取 namespace 的值。
namespace 参数初始化方式。
创建命名空间

在 nacos 的控制台左边功能侧看到有一个 命名空间 的功能,点击就可以看到 新建命名空间 的按钮,那么这个时候就可以创建自己的命名空间了。创建成功之后,会生成一个命名空间ID,主要是用来避免命名空间名称有可能会出现重名的情况。因此当您在应用中需要配置指定的 namespace 时,填入的是命名空间ID。

在这里插入图片描述
关联命令空间

在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:

spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7

该配置必须放在 bootstrap.properties 文件中。此外spring.cloud.nacos.config.namespace的值是 namespace 对应的 id。

结语

到这里,到这里关于 Nacos 管理配置的学习就告一段落,当然在配置管理上还有更多的用法,Nacos 官方文档描述的也很详细,大家也可以多在官网上查阅。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### Java微服务Nacos集成指南 #### 一、Nacos简介及其重要性 Nacos作为阿里巴巴开源的服务发现与配置管理基础设施,旨在帮助开发者更轻松地构建云原生应用。通过提供统一的命名空间和服务治理能力,Nacos能够有效简化分布式系统的开发流程并提升其稳定性[^1]。 #### 二、Nacos配置管理详解 对于采用Java技术栈构建的应用程序而言,利用Nacos实现集中式的配置管理是一项非常有价值的功能。这不仅有助于减少重复劳动,还能确保各个环境中的一致性和安全性。以下是基于Spring Boot框架的具体实施方法: - **创建Spring Boot项目** 为了使应用程序具备访问Nacos的能力,在新建工程时需引入相应的依赖库。通常情况下,只需添加`spring-cloud-starter-alibaba-nacos-config`即可完成基本设置[^4]。 ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` - **定义外部化属性文件** 接下来应该准备一份名为`bootstrap.yml`(或`.properties`)的资源文件来指定连接至目标Nacos服务器所需的信息,比如地址、用户名密码等参数[^2]。 ```yaml spring: application: name: demo-service cloud: nacos: config: server-addr: localhost:8848 file-extension: yaml ``` - **注入配置项** 借助于Spring Framework所提供的强大功能集,可以直接在代码内部声明变量并通过自动装配机制获取来自远程存储的数据源。这里列举两种常用方式供参考者选用:一是运用`@Value`标签;二是结合自定义类结构配合`@ConfigurationProperties`注解共同作用。 ```java @RestController public class HelloController { @Value("${example.message}") private String message; // 或者使用@ConfigurationProperties绑定整个对象 } ``` - **支持热加载特性** 值得一提的是,当涉及到频繁变动的关键字表单时,建议开启监听器以便即时响应任何潜在的变化事件。如此这般便能保证本地副本始终处于最新状态而无需重启进程就能生效新版本设定值。 ```yaml management: endpoints: web: exposure: include: refresh ``` #### 三、服务注册与发现原理说明 除了上述提到过的静态资源配置外,动态感知其他成员节点的存在与否同样是至关重要的环节之一。得益于内置的支持插件,只要遵循既定模式编写业务逻辑部分就可无缝对接官方API接口从而达成预期效果。 - **初始化客户端实例** 首先得确认已经成功安装好运行环境并且按照文档指示完成了必要的准备工作之后再继续后续步骤。一般来讲,只需要简单修改几处地方就可以让现有架构兼容新的组件了[^3]。 ```xml <!-- pom.xml --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> ``` - **标注主类入口** 紧接着要在启动引导阶段加入额外指令以激活该模块的核心功能——即告诉容器当前角色身份以及期望与其他参与者建立联系的方式。 ```java @SpringBootApplication @EnableDiscoveryClient public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` - **测试连通状况** 最后一步则是验证一切是否正常运作。可以通过浏览器或其他工具向暴露出来的HTTP API发送请求来进行初步诊断。如果返回的结果符合预期,则证明整个链路畅通无阻。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值