文章目录

  • 1 摘要
  • 2 核心 Maven 依赖
  • 3 核心代码
    • 3.1 bootstrap 配置文件
    • 3.2 application 配置文件
    • 3.3 配置测试类 - Controller 层
    • 3.4 Nacos 配置中心
  • 4 测试配置
    • 4.1 测试配置中心是否生效
    • 4.2 测试配置修改实时刷新
    • 4.3 多环境配置测试
  • 5 推荐参考资料
  • 6 Github 源码


1 摘要

Nacos 作为阿里开源的微服务分布式组件,除了作为服务注册中心之外,自身也提供分布式配置功能,而且还是自动刷新的。这比基于 Netflix Eureka 实现的 Config 配置使用起来要方便的多。本文将介绍基于 Spring Cloud Alibaba 2.2 集成分布式配置服务。

Spring Cloud Alibaba Github: https://github.com/alibaba/spring-cloud-alibaba

准备工作:

Alibaba Nacos 安装教程

2 核心 Maven 依赖

./cloud-alibaba-config/pom.xml
    <dependencies><!-- cloud alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>${spring-cloud-alibaba.version}</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>${spring-cloud-alibaba.version}</version></dependency><!-- 省略其他依赖 --></dependencies><dependencyManagement><dependencies><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>

其中 ${spring-cloud-alibaba.version} 的版本为 2.2.3.RELEASE

注意事项: Spring Cloud Alibaba 2.2.3.RELEASE 版本支持的 Spring Boot 版本为 2.3.1.RELEASE ,建议在搭建项目时要保持版本的一致性,Spring Boot 版本过高或过低都可能导致不兼容问题

3 核心代码

3.1 bootstrap 配置文件

Spring Boot 加载配置文件的顺序: bootstrap.properties > bootstrap.yml > application.properties > application.yml

bootstrap.properties/yml 的配置信息不会被 application.properties/yml 中的配置所覆盖

这里若要使 Spring Cloud Alibaba Nacos 的 Config 配置生效,必须使用 bootstrap.properties 配置文件

./cloud-alibaba-config/src/main/resources/bootstrap.properties
## bootstrap config## spring
spring.profiles.active=test
spring.application.name=cloud-alibaba-config
spring.cloud.nacos.server-addr=172.16.140.10:8688
spring.cloud.nacos.config.file-extension=yaml

配置简要说明:

spring.profiles.active : 指定当前的环境,Nacos Config 是支持多环境的,和 SpringBoot 的配置类似

spring.application.name: 应用名称,Nacos 服务注册中心的服务名称,Nacos Config 配置文件的文件名(不包含后缀)

spring.cloud.nacos.server-addr:Nacos 服务注册中心地址,包括 ip 和端口

spring.cloud.nacos.config.file-extension: Nacos Config 配置文件的文件后缀(常用 propertiess/yaml)

3.2 application 配置文件

./cloud-alibaba-config/src/main/resources/application.yml
## config## server
server:port: 8614

这里既用了 bootstrap 配置,又用了 application 配置,是因为 Nacos Config 的配置必须放在 bootstrap 中才会生效,application 配置中用于服务端口以及其他Spring 相关的配置项。

3.3 配置测试类 - Controller 层

./cloud-alibaba-config/src/main/java/com/ljq/demo/springboot/alibaba/config/controller/NacosConfigController.java
package com.ljq.demo.springboot.alibaba.config.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Description: Spring Cloud Alibaba Nacos 分布式配置中心控制层* @Author: junqiang.lu* @Date: 2020/12/9*/
@Slf4j
@RestController
@RefreshScope
@RequestMapping("/api/cloud/alibaba/config")
public class NacosConfigController {/*** 用户名*/@Value("${userInfo.name: default}")private String userName;/*** 用户年龄*/@Value("${userInfo.age: 0}")private Integer userAge;/*** 用户手机号*/@Value("${userInfo.phone: default}")private String userPhone;/*** 用户信息** @return*/@GetMapping(value = "/user", produces = {MediaType.APPLICATION_JSON_VALUE})public ResponseEntity<String> queryUserInfo() {StringBuilder userBuilder = new StringBuilder();userBuilder.append("用户名:").append(userName).append(",年龄:").append(userAge).append(",手机号:").append(userPhone);log.info("@Value 用户信息: {}", userBuilder.toString());return ResponseEntity.ok(userBuilder.toString());}}

简要说明:

@Value :Spring 注解,用于读取配置信息

@RefreshScope: Spring 注解,表示配置更新后能够同步刷新,保证当前使用的配置是最新的。只有添加这个注解,当配置中心的信息修改时才能够同步到程序中。

为了测试 Nacos Config 的多环境配置,这里单独写了一个测试类

./cloud-alibaba-config/src/main/java/com/ljq/demo/springboot/alibaba/config/controller/NacosConfigProfileController.java
package com.ljq.demo.springboot.alibaba.config.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Description: Spring Cloud Alibaba Config 多环境测试控制层* @Author: junqiang.lu* @Date: 2020/12/13*/
@Slf4j
@RestController
@RefreshScope
@RequestMapping("/api/cloud/alibaba/config")
public class NacosConfigProfileController {/*** 当前环境*/@Value("${currentProfile: default}")private String currentProfile;/*** 当前环境** @return*/@GetMapping(value = "/profile", produces = {MediaType.APPLICATION_JSON_VALUE})public ResponseEntity<String> queryUserInfo() {log.info("当前环境: {}", this.currentProfile);return ResponseEntity.ok(this.currentProfile);}}

3.4 Nacos 配置中心

打开 Nacos 控制台,点击「配置管理」下的「配置列表」项,在右侧界面添加配置。

Nacos 控制台配置列表界面

Nacos 控制台添加配置界面

这里作为测试示例,添加了三个配置,分别是:

配置一:

Data ID: cloud-alibaba-config
Group: DEFAULT_GROUP
配置格式: YAML

配置内容:

## endpoint
management:endpoints:web:exposure:include: "*"## user
userInfo:name: xxxage: 0phone: xxx

配置二:

Data ID: cloud-alibaba-config-dev
Group: DEFAULT_GROUP
配置格式: YAML

配置内容:

## endpoint
management:endpoints:web:exposure:include: "*"## user
userInfo:name: 张三疯age: 36phone: 13123453333currentProfile: dev

配置三:

Data ID: cloud-alibaba-config-test.yaml
Group: DEFAULT_GROUP
配置格式: YAML

配置内容:

## endpoint
management:endpoints:web:exposure:include: "*"## user
userInfo:name: 马保国age: 69phone: 13123456666currentProfile: test

4 测试配置

4.1 测试配置中心是否生效

在 Spring Boot 项目中的 bootstrap 配置中不设置激活环境,即:

## 注释掉当前行
#spring.profiles.active=test

启动配置服务(cloud-alibaba-config)

部分启动日志:

2020-12-20 10:48:49.148  WARN 86608 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Ignore the empty nacos configuration and get it based on dataId[cloud-alibaba-config.yaml] & group[DEFAULT_GROUP]
2020-12-20 10:48:49.150  INFO 86608 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-cloud-alibaba-config.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-cloud-alibaba-config,DEFAULT_GROUP'}]
2020-12-20 10:48:49.156  INFO 86608 --- [           main] .l.d.s.a.c.CloudAlibabaConfigApplication : No active profile set, falling back to default profiles: default

日志显示已经读取到 Nacos 配置中心的配置,并且表明没事设置当前环境

接口请求测试:

请求地址:

http://127.0.0.1:8614/api/cloud/alibaba/config/user

请求方式: GET

返回结果:

用户名:xxx,年龄: 0,手机号:xxx

对比上边的配置 cloud-alibaba-config 发现,Nacos 配置已经生效

4.2 测试配置修改实时刷新

在 Nacos 控制台修改 cloud-alibaba-config 中的配置,将 userInfo.namexxx 改为 xxx666

在修改发布之后,后台已经接受到修改的信息,并在控制台打印出相关日志

2020-12-20 10:59:05.755  INFO 86608 --- [.16.140.10_8688] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [userInfo.name]

再一次测试 4.1 中的接口

返回结果:

用户名:xxx666,年龄: 0,手机号:xxx

此时,更新后的配置已经生效

至此,一个分布式配置中心已经搭建完成

4.3 多环境配置测试

在 Spring Boot 项目中的 bootstrap 配置中激活环境设置为 dev,即:

spring.profiles.active=dev

重新启动配置服务(cloud-alibaba-config)

接口请求测试:

接口一:

使用 4.1 中的接口配置,返回结果为:

用户名:xxx666,年龄: 0,手机号:xxx

从返回结果可以看出, cloud-alibaba-config-dev 中的配置并没有生效,而生效的依然是 cloud-alibaba-config 中的配置。

那么是不是 Nacos Config 不支持环境配置?

且看下边的测试

将 Spring Boot 项目中的 bootstrap 配置中激活环境设置为 test,即:

spring.profiles.active=test

重新启动配置服务(cloud-alibaba-config)

接口请求测试:

接口一:

使用 4.1 中的接口配置,返回结果为:

用户名:马保国,年龄: 69,手机号: 13123456666

接口二:

请求只有 cloud-alibaba-config-test.yaml 中才有的配置

接口请求测试:

请求地址:

http://127.0.0.1:8614/api/cloud/alibaba/config/profile

请求方式: GET

返回结果:

test

这一次的测试结果显示,多环境的配置时生效的,如果指定环境的配置中包含默认的配置,则会覆盖掉默认的配置

cloud-alibaba-config-test.yaml 中的配置会覆盖 cloud-alibaba-config 中的配置

测试到这里,基本可以下一个结论了:

在使用 Nacos Config 在配置多环境的时候,指定环境的配置文件必须包含后缀名,否则不会生效

(这真是个大坑,作者当时添加 cloud-alibaba-config 配置的时候没有添加后缀名,测试生效了,以为多环境的配置也可以不用后缀名,结果折腾了半天,一直找不到原因,最后再一次仔细看了官方文档,然后用对比测试的方法才发现这一特性)

至此,基于 Spring Cloud Alibaba 2.2 的分布式配置中心已经搭建完成了。

5 推荐参考资料

官方文档: Spring Cloud Alibaba Nacos Config

Spring Cloud Alibaba系列教程 - Spring Cloud Alibaba 服务配置

6 Github 源码

Gtihub 源码地址 : https://github.com/Flying9001/springBootDemo

个人公众号:404Code,分享半个互联网人的技术与思考,感兴趣的可以关注.

Spring Cloud Alibaba Nacos 分布式配置中心相关推荐

  1. Spring Cloud Alibaba —— Nacos Config 配置中心

    导航 引言 一.什么是配置中心 二.常见的配置中心组件 三.Nacos Config 入门 四.Nacos Config 动态配置 4.1 硬编码方式(默认支持动态生效) 4.2 属性注入 五.配置共 ...

  2. Spring Cloud Alibaba Nacos 分布式配置

    Spring Cloud Alibaba 分布式配置 1. 简介 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持.使用 Spr ...

  3. Spring Cloud Alibaba——Nacos服务配置中心

    Nacos服务配置中心 建Module 改Pom 改yml Nacos端操作 写启动类 写controller层 测试 Tips 简单记录下使用Nacos作为服务配置中心,此篇建立在上篇的Nacos服 ...

  4. Spring Cloud入门-Config分布式配置中心(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Spring Cloud Config 简介 在Git仓库中准备配置信息 配置仓库目录结构 master分支下的配置信息 dev分支下的配置信息 ...

  5. Spring Cloud 如何选择分布式配置中心

    ##微服务必备的几样武器有了,才能独闯武林, 有哪几样呢? 注册中心(eureka, consul, zk, etcd) 配置中心 (Spring Cloud Config, disconf ) AP ...

  6. Spring Cloud Alibaba Nacos 的 2 种健康检查机制!

    作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注 ...

  7. nacos 配置动态刷新_使用 Spring Cloud Alibaba Nacos Config 作为配置中心

    什么是 Nacos Config 在分布式系统中,由于服务数量巨多,为了方便服务 配置文件统一管理,实时更新,所以需要分布式配置中心组件. Spring Cloud Alibaba Nacos Con ...

  8. SpringCloud Alibaba - Nacos 作为配置中心 读取Properties配置信息

    SpringCloud Alibaba是阿里巴巴致力于对微服务的管理.配置.注册等一整套的解决方案. 简介 Nacos 提供用于存储配置和其他元数据的 K-V 存储,为分布式系统中的外部化配置提供服务 ...

  9. 513、Java Spring Cloud Alibaba -【Spring Cloud Alibaba Nacos】 2021.08.30

    目录 1.Nacos简介 2.使用 Docker 快速搭建 Nacos 1.4 2.1 从 git 上 clone 项目: 2.2 clone 完成后,进入 naocs-docker 目录: 2.3 ...

最新文章

  1. Python 技术篇-将python项目打包成exe独立运行程序,pyinstaller库打包python代码实例演示
  2. c语言switch自动贩卖机,JAVA程式-自动贩卖机SWITCHCASE.doc
  3. Linux日常命令使用记录
  4. Istio入门:架构原理及在k8s部署
  5. python pep8
  6. 规范HTML页的几点注意
  7. 智伴机器人广西团队_实力加冕 | 柳工喜获全国机器人焊接竞赛三连冠
  8. 数据结构和算法(02)---字符串(c++)
  9. imageNamed和dataWithContentsOfFile的区别(1)
  10. open cv+C++错误及经验总结(三)
  11. HITWH-PYTHON学习笔记(2)-20170706
  12. 浙江大学计算机科学与技术学院工业设计,浙江大学工业设计专业
  13. 二十七、动词不定式 万事开头难
  14. 使用百度地图API创建第一个电子地图
  15. linux 文件操作write详解
  16. [Linux Kernel] memory-barriers 内存屏蔽 官方文档
  17. 同功能不同的代码,差别呢?
  18. 48 个免费的设计素材网站收好,以后不怕没资源用!
  19. Android利用WiFiManager扫描AP列表的实例
  20. AntV G6修改节点label样式

热门文章

  1. ZOJ 3964 NIM变形
  2. 微信小程序入门篇(二)
  3. 已知分布函数求概率密度例题_【考研数学】考试重点、难点和常考题型:?随机变量及其分布...
  4. LeetCode 713. 乘积小于 K 的子数组
  5. 2022年将成为海外直播带货的发展元年?-跨境知道
  6. 使用js打印时去除页眉页脚
  7. 引导方法深度补全系列—基于SPN模型—1—《Depth estimation via affinity learned with convolutional spatial propagat》文章细读
  8. top命令-linux
  9. 如何优雅地蹭邻居家的wifi
  10. 基于Castle ActiveRecord开发Domain Model详解(一)对象关系到数据表的映射