在之前的文章 《Nacos 本地单机版部署步骤和使用》 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能

一、Nacos 动态配置服务是什么?

官方是这么说的:

Nacos 动态配置服务是什么?

动态配置服务可以以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

Nacos 控制台的功能

Nacos 提供了一个简洁易用的 UI (控制台样例 Demo) 用来管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

二、实战:Nacos 实现服务配置中心

下面通过两个大模块实现:

  • 在 Nacos 中新建或修改配置
  • 在 Spring Cloud 应用中加载 Nacos 配置

2.1 在 Nacos 新建配置

根据上篇文章,部署运行 Nacos ,然后打开配置管理 - 配置列表页面。地址: http://localhost:8848/nacos/index.html#/configurationManagement

点击右上角创建按钮,进入新建配置页面,新建配置如图所示:

配置详解:

  • Data ID :配置为 config-service.yml 。Data ID 是指定配置且保证全局唯一性。
  • Group :默认配置为 DEFAULT_GROUP,不需要修改。
  • 配置格式 : 选择 YAML 配置文件格式
  • 配置内容 : 具体配置的内容。这里简单配置了个键值对,其实实际应用场景,会配置包括存储配置、端口配置和各种中间件配置等

Nacos Data ID 标准格式如下:

${prefix}-${spring.profiles.active}.${file-extension}

其中:

  • prefix :默认为 spring.application.name 的值
  • spring.profiles.active:该案例为空,一般指定 dev test 等环境配置
  • file-extension:配置内容格式

2.2 创建 Spring Cloud 应用

1、创建应用

新建工程,工程名为:springcloud-nacos-config-sample

工程项目地址在:

2、配置 pom 依赖

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>springcloud</groupId>
<artifactId>springcloud-nacos-config-sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-nacos-config-sample :: Nacos 服务配置中心案例</name> <!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent> <dependencies> <!-- Nacos Config 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency> <!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<optional>true</optional>
</dependency> </dependencies> <dependencyManagement>
<dependencies> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.2.2.RELEASE</version>
</dependency> <!-- Spring Cloud Hoxton.SR12 版本依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency> </dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build> </project>

其中依赖了:

  • Spring Cloud Alibaba Nacos Config 依赖
  • Spring Cloud Hoxton.SR12 版本依赖

3、创建配置文件

在应用工程的 resources 目录下,创建 application.yml 文件,填入如下信息:

server:
port: 8083 # 服务端口 spring:
application:
name: config-service # 服务名称

其中:

  • server.port 指定了服务端口 8083
  • spring.application.name 指定了服务名称 config-service ,要跟 Nacos 后台新建配置的 Data ID 值保持一致。

为啥呢?因为看一下 Nacos Config 源码 org.springframework.cloud.alibaba.nacos.client.NacosPropertySourceLocator#locate 。源码如下:

if (StringUtils.isEmpty(dataIdPrefix)) {
dataIdPrefix = env.getProperty("spring.application.name");
}

如果 Data ID 没有配置,则读取 spring.application.name 服务名称配置。

继续创建 bootstrap.yml 文件,填入以下信息:

spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # Nacos 配置中心地址
file-extension: yml # 配置文件格式

其中:

  • nacos.config.server-addr 指定了 Nacos 地址和端口
  • nacos.config.file-extension 指定了配置文件格式为 yml

4、创建测试类和启动类

新建 Spring Cloud 应用启动类 ConfigApplication,代码如下:

/**
* Spring Boot 服务启动类
*
* Created by bysocket.com on 21/12/06.
*/
@SpringBootApplication // Spring Boot 应用标识
public class ProviderApplication { public static void main(String[] args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(ProviderApplication.class,args);
}
}

然后新建测试控制类 ConfigController,代码如下:

/**
* Config 案例
* <p>
* Created by bysocket.com on 21/12/07.
*/
@RestController
@Slf4j
@RefreshScope
@Data
public class ConfigController { @Value("${blog.name}")
private String blogName; @GetMapping("/get")
public String get() {
return "ConfigController#get blog name = " + getBlogName();
}
}

代码详解如下:

  • @Value 注解 :@Value 对 Bean 的字段或者方法参数进行标注,职责是基于表达式给字段或方法参数设置默认属性值。通常格式是注解 + SpEL 表达式,如 @Value("SpEL 表达式")。
  • @RefreshScope 注解 :允许在运行时动态刷新 Bean 的 Scope 实现。如果 Bean 被刷新,则在下次访问 Bean 即执行方法时,会创建一个新实例。这说明在应用运行时,在 Nacos 控制台修改了对应配置的值后,会同时修改和生效该 Bean 这个值,达到动态配置的效果。

5、运行测试

启动上面的应用,会在控制台看到如下信息:

2021-12-09 20:11:43.399  INFO 13909 --- [-127.0.0.1_8848] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'config-service.yml', group: 'DEFAULT_GROUP'
2021-12-09 20:11:43.400 INFO 13909 --- [-127.0.0.1_8848] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-config-service.yml'}]

这里可以看出,已经加载了 Nacos 配置信息 dataId: 'config-service.yml'group: 'DEFAULT_GROUP'

最后在浏览器打开地址 http://localhost:8083/get ,响应如图所示:

动态配置测试

然后去 Nacos 控制台,配置列表点击修改 config-service.yml 配置。将 www.bysocekt.com 改成 bysocket.com,然后确认发布。如图所示:

可以从控制台看到如下日志:

2021-12-09 20:31:30.747  INFO 13909 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [blog.name]

重新访问下浏览器该地址 http://localhost:8083/get ,响应如图所示:

说明动态刷新配置成功。

三、Nacos 实现分布式配置小结

本文详细介绍了Spring Cloud 整合 Nacos 实现服务分布配置。关键两点:

  • 如何在 Nacos 设置对应的配置
  • 如何在工程中通过依赖和注解关联上对应的外化配置

参考资料

代码示例地址

本文案例,可以查看开源项目 springcloud-learning-example 中的 springcloud-nacos-config-sample 模块:

以下系列教程推荐

作者:泥瓦匠 (公号「程序员泥瓦匠」)出处:https://www.bysocket.com 欢迎转载,也请保留这段声明。谢谢!

Spring Cloud Alibaba 整合 Nacos 实现服务配置中心的更多相关文章

  1. Spring Cloud Alibaba 使用Nacos作为服务注册中心

    为什么需要注册中心? 在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用:服务管理,核心是有个服务注册表,心跳机制动态维护 : 服务注册 创建普通Spring ...

  2. Spring Cloud Alibaba(4)---Nacos(注册中心)

    Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...

  3. Spring Cloud Alibaba(5)---Nacos(配置中心)

    Nacos(配置中心) 有关Spring Cloud Alibaba之前写过四篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring C ...

  4. Spring Cloud Alibaba(2)---Nacos概述

    Spring Cloud Alibaba(2)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...

  5. Spring Cloud Alibaba(3)---Nacos概述

    Spring Cloud Alibaba(3)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...

  6. Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本

    Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...

  7. Spring Cloud Alibaba整合Sentinel

    Spring Cloud Alibaba 整合 Sentinel 一.需求 二.实现步骤 1.下载 sentinel dashboard 2.服务提供者和消费者引入sentinel依赖 3.配置控制台 ...

  8. spring cloud 入门系列八:使用spring cloud sleuth整合zipkin进行服务链路追踪

    好久没有写博客了,主要是最近有些忙,今天忙里偷闲来一篇. =======我是华丽的分割线========== 微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单 ...

  9. 9.Spring Cloud Config统一管理微服务配置

    Spring Cloud Config统一管理微服务配置 9.1. 为什么要统一管理微服务配置 9.2. Spring Cloud Config简介 Spring Cloud Config为分布式系统 ...

随机推荐

  1. 3组-Alpha冲刺-1/6

    一.基本情况 队名:发际线和我作队 组长博客:链接 小组人数:10 二.冲刺概况汇报 黄新成(组长) 过去两天完成了哪些任务 文字描述 组织会议,讨论了alpha冲刺的分工,确定了收集数据的渠道,为拍 ...

  2. 使用bs4中的方法爬取星巴克数据

    import urllib.request # 请求url url = 'https://www.starbucks.com.cn/menu/' # 模拟浏览器发出请求 response = urll ...

  3. 如何将rabbitmq集群中的某个节点移除.

    首先将要移除的节点停机. root@rabbitmq-03:~# rabbitmqctl stop Stopping and halting node 'rabbit@rabbitmq-03' ... ...

  4. 题解 P6345 [CCO 2017]接雨滴

    解题思路 NOIP在即,感觉即将退役,或许是最后一篇题解了... 求水的体积不是特别好求,我们考虑求出 水+柱子 的体积最后再减去柱子的体积. 发现对于最高的柱子在中间的情况其实可以把最高柱子一侧的柱 ...

  5. [atARC066F]Contest with Drinks Hard

    先不考虑修改,那么很明显即对于每一个极长的的区间,若其长度为$l$,有${l+1\choose 2}$的贡献 考虑dp去做,即$f_{i}$表示前$i$个数最大的答案,则$$f_{i}=\max(\m ...

  6. 五、Zookeeper的Shell操作

    前文 一.CentOS7 hadoop3.3.1安装(单机分布式.伪分布式.分布式 二.JAVA API实现HDFS 三.MapReduce编程实例 四.Zookeeper3.7安装 Zookeepe ...

  7. 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」让我们一起探索一下DefaultMQPushConsumer的实现原理及源码分析

    RocketMQ的前提回顾 RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆 ...

  8. 【NetWork】-- 网络原理

    2019-07-18  21:00:25  by冲冲 1. 网络拓扑 把网络中的计算机和通信设备抽象为一个点,把传输介质抽象为一条线,由点和线组成的几何图形就是计算机网络的拓扑结构(Network T ...

  9. 《重学Java高并发》Sempahore的使用场景与常见误区

    大家好,我是威哥,<RocketMQ技术内幕>一书作者,荣获RocketMQ官方社区优秀布道师.CSDN2020博客执之星Top2等荣誉称号.目前担任中通快递技术平台部资深架构师,主要负责 ...

  10. 7.1 k8s使用configmapg 给pod内的程序提供配置文件

    ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中.使用时, Pods 可以将其用作环境变量.命令行参数或者存储卷中的配置文件. 以下以nginx镜像提供配置文件为例镜像演示 ...