框架简介
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。Nacos 的获取和启动方式可以参考 Nacos 官网。
准备工作
启动 Nacos 服务端
docker run -d --name nacos -e MODE=standalone -p 8848:8848 nacos/nacos-server:1.4.1
下载工程代码
shell@Alicloud:~$ tree nacos-config-samplenacos-config-sample├── pom.xml└── src├── main│ ├── java│ │ └── com│ │ └── alibaba│ │ └── cloud│ │ └── nacosconfigsample│ │ ├── nacosconfig│ │ │ └── NacosConfigConfiguration.java│ │ └── NacosConfigSampleApplication.java│ └── resources│ ├── application.properties│ └── bootstrap.properties└── test└── java└── com└── alibaba└── cloud└── nacosconfigsample└── NacosConfigSampleApplicationTests.java15 directories, 6 files
maven文件pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.alibaba.cloud</groupId><artifactId>nacos-config-sample</artifactId><version>0.0.1-SNAPSHOT</version><name>nacos-config-sample</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.3.7.RELEASE</spring-boot.version><spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version></properties><dependencies><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-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.7.RELEASE</version><configuration><mainClass>com.alibaba.cloud.nacosconfigsample.NacosConfigSampleApplication</mainClass></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
源码包com.alibaba.cloud.nacosconfigsample
启动类 NacosConfigSampleApplication
package com.alibaba.cloud.nacosconfigsample;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class NacosConfigSampleApplication {public static void main(String[] args) {SpringApplication.run(NacosConfigSampleApplication.class, args);}}
配置类NacosConfigConfiguration
@EnableAutoConfiguration@Configurationpublic class NacosConfigConfiguration {}
资源配置application.properties
# 应用名称spring.application.name=nacos-config-sample# 应用服务 WEB 访问端口server.port=8080
动态配置bootstrap.properties
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html# Nacos认证信息spring.cloud.nacos.config.username=nacosspring.cloud.nacos.config.password=nacosspring.cloud.nacos.config.contextPath=/nacos# 设置配置中心服务端地址spring.cloud.nacos.config.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可# spring.cloud.nacos.config.namespace=
使用 Nacos Config 实现分布式配置
使用 Nacos Config 实现分布式配置与 Spring Cloud Consul 和 Spring Cloud Zookeeper 的方式非常类似,仅需添加相关外部化配置即可工作。换言之,Nacos Config 同样不会侵入应用代码,方便应用整合和迁移,如果读者熟悉 Spring Cloud Consul 或 Spring Cloud Zookeeper 使用方式 的话,通常需要将 Consul 或 Zookeeper 服务进程预先部署,Nacos Config 也如此
访问 Nacos 服务器
打开(账号名/密码为 nacos/nacos),选择 “配置管理/配置列表”: 
添加 Nacos 配置
点击“配置列表”页面右侧的 “+” 号(红色箭头所指):
浏览器跳转新页面,并填充内容如下:
其中,Data ID 由应用名(nacos-config-sample)+ 文件后缀名(.properties) 组成,点击“发布”按钮(红色箭头所指),配置内容为:
user.name=nacos-config-sampleuser.age=90
修改应用配置
在 resources 目录下新建名为 “bootstrap.properties” 文件,并配置以下内容:
spring.cloud.nacos.config.server-addr=127.0.0.1:8848spring.cloud.nacos.config.username=nacosspring.cloud.nacos.config.password=nacos
注意,Nacos Server 地址必须配置在 bootstrap.properties 文件。
注意:当你使用域名的方式来访问 Nacos 时, spring.cloud.nacos.config.server-addr配置的方式为域名:port。 例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。
nacos 的默认端口地址为8848;
添加读取 Nacos Config 实现
下面,我们为工程增加下面的代码,以实现在启动时读取和输出 nacos 中的配置项:
package com.alibaba.cloud.nacosconfigsample;import javax.annotation.PostConstruct;import org.springframework.context.annotation.Configuration;import org.springframework.beans.factory.annotation.Value;@Configurationpublic class NacosConfigDemo {@Value("${user.name}")private String userName;@Value("${user.age}")private int userAge;@PostConstructpublic void init() {System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);}}
启动 Nacos Config 应用
首先,你需要编译你的工程
cd /home/shell/nacos-config-sample && mvn clean package
首次编译可能需要花费 1~3 分钟;
待编译完成以后,启动程序
java -jar /home/shell/nacos-config-sample/target/nacos-config-sample-0.0.1-SNAPSHOT.jar
启动完成后,你会看到下面的日志,代表启动过程中读取到了 nacos 服务端的配置数据:
[init] user name : nacos-config-sample , age : 90
Nacos Config Actuator Endpoint
Nacos Config 内部提供了一个 Endpoint, 对应的 Endpoint ID 为 nacos-config,其 Actuator Web Endpoint URI 为 /actuator/nacos-config
注:使用 Nacos Config Spring Cloud 1.x 版本的话,其 URI 地址则为 /nacos-config
其中,Endpoint 暴露的 json 中包含了三种属性:
- NacosConfigProperties: 当前应用 Nacos 的基础配置信息
- RefreshHistory: 配置刷新的历史记录
- Sources: 当前应用配置的数据信息
由于 Aliyun Java Initializr 所生成的应用工程默认激活 Spring Boot Actuator Endpoints(JMX 和 Web),具体配置存放在 application.properties文件中,同时,Actuator Web 端口设置为 8081,内容如下:
management.endpoints.jmx.exposure.include=*management.endpoints.web.exposure.include=*management.endpoint.health.show-details=always# Actuator Web 访问端口management.server.port=8081
因此,应用 nacos-config-sample 无需调整,直接访问:http://127.0.0.1:8081/actuator/nacos-config,服务响应的内容如下:
{"NacosConfigProperties": {"serverAddr": "127.0.0.1:8848","username": "","password": "","encode": null,"group": "DEFAULT_GROUP","prefix": null,"fileExtension": "properties","timeout": 3000,"maxRetry": null,"configLongPollTimeout": null,"configRetryTime": null,"enableRemoteSyncConfig": false,"endpoint": null,"namespace": null,"accessKey": null,"secretKey": null,"contextPath": null,"clusterName": null,"name": null,"sharedConfigs": null,"extensionConfigs": null,"refreshEnabled": true,"sharedDataids": null,"refreshableDataids": null,"extConfig": null,"configServiceProperties": {"secretKey": "","namespace": "","username": "","enableRemoteSyncConfig": "false","configLongPollTimeout": "","configRetryTime": "","encode": "","serverAddr": "127.0.0.1:8848","maxRetry": "","clusterName": "","password": "","accessKey": "","endpoint": ""}},"RefreshHistory": [],"Sources": [{"lastSynced": "2020-09-14 11:11:37","dataId": "nacos-config-sample.properties"},{"lastSynced": "2020-09-14 11:11:37","dataId": "nacos-config-sample"}]}
