Spring Cloud 整合 Nacos 实现服务配置中心 - Spring Cloud Alibaba 系列教程

简介: 在之前的文章 [《Nacos 本地单机版部署步骤和使用》](https://www.bysocket.com/2021-12-05/nacos-install-mysql.html) 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能

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

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

image.png

官方是这么说的:

Nacos 动态配置服务是什么?

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

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

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

Nacos 控制台的功能

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

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

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

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

2.1 在 Nacos 新建配置

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

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

image.png

配置详解:

  • 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 ,响应如图所示:

image.png

动态配置测试

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

image.png

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

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 ,响应如图所示:

image.png

说明动态刷新配置成功。

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

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

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

参考资料

代码示例地址

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

以下系列教程推荐

(本文完)

相关文章
|
2月前
|
存储 Java Nacos
Spring Cloud+Nacos+KMS 动态配置最佳实践
本文讲述了 Spring Cloud 应用中结合 Nacos 实现了运行期配置动态更新的功能,以及在此基础上结合 KMS 在不改动代码的情况下对应用使用的敏感配置进行保护,解决将配置迁移到 Nacos 中可能存在的数据安全顾虑,并对其底层工作原理做了简单介绍。
488 15
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
105 5
|
2月前
|
存储 人工智能 Java
Spring AI Alibaba 配置管理,用 Nacos 就够了
本文通过一些实操案例展示了 Spring AI Alibaba + Nacos 在解决 AI 应用中一系列复杂配置管理挑战的方案,从动态 Prompt 模板的灵活调整、模型参数的即时优化,到敏感信息的安全加密存储。Spring AI Alibaba 简化了对接阿里云通义大模型的流程,内置 Nacos 集成也为开发者提供了无缝衔接云端配置托管的捷径,整体上极大提升了 AI 应用开发的灵活性和响应速度。
243 13
|
3月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
192 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
3月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
4月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
3月前
|
负载均衡 算法 Nacos
SpringCloud 微服务nacos和eureka
SpringCloud 微服务nacos和eureka
80 0
|
3月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
67 0
|
3月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
249 2
|
8天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)