大家好,前两篇我们已经完成了Spring Boot+Nacos的环境搭建、微服务注册发现,以及基于OpenFeign的服务通信,成功实现了order-service调用user-service的简单场景。上一篇末尾预告了Nacos的另一个核心功能——配置中心,今天就手把手教大家实操,解决“微服务配置散乱、修改配置需重启服务”的痛点,全程实操无废话,新手跟着走就能掌握!
温馨提示:实操前请确认前提(避免踩坑):① 已完成前两篇的实操,Nacos服务端能正常启动,user-service和order-service能成功注册到Nacos;② 版本保持一致:Spring Boot 2.6.13 + Spring Cloud Hoxton.SR12 + Nacos 2.0.7(和前两篇完全一致,避免版本兼容问题);③ 关闭之前启动的user-service和order-service,本篇将修改两个服务的配置,重新集成Nacos配置中心。

一、先搞懂:Nacos配置中心到底能解决什么问题?

前两篇我们创建的微服务,配置文件(application.yml)都是放在各自服务的resources目录下,这种方式在微服务集群中会有3个致命问题,也是配置中心要解决的核心痛点:

  1. 配置散乱:每个微服务都有自己的配置文件,集群中服务越多,配置维护越麻烦(比如修改数据库地址,需要逐个修改每个服务的配置文件);

  2. 配置不统一:容易出现“某个服务配置错误”(比如数据库密码输错),导致服务调用失败,排查起来耗时费力;

  3. 修改配置需重启服务:每次修改配置文件(比如调整日志级别、修改接口超时时间),都需要重启微服务才能生效,生产环境中重启服务会影响用户使用,极其不友好。

而Nacos配置中心,就是将所有微服务的配置文件“集中管理”,实现两个核心目标:① 统一配置,一次修改,所有关联服务生效;② 动态更新,修改配置后无需重启服务,实时生效。

形象点说:之前每个微服务的配置都是“私人笔记”,各自保管、各自修改;Nacos配置中心就是“公共笔记本”,所有微服务的配置都记在上面,修改公共笔记本,所有微服务都能实时看到最新内容,不用再单独修改自己的笔记。

二、实操核心:Nacos配置中心的3个关键步骤

本篇实操分为3个核心环节,循序渐进:① 在Nacos控制台创建配置(公共笔记本写配置);② 给微服务集成Nacos配置中心依赖(微服务关联公共笔记本);③ 测试配置加载和动态更新(验证功能是否生效)。

重点说明:我们将先给user-service集成配置中心,测试成功后,再给order-service集成(两个服务集成步骤一致,可快速复用),同时演示“多环境配置”(开发环境、测试环境、生产环境),贴合实际开发场景。

三、第一步:在Nacos控制台创建配置(核心操作)

先启动Nacos服务端(双击bin目录下的startup.cmd,确保黑窗口不关闭),打开Nacos控制台(http://localhost:8848/nacos,用户名/密码nacos/nacos),进入“配置管理→配置列表”,点击“+”号,创建配置。

3.1 创建user-service的开发环境配置
配置信息如下(重点关注红框/加粗项,按下面的内容填写,不要出错):

  1. 数据ID:user-service-dev.yml(核心!数据ID的命名规范:服务名称-环境名称.yml,必须严格遵守,否则微服务找不到配置)

解释:user-service是服务名称(和spring.application.name一致),dev是环境名称(开发环境,后续可扩展test、prod),yml是配置文件格式;

  1. 配置格式:选择YAML(和我们之前写的application.yml格式一致);

  2. 环境:选择DEV(开发环境,和数据ID中的dev对应,可选,方便分类管理);

  3. 配置内容:复制以下内容(替换之前user-service的application.yml配置,新增一些自定义配置,方便测试动态更新):

server:
  port: 8081  # 服务端口,和之前一致

spring:
  application:
    name: user-service  # 服务名称,必须和数据ID中的服务名称一致
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  # Nacos注册中心地址(和之前一致)
        username: nacos
        password: nacos

# 自定义配置(新增,用于测试动态更新,可自行定义)
user:
  info:
    name: testUser-dev  # 开发环境的用户名
    age: 25
    desc: 这是user-service的开发环境配置,来自Nacos配置中心
  1. 点击“发布”,配置创建成功,回到配置列表,能看到刚刚创建的“user-service-dev.yml”配置。
    (易错点提醒:① 数据ID命名错误,比如写成user-dev.yml、user-service-dev,都会导致微服务无法加载配置;② 配置内容缩进错误,YAML格式对缩进要求严格,建议直接复制上面的内容,避免手动缩进出错)

3.2 (可选)创建user-service的测试环境配置(贴合实际开发)

实际开发中,我们会有开发、测试、生产等多个环境,配置不同(比如数据库地址不同),这里演示创建测试环境配置,方便大家后续扩展:
再次点击“+”号,创建配置:

  1. 数据ID:user-service-test.yml;

  2. 配置格式:YAML;

  3. 环境:TEST;

  4. 配置内容(仅修改自定义配置,模拟测试环境差异):

server:
  port: 8081

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos

# 测试环境自定义配置(和开发环境区分)
user:
  info:
    name: testUser-test
    age: 25
    desc: 这是user-service的测试环境配置,来自Nacos配置中心

点击“发布”,此时配置列表中有两个user-service的配置(dev和test),后续可通过配置切换环境。

四、第二步:给微服务集成Nacos配置中心(以user-service为例)

微服务要加载Nacos控制台的配置,需要添加Nacos配置中心依赖,修改配置文件,让微服务知道“去哪里找Nacos的配置”。

4.1 添加Nacos配置中心依赖

打开user-service的pom.xml文件,添加以下依赖(放在标签内),和之前的Nacos注册依赖配合使用:

<!-- Nacos配置中心客户端依赖,用于加载Nacos中的配置 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

添加完成后,点击IDEA右侧“Maven→刷新”,下载依赖(避免依赖未加载,导致配置无法生效)。

4.2 修改微服务配置文件(关键!)

之前我们用的是application.yml文件,现在需要新增一个bootstrap.yml文件(优先级高于application.yml),用于配置“Nacos配置中心的连接信息”——微服务启动时,会先加载bootstrap.yml,根据里面的配置去Nacos拉取对应的配置,再加载application.yml(如果有的话)。
操作步骤:

  1. 删除user-service中原有的application.yml文件(避免配置冲突,后续所有配置都从Nacos拉取);

  2. 新建bootstrap.yml文件(src/main/resources目录下),添加以下配置:

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848  # Nacos配置中心地址(和Nacos服务端地址一致)
        username: nacos  # Nacos登录用户名
        password: nacos  # Nacos登录密码
        file-extension: yml  # 配置文件格式(和Nacos控制台创建的配置格式一致,是yml不是yaml)
  profiles:
    active: dev  # 激活的环境,对应Nacos配置的环境(dev=开发环境,test=测试环境)

配置说明(重点记,避免踩坑):

  1. spring.cloud.nacos.config.server-addr:Nacos配置中心的地址,必须和Nacos服务端地址一致(localhost:8848),否则微服务找不到配置中心;

  2. file-extension:配置文件格式,我们创建的是yml格式,这里必须写yml(不能写yaml,否则会报错);

  3. spring.profiles.active:激活的环境,比如配置为dev,微服务会自动去Nacos拉取“user-service-dev.yml”的配置;如果改为test,就会拉取“user-service-test.yml”的配置,实现环境快速切换。

4.3 编写接口,测试配置加载
我们新增一个接口,读取Nacos配置中心的自定义配置(user.info相关),验证微服务是否成功加载Nacos的配置:

  1. 打开user-service的UserController类,添加以下代码(注入配置,编写接口):
package com.example.userservice.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    // 1. 注入Nacos配置中心的自定义配置(@Value注解,格式:${配置key})
    @Value("${user.info.name}")
    private String userName;

    @Value("${user.info.age}")
    private Integer userAge;

    @Value("${user.info.desc}")
    private String userDesc;

    // 原有接口(查询用户信息)
    @GetMapping("/user/{id}")
    public String getUserInfo(@PathVariable("id") Integer id) {
        return "用户ID:" + id + ",用户名:" + userName + ",年龄:" + userAge;
    }

    // 2. 新增接口,专门返回Nacos中的配置信息,用于测试
    @GetMapping("/user/config")
    public String getUserConfig() {
        return "Nacos配置信息:\n用户名:" + userName + ",年龄:" + userAge + ",描述:" + userDesc;
    }
}
}

说明:@Value(“${配置key}”)注解用于读取配置中心的配置,配置key就是我们在Nacos中写的“user.info.name”“user.info.age”,必须和Nacos配置中的key完全一致,否则无法注入。

4.4 启动user-service,验证配置加载

  1. 启动user-service的主启动类(无需修改,和之前一致);

  2. 启动成功后,先查看Nacos控制台的“服务列表”,确认user-service已注册成功(状态健康);

  3. 测试接口,验证配置加载:打开浏览器,访问http://localhost:8081/user/config;

  4. 若返回以下内容,说明微服务成功加载了Nacos配置中心的开发环境配置:

Nacos配置信息:

用户名:testUser-dev,年龄:25,描述:这是user-service的开发环境配置,来自Nacos配置中心

(常见问题:加载失败排查3点:① bootstrap.yml配置错误(比如Nacos地址、file-extension写错);② 数据ID命名错误,和服务名称、环境名称不匹配;③ Nacos配置中心的配置未发布,或配置内容缩进错误)

4.5 给order-service集成配置中心(快速复用)

order-service的集成步骤和user-service完全一致,简化讲解,重点关注差异点:

  1. 添加Nacos配置中心依赖(和user-service的依赖一样,复制pom.xml中的依赖即可);

  2. 在Nacos控制台创建order-service的配置:

数据ID:order-service-dev.yml,配置格式YAML,环境DEV,配置内容如下:

server:
  port: 8082  # order-service的端口,和之前一致

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos

# order-service的自定义配置
order:
  info:
    name: testOrder-dev
    desc: 这是order-service的开发环境配置,来自Nacos配置中心
  1. 删除order-service原有的application.yml,新建bootstrap.yml,配置如下:
spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        file-extension: yml
  profiles:
    active: dev
  1. 启动order-service,访问接口(可自行编写读取配置的接口),验证配置加载成功即可。

五、第三步:测试Nacos配置动态更新(核心亮点)

Nacos配置中心的最大亮点就是“动态更新”——修改Nacos控制台的配置,无需重启微服务,配置就能实时生效,这也是我们使用配置中心的核心原因,下面手把手测试:

  1. 确保user-service已启动,浏览器保持访问http://localhost:8081/user/config的页面(当前显示的是dev环境的初始配置);

  2. 打开Nacos控制台,进入“配置管理→配置列表”,找到“user-service-dev.yml”,点击“编辑”;

  3. 修改自定义配置(比如修改user.info.name和user.info.desc),示例:

user:
  info:
    name: testUser-dev-update  # 修改后的用户名
    age: 25
    desc: 这是user-service的开发环境配置,来自Nacos配置中心(已动态更新)
  1. 点击“发布”,发布成功后,Nacos会提示“配置发布成功,是否通知相关服务?”,选择“通知”;
  2. 回到浏览器,刷新http://localhost:8081/user/config页面,会发现配置已经更新为修改后的内容,而user-service全程没有重启!

(进阶技巧)配置动态更新的补充说明:

  1. 通知服务:修改配置后,点击“通知”,Nacos会主动推送最新配置给微服务,实现秒级更新;如果忘记通知,微服务也会定期拉取最新配置(默认30秒,可配置拉取间隔);

  2. 配置刷新范围:修改Nacos中的配置,只会影响“激活该环境的微服务”(比如修改user-service-dev.yml,只会影响user-service的dev环境,test环境不受影响);

  3. 敏感配置加密:实际开发中,数据库密码、Token密钥等敏感配置,不能明文写在Nacos中,Nacos支持敏感配置加密(后续进阶篇会讲解),避免配置泄露。

六、实操总结与易错点复盘

本篇我们完成了Nacos配置中心的核心实操,掌握了微服务配置统一管理和动态更新的关键技巧,核心收获如下:

  1. 核心流程:Nacos控制台创建配置(数据ID规范)→ 微服务添加依赖+配置bootstrap.yml → 测试配置加载+动态更新;

  2. 关键知识点:① bootstrap.yml优先级高于application.yml,用于配置Nacos连接信息;② 数据ID命名规范(服务名称-环境名称.yml);③ 环境切换通过spring.profiles.active配置;

  3. 核心价值:解决配置散乱、不统一、修改需重启服务的痛点,提升微服务开发和维护效率。

新手必看易错点(重点避坑,结合前两篇补充):

  1. 数据ID命名错误:这是最常见的坑,必须严格遵循“服务名称-环境名称.yml”,比如user-service-dev.yml,少写后缀、写错服务名称都会导致配置加载失败;

  2. bootstrap.yml配置错误:file-extension写为yaml(正确是yml)、Nacos地址写错,都会导致微服务无法连接配置中心;

  3. 动态更新未生效:修改配置后未点击“通知”,或微服务未启动,可等待30秒(默认拉取间隔),或重启微服务排查;

  4. 依赖冲突:不要同时添加多个版本的Nacos依赖,保持和Spring Cloud版本匹配(本篇依赖无需修改,直接复用)。

七、下一篇预告

前三篇我们已经掌握了SpringCloud的核心基础:Nacos注册中心、OpenFeign服务通信、Nacos配置中心,能搭建一个基础的微服务架构了。下一篇将讲解微服务的“安全保障”——服务熔断与降级,手把手集成Resilience4j(新一代熔断组件),解决“服务雪崩”问题,保护微服务集群的稳定性,避免因某个服务故障导致整个集群瘫痪!

如果这篇实操教程对你有帮助,欢迎点赞、收藏、关注,实操过程中遇到任何问题(比如配置加载失败、动态更新不生效),都可以在评论区留言,我会逐一回复,帮大家解决新手踩坑问题~

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐