Spring Cloud Alibaba 整合 Nacos 实现服务配置中心
在之前的文章 《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
工程项目地址在:
- Github:https://github.com/JeffLi1993/springcloud-learning-example/tree/master/springcloud-nacos-config-sample
- Gitee:https://gitee.com/jeff1993/springcloud-learning-example/tree/master/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
指定了服务端口 8083spring.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 设置对应的配置
- 如何在工程中通过依赖和注解关联上对应的外化配置
参考资料
- 官方案例:https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example
- 官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
- https://blog.didispace.com/spring-cloud-alibaba-nacos-config-2/
代码示例地址
本文案例,可以查看开源项目 springcloud-learning-example 中的 springcloud-nacos-config-sample 模块:
- Github:https://github.com/JeffLi1993/springcloud-learning-example
- Gitee:https://gitee.com/jeff1993/springcloud-learning-example
以下系列教程推荐
作者:泥瓦匠 (公号「程序员泥瓦匠」)出处:https://www.bysocket.com 欢迎转载,也请保留这段声明。谢谢!
Spring Cloud Alibaba 整合 Nacos 实现服务配置中心的更多相关文章
- Spring Cloud Alibaba 使用Nacos作为服务注册中心
为什么需要注册中心? 在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用:服务管理,核心是有个服务注册表,心跳机制动态维护 : 服务注册 创建普通Spring ...
- Spring Cloud Alibaba(4)---Nacos(注册中心)
Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...
- Spring Cloud Alibaba(5)---Nacos(配置中心)
Nacos(配置中心) 有关Spring Cloud Alibaba之前写过四篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring C ...
- Spring Cloud Alibaba(2)---Nacos概述
Spring Cloud Alibaba(2)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...
- Spring Cloud Alibaba(3)---Nacos概述
Spring Cloud Alibaba(3)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...
- Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本
Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...
- Spring Cloud Alibaba整合Sentinel
Spring Cloud Alibaba 整合 Sentinel 一.需求 二.实现步骤 1.下载 sentinel dashboard 2.服务提供者和消费者引入sentinel依赖 3.配置控制台 ...
- spring cloud 入门系列八:使用spring cloud sleuth整合zipkin进行服务链路追踪
好久没有写博客了,主要是最近有些忙,今天忙里偷闲来一篇. =======我是华丽的分割线========== 微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单 ...
- 9.Spring Cloud Config统一管理微服务配置
Spring Cloud Config统一管理微服务配置 9.1. 为什么要统一管理微服务配置 9.2. Spring Cloud Config简介 Spring Cloud Config为分布式系统 ...
随机推荐
- Python批量爬取谷歌原图,2021年最新可用版
文章目录 前言 一.环境配置 1.安装selenium 2.使用正确的谷歌浏览器驱动 二.使用步骤 1.加载chromedriver.exe 2.设置是否开启可视化界面 3.输入关键词.下载图片数.图 ...
- Windows应用开发中程序窗口中的各种图标尺寸规划
为了让你的图标在各个视图模式下都能有合适的尺寸,需要制作4种尺寸16x16.32x32.48x48.256x256 在Windows系统中,几乎所有窗口都是ListView,其中的图标都按照指定的尺寸 ...
- Linux常见目录结构
目录 描述 /home 包含Linux系统上各用户的主目录,子目录默认以该用户名命名 /etc 包含Linux系统上大部分的配置文件,建议修改配置文件之前先备份 /var 该目录存放不经常变化的数据, ...
- Winform开发的快速、健壮、解耦的几点建议
在Winform开发领域开发过十多年的项目中,见证着形形色色的架构和官方技术的应用,从最早类似Winform模式的WebForm技术,到接着的JQuery+界面组件,再到Asp.net Core的技术 ...
- 『学了就忘』Linux软件包管理 — 49、拓展:Linux中通过脚本安装程序
目录 1.脚本程序简介 2.Webmin安装 (1)简介 (2)安装 (3)使用 1.脚本程序简介 脚本程序包并不多见,所以在软件包分类中并没有把它列为一类.它更加类似于Windows下的程序安装,有 ...
- 从零开始,使用Dapr简化微服务
序言 现有的微服务模式需要再业务代码中集成大量基础设施模块,比如注册中心,服务发现,服务调用链路追踪,请求熔断,重试限流等等,使得系统过于臃肿重量级. Dapr作为新一代微服务模式,使用sidecar ...
- MySQL 在线开启&关闭GTID模式
MySQL 在线开启&关闭GTID模式 目录 MySQL 在线开启&关闭GTID模式 基本概述 在线开启GTID 1. 设置GTID校验ENFORCE_GTID_CONSISTENCY ...
- 描述高频题之队列&栈
栈和队列 全文概览 基础知识 栈 栈是一种先进后出的数据结构.这里有一个非常典型的例子,就是堆叠盘子.我们在放盘子的时候,只能从下往上一个一个的放:在取的时候,只能从上往下一个一个取,不能从中间随意取 ...
- CF1373G
考虑中间格子不能有相同的点,其实是没用的. 其唯一用处是用来规定最后的是无法重叠的. 我们可以证明最后位置的无重叠和中间不重叠是充要的. 那显然可以我们对每个点往后连边: 形式的话的说: 对 \((x ...
- 洛谷 P3214 - [HNOI2011]卡农(线性 dp)
洛谷题面传送门 又是一道我不会的代码超短的题( 一开始想着用生成函数搞,结果怎么都搞不粗来/ll 首先不妨假设音阶之间存在顺序关系,最终答案除以 \(m!\) 即可. 本题个人认为一个比较亮的地方在于 ...