通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
注意:
这里我创建Data Id为nacos-config.properties的配置文件,其中Group为默认的DEFAULT_GROUP,配置文件的格式也相应的选择Properties,配置内容中添加配置nacos.config=hello_nacos,如图所示。
方式二:通过调用Nacos Open API向Nacos Server发布配置:dataId为nacos-config.properties,内容为nacos.config=hello_nacos
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos-config.properties&group=DEFAULT_GROUP&content=nacos.config=hello_nacos"
创建服务应用
(1)使用SpringBoot,创建一个名为nacos-config的子工程。
(2)pom.xml文件添加如下依赖。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <!-- 声明Spring cloud的版本为Hoxton.SR3--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 声明Spring cloud alibaba版本为2.1.0.RELEASE --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 声明nacos-discovery依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 声明nacos-config依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> </dependencies>
备注:如果不需要注册该服务,也可以去掉nacos-discovery依赖。
注意:版本2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
更多版本对应关系参考:版本说明 Wiki
(3)修改application.properties添加相关配置
server.port=9002
spring.application.name=nacos-config
spring.application.cloud.nacos.discovery.server-addr=127.0.0.1:8848
(4)创建配置文件,文件名为bootstrap.properties。并在bootstrap.properties中配置Nacos server的地址和应用名。
注意:文件名是bootstrap.xxx,而不是application或者其他。因为Nacos同Spring Cloud Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。SpringBoot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application。
这里的配置文件类型可以根据个人习惯选择,我这里用的时properties类型,配置内容如下:
#服务名称
spring.application.name=nacos-config
#指定注册中心的地址。如果你不需要注册该服务,也可以去掉该项,并删除discovery依赖。
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#指定配置中心的地址。
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定配置中心中配置文件的格式。
#spring.cloud.nacos.config.file-extension=properties
之所以需要配置spring.application.name,是因为它是构成Nacos配置管理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来配置。当spring.profile.active为空时,对应的连接符 - 也将不存在,dataId的拼接格式变成 ${prefix}.${file-extension}。
file-exetension:为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。目前只支持properties和yaml类型。
(5)创建对外接口ConfigController,从nacos中读取配置。
@RefreshScope @RestController public class ConfigController { @Value("${nacos.config}") private String configValue; @RequestMapping("/config/get") public String get() { return configValue; } }
@RefreshScope:Spring Cloud的原生注解,可以使当前类下的配置支持动态更新。
@Value:通过@Value注解,去读取key为nacos.config的配置的值,并通过/config/get接口返回。
到此代码部分的工作已经完成。
启动服务进行测试
(1)保证Nacos-Server已经启动。
(2)检查Nacos-Server中配置列表中是否已经添加相应的配置文件。
(3)启动nacos-config项目。
(4)启动成功后在Nacos控制台中可以看到我们注册的服务。
(5)此时调用接口进行测试http://127.0.0.1:9002/config/get,可以看到返回结果。
此时说明已经成功读取到配置。
(6)下面我将Nacos-Server上的配置修改为hello_lars,看看能否动态更新。修改Nacos-Server上的配置后,刷新http://127.0.0.1:9002/config/get页面,结果更新为新的配置了。
可以看到我通过Nacos-server的控制台进行配置的修改,客户端服务nacos-config也相应的进行热更新。