在上文 Java微服务新生代之Nacos 已经介绍了微服务框架 Nacos 以及它在服务注册与发现的功能,本文将主要介绍它的另外一强大功能:配置管理,学习利用 Nacos 如何实现经过统一的管理界面,集中化实现分布式服务的配置维护和实时更新。html
本文主要内容涉及以下:git
Nacos 提供了动态配置服务,能让咱们能够实时进行服务应用的配置变动,让配置管理变得更加高效和快捷。它基于 key/value 方式存储应用配置和其余元数据信息,为分布式系统中的外部化配置提供服务器端和客户端支持。github
首先了解下 Nacos 在配置管理模块上的几个重要概念,能帮助咱们更好的理解和正确的使用 Nacos 进行配置管理。spring
命名空间(Namespace)shell
用于进行租户粒度的配置隔离,可用于对不一样环境配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。bootstrap
配置项 (Configuration Item)浏览器
一个具体的可配置的参数与其值,一般以 param-key=param-value 的形式存在。例如咱们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。服务器
配置集 (Configuration Set)微信
一组相关或者不相关的配置项的集合。一个配置文件一般就是一个配置集,它可能包含了数据源、线程池、日志级别等配置项。app
配置集 ID(Data ID)
某个配置集的标识 ID,用于组织划分系统的配置集。一个系统或者应用能够包含多个配置集。官方推荐采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则定义 Data ID 来保证全局惟一性。
配置分组(Group)
对配置集进行分组,用于区分 Data ID 相同的配置集。默认采用 DEFAULT_GROUP 。配置分组的常见场景:不一样的应用或组件使用了相同的配置类型,如 database_url 配置和 消息队列 Topic 配置等。
要使用 Nacos 进行配置管理,首先须要启动 Nacos 服务端,而后客户端接入,关于 Nacos 的服务端启动具体操做能够参见 Java微服务新生代之Nacos 。
启动了 Nacos 服务端,首先咱们在 Nacos 控制台上的配置管理里新建一个最简单的配置,如图:
保存成功后能列表里看下建立的配置记录以下:
每一个配置集的操做栏都提供了配置的查看修改和清除功能,还有额外的示例代码查看,来引导咱们如何在客户端使用 Nacos 读取该配置集,目前只支持 Java,Spring Boot,Spring Cloud,其余语言的版本还在完善语言。
首先给 Spring 程序添加依赖
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId>
<version>0.2.3-RC1</version>
</dependency>
复制代码
最新版本能够在 maven 仓库 mvnrepository.com 中获取。
添加 @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
值已经被动态更新了。
添加配置动态变动的依赖:
<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
, 说明程序中的配置已经读取成功。
若是使用 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
实现配置自动更新:
运行程序,访问 http://localhost:8080/config/hello
,返回内容为 hello,nacos
,则表示配置读取成功。
在 Nacos 控制台修改配置项 message=Nacos Spring Cloud
,再次访问 http://localhost:8080/config/hello
, 返回内容为 hello,Nacos Spring Cloud
,说明程序中的message
值已经被动态更新了。
上面实现了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
自定义指定名称。
都存放两个配置项,以 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 对象
Nacos 里 Namespace 做为租户颗粒度细分而存在,主要为了解决多环境以及多租户数据(配置和服务)隔离的问题。
若是只是一个租户(用户),不一样的 namespce 能够对应不一样的环境,以此实现环境配置的隔离,效果就跟上节内容:Nacos 多环境配置管理 类似。
若是存在多个租户,为每一个租户分配不一样的 namespace,这样每一个租户(用户)的配置数据以及注册的服务数据都会归属到本身的 namespace 下,就能够实现多租户配置数据隔离做用。
注意:Nacos 目前还没实现帐号权限的分配和隔离,没法让各租户本身管理本身的配置,这一块功能仍在规划中。
简单介绍以后,再来看下 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 官方文档描述的也很详细,你们也能够多在官网上查阅。后续我将继续深刻研究其余 Spring Cloud Alibaba 微服务生态的组件,欢迎感兴趣的小伙伴能够关注个人微信公众号,每周一更。
示例项目:nacos-actions:github.com/wrcj12138aa…
环境支持:
- JDK 8
- Maven 3.6.0
- SpringBoot 2.1.0.RELEASE
- SpringCloud Greenwich.RELEASE
- SpringCloudAlibaba 0.9.0.RELEASE