框架简介

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 服务端

  1. docker run -d --name nacos -e MODE=standalone -p 8848:8848 nacos/nacos-server:1.4.1

下载工程代码

  1. shell@Alicloud:~$ tree nacos-config-sample
  2. nacos-config-sample
  3. ├── pom.xml
  4. └── src
  5. ├── main
  6. ├── java
  7. └── com
  8. └── alibaba
  9. └── cloud
  10. └── nacosconfigsample
  11. ├── nacosconfig
  12. └── NacosConfigConfiguration.java
  13. └── NacosConfigSampleApplication.java
  14. └── resources
  15. ├── application.properties
  16. └── bootstrap.properties
  17. └── test
  18. └── java
  19. └── com
  20. └── alibaba
  21. └── cloud
  22. └── nacosconfigsample
  23. └── NacosConfigSampleApplicationTests.java
  24. 15 directories, 6 files

maven文件pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.alibaba.cloud</groupId>
  6. <artifactId>nacos-config-sample</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>nacos-config-sample</name>
  9. <description>Demo project for Spring Boot</description>
  10. <properties>
  11. <java.version>1.8</java.version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  15. <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.alibaba.cloud</groupId>
  24. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. <exclusions>
  31. <exclusion>
  32. <groupId>org.junit.vintage</groupId>
  33. <artifactId>junit-vintage-engine</artifactId>
  34. </exclusion>
  35. </exclusions>
  36. </dependency>
  37. </dependencies>
  38. <dependencyManagement>
  39. <dependencies>
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-dependencies</artifactId>
  43. <version>${spring-boot.version}</version>
  44. <type>pom</type>
  45. <scope>import</scope>
  46. </dependency>
  47. <dependency>
  48. <groupId>com.alibaba.cloud</groupId>
  49. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  50. <version>${spring-cloud-alibaba.version}</version>
  51. <type>pom</type>
  52. <scope>import</scope>
  53. </dependency>
  54. </dependencies>
  55. </dependencyManagement>
  56. <build>
  57. <plugins>
  58. <plugin>
  59. <groupId>org.apache.maven.plugins</groupId>
  60. <artifactId>maven-compiler-plugin</artifactId>
  61. <version>3.8.1</version>
  62. <configuration>
  63. <source>1.8</source>
  64. <target>1.8</target>
  65. <encoding>UTF-8</encoding>
  66. </configuration>
  67. </plugin>
  68. <plugin>
  69. <groupId>org.springframework.boot</groupId>
  70. <artifactId>spring-boot-maven-plugin</artifactId>
  71. <version>2.3.7.RELEASE</version>
  72. <configuration>
  73. <mainClass>com.alibaba.cloud.nacosconfigsample.NacosConfigSampleApplication</mainClass>
  74. </configuration>
  75. <executions>
  76. <execution>
  77. <id>repackage</id>
  78. <goals>
  79. <goal>repackage</goal>
  80. </goals>
  81. </execution>
  82. </executions>
  83. </plugin>
  84. </plugins>
  85. </build>
  86. </project>

源码包com.alibaba.cloud.nacosconfigsample
启动类 NacosConfigSampleApplication

  1. package com.alibaba.cloud.nacosconfigsample;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class NacosConfigSampleApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(NacosConfigSampleApplication.class, args);
  8. }
  9. }

配置类NacosConfigConfiguration

  1. @EnableAutoConfiguration
  2. @Configuration
  3. public class NacosConfigConfiguration {
  4. }

资源配置application.properties

  1. # 应用名称
  2. spring.application.name=nacos-config-sample
  3. # 应用服务 WEB 访问端口
  4. server.port=8080

动态配置bootstrap.properties

  1. # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
  2. # Nacos认证信息
  3. spring.cloud.nacos.config.username=nacos
  4. spring.cloud.nacos.config.password=nacos
  5. spring.cloud.nacos.config.contextPath=/nacos
  6. # 设置配置中心服务端地址
  7. spring.cloud.nacos.config.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848
  8. # Nacos 配置中心的namespace。需要注意,如果使用 public namcespace ,请不要填写这个值,直接留空即可
  9. # 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),选择 “配置管理/配置列表”: image.png

添加 Nacos 配置

点击“配置列表”页面右侧的 “+” 号(红色箭头所指): image.png 浏览器跳转新页面,并填充内容如下: image.png 其中,Data ID 由应用名(nacos-config-sample)+ 文件后缀名(.properties) 组成,点击“发布”按钮(红色箭头所指),配置内容为:

  1. user.name=nacos-config-sample
  2. user.age=90

发布成功后,控制台会出现提示弹出框。

修改应用配置


在 resources 目录下新建名为 “bootstrap.properties” 文件,并配置以下内容:

  1. spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  2. spring.cloud.nacos.config.username=nacos
  3. spring.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 中的配置项:

  1. package com.alibaba.cloud.nacosconfigsample;
  2. import javax.annotation.PostConstruct;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.beans.factory.annotation.Value;
  5. @Configuration
  6. public class NacosConfigDemo {
  7. @Value("${user.name}")
  8. private String userName;
  9. @Value("${user.age}")
  10. private int userAge;
  11. @PostConstruct
  12. public void init() {
  13. System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
  14. }
  15. }

启动 Nacos Config 应用

首先,你需要编译你的工程

  1. cd /home/shell/nacos-config-sample && mvn clean package

首次编译可能需要花费 1~3 分钟;
待编译完成以后,启动程序

  1. java -jar /home/shell/nacos-config-sample/target/nacos-config-sample-0.0.1-SNAPSHOT.jar

启动完成后,你会看到下面的日志,代表启动过程中读取到了 nacos 服务端的配置数据:

  1. [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,内容如下:

  1. management.endpoints.jmx.exposure.include=*
  2. management.endpoints.web.exposure.include=*
  3. management.endpoint.health.show-details=always
  4. # Actuator Web 访问端口
  5. management.server.port=8081

因此,应用 nacos-config-sample 无需调整,直接访问:http://127.0.0.1:8081/actuator/nacos-config,服务响应的内容如下:

  1. {
  2. "NacosConfigProperties": {
  3. "serverAddr": "127.0.0.1:8848",
  4. "username": "",
  5. "password": "",
  6. "encode": null,
  7. "group": "DEFAULT_GROUP",
  8. "prefix": null,
  9. "fileExtension": "properties",
  10. "timeout": 3000,
  11. "maxRetry": null,
  12. "configLongPollTimeout": null,
  13. "configRetryTime": null,
  14. "enableRemoteSyncConfig": false,
  15. "endpoint": null,
  16. "namespace": null,
  17. "accessKey": null,
  18. "secretKey": null,
  19. "contextPath": null,
  20. "clusterName": null,
  21. "name": null,
  22. "sharedConfigs": null,
  23. "extensionConfigs": null,
  24. "refreshEnabled": true,
  25. "sharedDataids": null,
  26. "refreshableDataids": null,
  27. "extConfig": null,
  28. "configServiceProperties": {
  29. "secretKey": "",
  30. "namespace": "",
  31. "username": "",
  32. "enableRemoteSyncConfig": "false",
  33. "configLongPollTimeout": "",
  34. "configRetryTime": "",
  35. "encode": "",
  36. "serverAddr": "127.0.0.1:8848",
  37. "maxRetry": "",
  38. "clusterName": "",
  39. "password": "",
  40. "accessKey": "",
  41. "endpoint": ""
  42. }
  43. },
  44. "RefreshHistory": [
  45. ],
  46. "Sources": [
  47. {
  48. "lastSynced": "2020-09-14 11:11:37",
  49. "dataId": "nacos-config-sample.properties"
  50. },
  51. {
  52. "lastSynced": "2020-09-14 11:11:37",
  53. "dataId": "nacos-config-sample"
  54. }
  55. ]
  56. }