找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3894

积分

0

好友

535

主题
发表于 3 天前 | 查看: 15| 回复: 0

Nacos 教程封面

上次我们探讨了 OpenFeign 的架构原理,这次我们把目光转向 Nacos。作为服务注册中心与配置中心的业界标杆,Nacos 已经非常成熟。在深入其架构原理之前,我们先来一篇使用教程作为开胃菜。

本篇将涵盖 Nacos 的两个核心应用场景:

  • 用 Nacos 作为注册中心
  • 用 Nacos 作为配置中心

教程内容可能略显枯燥,建议快速浏览并收藏,以备后续查阅。所有示例将基于我的开源 SpringCloud 项目 PassJava 进行演示。

开源地址: https://github.com/Jackson0714/PassJava-Platform
喜欢的小伙伴可以点个 Star 支持一下。

下图是 PassJava 项目的整体架构图,其中包含了 Nacos 作为核心组件的位置:

PassJava 系统架构图

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

一、Nacos 作为注册中心

1.1 引入 Nacos 服务发现组件

passjava-common 模块的 pom.xml 文件中引入 Nacos 服务发现组件。

<!-- nacos discovery 服务发现组件-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

1.2 下载 Nacos Server 工具包并启动

注意:此步骤在 Windows 和 Mac 系统上均测试通过。

  • 下载 Nacos Server:从 GitHub Release 页面 下载压缩包。
  • 启动 Server:解压后,进入 nacos/bin 目录,根据操作系统执行相应命令:
    • Linux/Unix/Mac:执行 sh startup.sh -m standalone
    • Windows:执行 cmd startup.cmd

Windows 启动问题:若执行 startup.cmd 时遇到 “Please set the JAVA_HOME variable...” 错误。

  • 解决方案:编辑 startup.cmd 文件,将 %JAVA_HOME% 替换为你本地 JDK 的绝对路径,例如:C:\Program Files\Java\jdk1.8.0_131

启动成功后的终端日志示例如下:

Nacos Server 启动成功日志

1.3 每个微服务都配置 Nacos Server 地址

passjava-questionpassjava-channelpassjava-contentpassjava-memberpassjava-study 等微服务的 /src/main/resources/application.yml 配置文件中,添加 Nacos Server 地址。

spring:
   cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

1.4 添加注解

在每个微服务的主启动类上添加 @EnableDiscoveryClient 注解,以开启服务注册与发现功能。

@EnableDiscoveryClient
@MapperScan("com.jackson0714.passjava.question.dao")
@SpringBootApplication
public class PassjavaQuestionApplication {

    public static void main(String[] args) {
        SpringApplication.run(PassjavaQuestionApplication.class, args);
    }

}

1.5 配置微服务的名称

在微服务的 application.yml 中,配置其应用名称。

spring:
  application:
    name: passjava-question

1.6 访问 Nacos Server 后台

  • 登录后台:浏览器访问 http://localhost:8848/nacos
    • 用户名:nacos
    • 密码:nacos
      Nacos 登录界面
  • 查看已注册的服务:登录后,在“服务管理”->“服务列表”中,可以看到所有成功注册的微服务。
    passjava-channel 渠道微服务
    passjava-member 用户微服务
    passjava-study 学习微服务
    passjava-question 问题微服务
    passjava-content 内容微服务

    Nacos 服务列表

二、Nacos 作为配置中心

在传统的单体或微服务架构中,配置管理通常是一个痛点。Nacos 作为配置中心,提供了动态刷新、多环境管理等强大功能,能显著提升配置管理的效率和灵活性。

2.1 传统配置方式的局限

我们先看一个传统的配置方式:

  1. application.properties 中定义配置:
    member.nickname = "悟空聊架构"
    member.age = "18"
  2. 在控制器中使用 @Value 注解获取配置:

    @Value("${member.nickname}")
    private String nickname;
    
    @Value("${member.age}")
    private Integer age;
  3. 编写测试接口:
    @RequestMapping("/test-local-config")
    public R testLocalConfig() {
        return R.ok().put("nickname", nickname).put("age", age);
    }
  4. 测试结果:
    传统配置方式测试结果

缺点:若要修改配置,必须重启服务。在服务众多的分布式系统中,这无疑是低效且不可取的。有没有办法实现不停机更新配置呢?答案是肯定的,使用 Nacos 作为配置中心即可。

2.2 引入 Nacos Config 依赖

PassJava-Common 项目的 pom.xml 中引入 Spring Cloud Alibaba Nacos Config 依赖。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.3 配置 Nacos 元数据

passjava-member 服务中添加 /src/main/resources/bootstrap.properties 配置文件(bootstrap.properties 的优先级高于其他配置文件),并配置 Nacos Server 地址。

bootstrap.properties 文件位置

spring.application.name=passjava-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

2.4 Nacos 后台新增配置

登录 Nacos 控制台,在“配置管理”->“配置列表”中,点击“+”创建新配置。

  • Data ID: passjava-member.properties
  • Group: DEFAULT_GROUP
  • 配置内容:
    member.nick="悟空"
    member.age=10

    Nacos 后台新增配置界面

2.5 开启动态刷新配置功能

在需要动态刷新配置的类上添加 @RefreshScope 注解。

@RefreshScope
@RestController
@RequestMapping("member/sample")
public class SampleController {}

当你在 Nacos 控制台修改配置并发布后,应用日志中会出现类似信息,表明配置已动态刷新:

Refresh keys changed: [member.age]
... [notify-ok] dataId=passjava-member.properties, group=DEFAULT_GROUP ...

2.6 测试结果

访问接口:http://localhost:10000/member/sample/test-local-config

返回结果中的 nicknameage 将与 Nacos 后台的配置一致。这说明我们只需在 Nacos 后台修改配置,即可实时生效,无需重启服务。注意:Nacos 中的配置项优先级高于本地 application.properties 中的配置。

动态配置刷新测试结果

2.7 命名空间 (Namespace)

在微服务体系中,不同服务通常需要独立的配置。Nacos 的命名空间功能可以用于实现配置的隔离。

  1. 创建命名空间:在 Nacos 控制台“命名空间”菜单下,为每个微服务创建一个命名空间(例如:passjava-member)。
    创建命名空间
    命名空间列表
  2. 在命名空间下创建配置:切换到对应的命名空间(如 passjava-member),然后为该服务创建配置。也可以通过“克隆”功能从 public 空间复制配置。
    选择命名空间
    克隆配置到指定命名空间
  3. 应用指定命名空间:在微服务的 bootstrap.properties 中配置要使用的命名空间 ID。
    spring.cloud.nacos.config.namespace=passjava-member
  4. 测试:修改 passjava-member 命名空间下的配置,重启服务(首次绑定命名空间需重启)后访问接口,确认获取的是指定命名空间的配置。
    编辑passjava-member命名空间下的配置

2.8 分组 (Group)

为了区分开发、测试、生产等不同环境,可以使用 Nacos 的分组功能。

  1. 创建多套环境配置:在 Nacos 中,为同一配置(Data ID)创建多个分组,如 devtestprod,并分别设置不同的值。
    dev 环境配置
    dev、test、prod 分组列表
  2. 应用指定分组:在 bootstrap.properties 中配置当前激活的分组。
    spring.cloud.nacos.config.group=prod
  3. 测试:访问接口,确认获取的是 prod 分组下的配置值。

2.9 多配置集 (Extension Configs)

我们可以将传统的 application.yml 中繁杂的配置(如数据源、MyBatis、其他自定义配置)拆分成多个独立的配置文件,并托管到 Nacos,实现更精细化的管理。这对于管理复杂的应用配置,尤其是在多环境场景下,非常有帮助。

2.9.1 在配置中心新建拆分后的配置

  1. datasource.yml:存放数据源配置。
    datasource.yml 配置
  2. mybatis.yml:存放 MyBatis-Plus 相关配置。
    mybatis.yml 配置
  3. more.yml:存放其他配置,如应用名、Nacos 注册中心地址等。
    more.yml 配置

2.9.2 克隆配置到多环境

dev 分组下的上述三个配置文件,克隆到 testprod 分组,并可按环境修改具体值。
多环境多配置集列表

2.9.3 应用端配置多配置集

bootstrap.properties 中,通过 extension-configs 数组来加载多个配置集。同时,可以注释掉本地 application.yml 中的相应配置。

spring.application.name=passjava-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

spring.cloud.nacos.config.namespace=passjava-member
spring.cloud.nacos.config.group=dev

# 加载多配置集
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true

spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true

spring.cloud.nacos.config.extension-configs[2].data-id=more.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true

2.9.4 测试配置是否生效

  • 测试基本配置和 more.yml:访问 http://localhost:10000/member/sample/test-local-config,应返回 Nacos 中配置的昵称、年龄,并且服务端口为 more.yml 中定义的 10000
  • 测试 datasource.ymlmybatis.yml:访问一个数据库查询接口(如 http://localhost:10000/member/member/list),若能正常返回数据,则说明数据源和 MyBatis 配置生效。

2.10 更多配置项

Nacos Config 提供了丰富的配置项,用于满足各种定制化需求。以下是一些常用配置的总结:

Nacos Config 常用配置项列表

2.11 使用 Nacos 作为配置中心总结

  1. 引入依赖:添加 spring-cloud-starter-alibaba-nacos-config
  2. 配置数据源:在 bootstrap.properties 中配置 Nacos Server 地址 (spring.cloud.nacos.config.server-addr)。
  3. 配置中心操作:在 Nacos 控制台创建配置,指定 Data Id 和配置内容。
  4. 开启动态刷新:在需要动态刷新的 Bean 上添加 @RefreshScope 注解。
  5. 获取配置:使用 @Value(“${key}”) 获取配置值。
  6. 配置优先级:Nacos 远程配置优先级高于本地配置。
  7. 服务隔离:使用命名空间 (namespace) 为不同微服务创建独立的配置空间。
  8. 环境隔离:使用分组 (group) 来区分不同环境(如 dev, test, prod)。
  9. 配置拆分:使用多配置集 (extension-configs) 将不同类别的配置(数据源、框架、业务)拆分开管理。

通过以上步骤,你可以充分运用 Nacos 配置中心来管理你的Spring Cloud Alibaba微服务应用配置,实现配置的集中化、动态化和环境化管理。如果你想了解更多关于微服务和数据库中间件的深度实践,欢迎在云栈社区交流探讨。


后记:关于 Nacos 的底层架构原理,我们将在后续的文章中详细剖析。本篇教程旨在帮助大家快速上手,解决实际项目中的配置管理难题。




上一篇:微服务注册中心技术选型:Zookeeper、Eureka、Nacos、Consul与K8s对比
下一篇:Nacos 推送轨迹功能详解:微服务配置与注册问题排查实践
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-10 16:08 , Processed in 0.435144 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表