通过本教程的前两篇《使用 Nacos 实现服务注册与发现》和《支持的几种服务消费方式( RestTemplate、WebClient、Feign )》,我们已经学会了,如何利用 Nacos 实现服务的注册与发现。同时,也介绍了在 Spring Cloud 中,我们可以使用的几种不同编码风格的服务消费方式。接下来,我们再来学习一下 Nacos 的另外一个重要能力:配置管理。
Nacos 除了实现了服务的注册发现之外,还将配置中心功能整合在了一起。通过 Nacos 的配置管理功能,我们可以将整个架构体系内的所有配置都集中在 Nacos 中存储。这样做的好处,在以往的教程中介绍 Spring Cloud Config 时也有提到,主要有以下几点:
Nacos 的配置管理模型与淘宝开源的配置中心 Diamond 类似,基础层面都通过DataId
和Group
来定位配置内容,除此之外还增加了很多其他的管理功能。
下面我们通过一个简单的例子来介绍如何在 Nacos 中创建配置内容以及如何在 Spring Cloud 应用中加载 Nacos 的配置信息。
第一步:进入 Nacos 的控制页面,在配置列表功能页面中,点击右上角的“+”按钮,进入“新建配置”页面,如下图填写内容:
其中:
Data ID
:填入alibaba-nacos-config-client.properties
Group
:不修改,使用默认值DEFAULT_GROUP
配置格式
:选择Properties
配置内容
:应用要加载的配置内容,这里仅作为示例,做简单配置,比如:didispace.title=spring-cloud-alibaba-learning
第一步:创建一个 Spring Boot 应用,可以命名为:alibaba-nacos-config-client
。
第二步:编辑pom.xml
,加入必要的依赖配置,比如:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
</dependencies>
上述内容主要三部分:
parent
:定义 spring boot 的版本dependencyManagement
:spring cloud 的版本以及 spring cloud alibaba 的版本,由于 spring cloud alibaba 还未纳入 spring cloud 的主版本管理中,所以需要自己加入dependencies
:当前应用要使用的依赖内容。这里主要新加入了 Nacos 的配置客户端模块:spring-cloud-starter-alibaba-nacos-config
。由于在dependencyManagement
中已经引入了版本,所以这里就不用指定具体版本了。可以看到,这个例子中并没有加入 nacos 的服务发现模块,所以这两个内容是完全可以独立使用的
第三步:创建应用主类,并实现一个 HTTP 接口:
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Slf4j
@RestController
@RefreshScope
static class TestController {
@Value("${didispace.title:}")
private String title;
@GetMapping("/test")
public String hello() {
return title;
}
}
}
内容非常简单,@SpringBootApplication
定义是个 Spring Boot 应用;还定义了一个 Controller,其中通过@Value
注解,注入了 key 为didispace.title
的配置(默认为空字符串),这个配置会通过/test
接口返回,后续我们会通过这个接口来验证 Nacos 中配置的加载。另外,这里还有一个比较重要的注解@RefreshScope
,主要用来让这个类下的配置内容支持动态刷新,也就是当我们的应用启动之后,修改了 Nacos 中的配置内容之后,这里也会马上生效。
第四步:创建配置文件bootstrap.properties
,并配置服务名称和 Nacos 地址
spring.application.name=alibaba-nacos-config-client
server.port=8001
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
注意:这里必须使用
bootstrap.properties
。同时,spring.application.name
值必须与上一阶段 Nacos 中创建的配置 Data Id 匹配(除了.properties 或者.yaml 后缀)。
第五步:启动上面创建的应用。
2019-01-27 18:29:43.497 INFO 93597 --- [ main] o.s.c.a.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'alibaba-nacos-config-client.properties', group: 'DEFAULT_GROUP'
2019-01-27 18:29:43.498 INFO 93597 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-config-client.properties'}]}
在启动的时候,我们可以看到类似上面的日志信息,这里会输出应用程序要从 Nacos 中获取配置的 dataId 和 group。如果在启动之后,发现配置信息没有获取到的时候,可以先从这里着手,看看配置加载的目标是否正确。
第六步:验证配置获取和验证动态刷新
用 curl 或者 postman 等工具,访问接口: localhost:8001/test
,一切正常的话,将返回 Nacos 中配置的spring-cloud-alibaba-learning
。然后,再通过 Nacos 页面,修改这个内容,点击发布之后,再访问接口,可以看到返回结果变了。
同时,在应用的客户端,我们还能看到如下日志:
2019-01-27 18:39:14.162 INFO 93597 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [didispace.title]
在 Nacos 中修改了 Key,在用到这个配置的应用中,也自动刷新了这个配置信息。
本文示例读者可以通过查看下面仓库的中的alibaba-nacos-config-client
项目:
如果您对这些感兴趣,欢迎 star、follow、收藏、转发给予支持!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.