SpringBoot3整合Nacos V2.3.2的详细过程

 更新时间:2024年11月20日 10:33:51   作者:CoderJia  
本文介绍了如何在 Spring Boot 3.2.x 项目中整合 Nacos 2.3.2,包括依赖配置、Nacos 服务发现与动态配置的配置方法,通过整合 Nacos,Spring Boot 应用可以实现高效的服务发现、动态配置管理以及分布式系统中的灵活扩展,感兴趣的朋友跟随小编一起看看吧

随着微服务架构的广泛应用,服务注册与发现的需求变得越来越重要。Nacos(Dynamic Naming and Configuration Service 首字母)作为一个开源的、动态的服务发现与配置管理平台,已成为许多开发者的首选工具。Spring Boot 与 Nacos 的整合能够帮助开发者快速实现服务注册、配置管理以及动态控制等功能。

本文将详细介绍如何将 Spring Boot 3.2.xNacos 2.3.2 进行整合,包括功能介绍、版本依赖、整合过程中的细节及效果演示。

1. Nacos 简介与功能

Nacos 是一个易于使用的、支持多种服务发现和配置管理的开源项目。它提供了如下核心功能:

  • 服务发现与健康检查:支持通过 HTTP、DNS 和 gRPC 协议进行服务注册与发现,同时可以对注册的服务进行健康检查。
  • 动态配置管理:提供配置管理功能,允许开发者在不重启服务的情况下修改应用配置,并实时生效。
  • 动态 DNS 服务:支持通过 DNS 查询服务实例的地址,实现更加灵活的服务发现。
  • 分布式配置管理:能够为不同的环境、应用提供差异化的配置管理。

版本说明

Nacos 1.x 已经停止功能维护,请尽快升级到 2.x 版本。并且 Nacos 版本依赖 SpringBoot、Spring Cloud 的版本,对于刚刚升级到 springboot3 的小伙伴来说,会遇到很多莫名其妙的问题,大多数都是由于版本依赖造成的问题,建议直接到官网找推荐的版本组合,springcloud alibaba与springboot版本对应。

亲测 SpringBoot 3.2.x + Nacos 2.3.2 + SpringCloud 2023.0.1.0 组合可用,下面介绍也将基于此版本组合讲解。

2. Spring Boot 3.2.x 与 Nacos 2.3.2 整合的步骤

2.1 运行Nacos服务

多种运行方式见官网:https://nacos.io/docs/latest/quickstart/quick-start/,本地直接使用docker安装即可运行。

Nacos 2.x 除了 8848 端口以为还需要占用以下端口,如果云服务器部署需要放行端口号。

兼容性说明见:https://nacos.io/docs/v2/upgrading/version2-compatibility/

运行nacos服务后,还需设置密码,创建命名空间,新建配置等。

2.2 添加依赖

首先,你需要在 Spring Boot 项目中添加 Nacos 的相关依赖。Nacos 提供了一个官方的 Spring Cloud Alibaba 依赖包来支持 Spring Boot 项目的集成。

修改 pom.xml 文件,添加如下依赖:

<dependencies>
    <!-- Spring Boot Web依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Boot与Nacos整合的核心依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2023.0.1.0</version> <!-- 与Spring Boot 3.2.x兼容 -->
    </dependency>
    <!-- 配置管理依赖,如果你需要配置管理功能 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2023.0.1.0</version>
    </dependency>
    <!--提供了引导配置的支持,允许应用程序在启动时从外部配置中心(如 Nacos、Consul、Config Server 等)加载配置。-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
        <version>4.1.4</version>
    </dependency>
</dependencies>

注意:这里的 spring-cloud-starter-alibaba-nacos-discoveryspring-cloud-starter-alibaba-nacos-config 是 Spring Cloud Alibaba 相关的 starter。2023.0.1.0 版本与 Spring Boot 3.2.x 兼容。

2.3 配置 Nacos 连接

bootstrap.propertiesbootstrap.yml 文件中,配置 Nacos 服务的连接信息。配置如下:

为什么要bootstrap.yml?用在应用程序启动的早期阶段,通过 bootstrap.yml 或 bootstrap.properties 文件加载配置,这些配置可以在主应用配置之前生效。spring-cloud-starter-bootstrap 提供了引导配置的支持。

spring:
  application:
    name: spring-boot3-14-nacos
  profiles:
    active: local # 切换环境
  cloud:
    nacos:
      config:
        server-addr: 1.94.x.x:8848
        namespace: c77472dd-768c-42b0-8755-b6d87af491cf # 填命名空间id
        file-extension: yaml
        group: DEFAULT_GROUP
        refresh-enabled: true
        # 如果开启认证的话需要用户名和密码
        username: nacosu
        password: nacosu
      discovery:
        server-addr: 1.94.26.81:8848
        namespace: c77472dd-768c-42b0-8755-b6d87af491cf
        # 如果开启认证的话需要用户名和密码
        username: nacosu
        password: nacosu

配置项说明

更多关于 spring-cloud-starter-alibaba-nacos-config 的 starter 配置项如下所示:

配置项key默认值说明
服务端地址spring.cloud.nacos.config.server-addr服务器 ip 和端口
DataId 前缀spring.cloud.nacos.config.prefix${spring.application.name}DataId 的前缀,默认值为应用名称
Groupspring.cloud.nacos.config.groupDEFAULT_GROUP分组
DataId 后缀及内容文件格式spring.cloud.nacos.config.file-extensionpropertiesDataId 的后缀,同时也是配置内容的文件格式,目前只支持 properties、yaml
配置内容的编码方式spring.cloud.nacos.config.encodeUTF-8配置的编码
获取配置的超时时间spring.cloud.nacos.config.timeout3000单位为 ms
配置的命名空间spring.cloud.nacos.config.namespace常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。
AccessKeyspring.cloud.nacos.config.access-key
SecretKeyspring.cloud.nacos.config.secret-key
相对路径spring.cloud.nacos.config.context-path服务端 API 的相对路径
接入点spring.cloud.nacos.config.endpoint地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否开启监听和自动刷新spring.cloud.nacos.config.refresh-enabledtrue
集群服务名spring.cloud.nacos.config.cluster-name

推荐方式

由于配置写到配置文件中,不便于修改不同环境的参数,且容易泄露敏感信息,一般建议如下写法:

spring:
  application:
    name: spring-boot3-14-nacos
  profiles:
      active: ${PROFILE}
  cloud:
    nacos:
      discovery:
        server-addr: ${DISCOVERY_SVC}
        namespace: ${NAMESPACE_ID}
        username: ${NACOS_USER}
        password: ${NACOS_PWD}
      config:
        server-addr: ${DISCOVERY_SVC}
        namespace: ${NAMESPACE_ID}
        group: ${GROUP}
        file-extension: yaml
        username: ${NACOS_USER}
        password: ${NACOS_PWD}

启动时使用命令行参数给配置赋值:

--spring.application.json={\"PROFILE\":\"dev\",\"DISCOVERY_SVC\":\"1.94.x.x:8848\",\"NAMESPACE\":\"demo\",\"GROUP\":\"DEFAULT_GROUP\",\"NAMESPACE_ID\":\"c77472dd-768c-42b0-8755-b6d87af491cf\",\"NACOS_USER\":\"nacosu\",\"NACOS_PWD\":\"nacosu\"}

2.4 配置 Nacos 注册与发现

@SpringBootApplication 或其他配置类上添加 @EnableDiscoveryClient 启用 Nacos 服务发现功能:

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
  public static void main(String[] args) {
    SpringApplication.run(NacosProviderApplication.class, args);
  }
  @RestController
  class EchoController {
    @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
    public String echo(@PathVariable String string) {
      return "Hello Nacos Discovery " + string;
    }
  }
}

服务发现

2.5 配置 Nacos 动态配置功能

如果你想使用 Nacos 的配置管理功能,可以在应用中添加配置类, Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:

代码示例

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
    @Value("${useLocalCache:false}")
    private boolean useLocalCache;
    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}

效果

3. 常见问题与解决方法

3.1 连接 Nacos 失败

如果 Spring Boot 应用无法连接 Nacos 服务,可能是以下原因:

  • 检查 spring.cloud.nacos.discovery.server-addr 配置项的地址是否正确。
  • 确保 Nacos 服务端口未被防火墙或其他网络配置阻塞,8848、9848、9845。
  • 配置文件未使用 bootstrap.yml 或者 bootstrap.properties 。

3.2 服务未能成功注册到 Nacos

  • 确认 @EnableDiscoveryClient 注解是否正确添加到启动类。
  • 确认 spring.application.name 配置项是否设置为应用名称。
  • 检查 Nacos 控制台中是否存在其他错误信息。

3.3 服务注册成功,配置拿不到

首先排除掉版本兼容问题,其他可能原因:

  • namespace 配置项错误填入了 namesapce 名称,应该填 namespaceId。
  • dataId 的完整格式 ${prefix}-${spring.profiles.active}.${file-extension},当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

3.4 No spring.config.import property has been defined

产生问题的原因是 bootstrap.yml 比 application.properties 的优先级要高。由于 bootstrap.yml 是系统级的资源配置文件,是用在程序引导执行时更加早期配置信息读取;但是在SpringCloud 2020.* 以后版本把 bootstrap 禁用了,导致在读取文件的时候读取不到而报错,所以我们只要把 bootstrap 从新导入进来就会生效了。

        <!--提供了引导配置的支持,允许应用程序在启动时从外部配置中心(如 Nacos、Consul、Config Server 等)加载配置。-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>4.1.4</version>
        </dependency>

4. 总结

本文介绍了如何在 Spring Boot 3.2.x 项目中整合 Nacos 2.3.2,包括依赖配置、Nacos 服务发现与动态配置的配置方法。通过整合 Nacos,Spring Boot 应用可以实现高效的服务发现、动态配置管理以及分布式系统中的灵活扩展。希望通过本篇博客,您能顺利完成 Spring Boot 与 Nacos 的整合,并提升开发效率和系统的灵活性。

到此这篇关于SpringBoot3-如何整合Nacos V2.3.2的文章就介绍到这了,更多相关SpringBoot整合Nacos内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的Semaphore信号量使用方法代码实例

    Java中的Semaphore信号量使用方法代码实例

    这篇文章主要介绍了Java中的Semaphore信号量使用方法代码实例,Semaphore是一种基于计数的信号量,它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞,需要的朋友可以参考下
    2023-11-11
  • Java BufferedOutputStream类的常用方法讲解

    Java BufferedOutputStream类的常用方法讲解

    这篇文章主要介绍了Java BufferedOutputStream类的常用方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot Redis实现接口幂等性校验方法详细讲解

    SpringBoot Redis实现接口幂等性校验方法详细讲解

    这篇文章主要介绍了SpringBoot Redis实现接口幂等性校验方法,近期一个老项目出现了接口幂等性校验问题,前端加了按钮置灰,依然被人拉着接口参数一顿输出,还是重复调用了接口,通过复制粘贴,完成了后端接口幂等性调用校验
    2022-11-11
  • SpringBoot使用Feign调用其他服务接口

    SpringBoot使用Feign调用其他服务接口

    这篇文章主要介绍了SpringBoot使用Feign调用其他服务接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java实现的数字签名算法RSA完整示例

    Java实现的数字签名算法RSA完整示例

    这篇文章主要介绍了Java实现的数字签名算法RSA,结合完整实例形式详细分析了RSA算法的相关概念、原理、实现方法及操作技巧,需要的朋友可以参考下
    2019-09-09
  • Java之HashMap案例详解

    Java之HashMap案例详解

    这篇文章主要介绍了Java之HashMap案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java反射机制概念、原理与用法总结

    Java反射机制概念、原理与用法总结

    这篇文章主要介绍了Java反射机制概念、原理与用法,较为详细的分析了java反射机制的概念、原理,并结合实例形式总结分析了java反射机制的具体使用方法与相关注意事项,需要的朋友可以参考下
    2017-11-11
  • spring eurake中使用IP注册及问题小结

    spring eurake中使用IP注册及问题小结

    在开发spring cloud的时候遇到一个很奇葩的问题,就是服务向spring eureka中注册实例的时候使用的是机器名,然后出现localhost、xxx.xx等这样的内容,这篇文章主要介绍了spring eurake中使用IP注册,需要的朋友可以参考下
    2023-07-07
  • 如何使用Java实现指定概率的抽奖

    如何使用Java实现指定概率的抽奖

    这篇文章主要给大家介绍了关于如何使用Java实现指定概率的抽奖的相关资料,Java抽奖程序的基本原理是通过随机数生成器来实现随机抽奖的功能,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • SpringMVC RESTFul及REST架构风格介绍

    SpringMVC RESTFul及REST架构风格介绍

    这篇文章主要为大家介绍了SpringMVC RESTFul及REST架构风格介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论