Spring Boot 整合 Nacos 注册中心终极指南

在微服务架构中,配置管理和动态路由是核心需求。Nacos 作为阿里巴巴开源的动态服务发现、配置管理和服务管理平台,能够帮助开发者实现配置热更新、多环境共享配置以及动态路由管理。本文将结合 Spring BootSpring Cloud Gateway,手把手教你实现以下功能:包含版本选择、核心配置、心跳机制及常见问题

  1. 配置热部署:不重启服务实时更新配置(如Redis参数)。
  2. 共享配置:多服务复用同一份公共配置(如公共Redis、数据库连接)。
  3. 动态路由:通过Nacos动态调整网关路由规则

一、环境准备

1.1 组件版本要求

组件推荐版本说明
Spring Boot2.6.x长期支持版本
Spring Cloud Alibaba2021.0.5.0与Spring Boot 2.6.x兼容
Nacos Server2.0.3稳定生产版本

版本匹配至关重要! 参考官方版本关系

1.2 启动Nacos Server

# 单机模式启动(默认端口8848)
sh nacos/bin/startup.sh -m standalone# 访问控制台
http://localhost:8848/nacos
默认账号:nacos/nacos

在这里插入图片描述


二、Spring Boot 整合步骤

2.1 手动添加依赖(可选)

若未通过Initializr创建,需添加:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.0.5.0</version>
</dependency><!-- Spring Cloud 版本管理 -->
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.5.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2.2核心配置

application.yml 配置示例:

spring:application:name: order-service  # 服务名称(Nacos按此名称分组)cloud:nacos:discovery:server-addr: 127.0.0.1:8848  # Nacos地址namespace: dev  # 命名空间ID(非名称)group: PROD_GROUP  # 自定义分组ephemeral: false  # 是否临时实例(默认为true)# 高级配置metadata: version: v1.0region: hangzhou

2.3 启用服务发现

在启动类添加注解:

@SpringBootApplication
@EnableDiscoveryClient  // 关键注解
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}

三、高级配置技巧

3.1 心跳与健康检查

spring:cloud:nacos:discovery:# 心跳间隔(单位ms,默认5000)heart-beat-interval: 3000# 心跳超时(单位ms,默认15000)heart-beat-timeout: 10000# 实例过期时间(单位秒,默认90)instance-expire-seconds: 30

3.2 权重与保护阈值

spring:cloud:nacos:discovery:# 实例权重(0-1,默认1)weight: 0.8# 集群保护阈值(0-1,默认0)protection-threshold: 0.5

3.3 多网卡IP指定

spring:cloud:nacos:discovery:# 指定注册IP(Docker环境常用)ip: 192.168.1.100# 指定IP类型ip-type: IPv4

四、验证服务注册

4.1 检查控制台

登录Nacos控制台 → 服务列表 → 查看服务状态
在这里插入图片描述

4.2 查看注册日志

在应用启动日志中搜索:

2023-10-01 12:00:00 INFO  o.s.c.a.n.registry.NacosServiceRegistry  : nacos registry, order-service 192.168.1.100:8080 register finished

五、常见问题解决方案

5.1 服务未注册排查流程

  1. 检查Nacos Server是否正常运行
  2. 确认spring.cloud.nacos.discovery.server-addr配置正确
  3. 查看客户端日志是否有注册异常
  4. 验证网络连通性(telnet 8848)
  5. 检查版本兼容性

5.2 典型错误处理

错误现象Connection refused (Connection refused)
解决方案

spring:cloud:nacos:discovery:# 使用完整URL格式server-addr: http://nacos.example.com:8848

错误现象no server available
解决方案

// 添加JVM参数指定Nacos地址
-Dspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

以上我们就做好了Nacos的配置接下来实现热部署、共享配置与动态路由

Spring Boot整合Nacos实现热部署、共享配置与动态路由

.项目依赖

pom.xml中添加依赖:

<!-- Spring Cloud Alibaba Nacos Config -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2022.0.0.0</version>
</dependency><!-- Spring Cloud Gateway -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

二、配置热部署与共享配置

1. 配置热更新

目标:修改Nacos中的配置后,应用实时生效(无需重启)。

步骤

  1. 创建配置文件
    在Nacos控制台新建配置,Data IDservice-order.yaml(格式为${spring.application.name}.yaml),内容如下:

    redis:host: 127.0.0.1port: 6379
    
  2. Spring Boot配置
    bootstrap.yml中指定Nacos配置源:

    spring:application:name: service-ordercloud:nacos:config:server-addr: localhost:8848file-extension: yamlnamespace: dev  # 可选,指定命名空间
    
  3. 动态刷新配置
    在需要热更新的Bean上添加@RefreshScope

    @RestController
    @RefreshScope
    public class ConfigController {@Value("${redis.host}")private String redisHost;@GetMapping("/redis-host")public String getRedisHost() {return redisHost;}
    }
    

验证

  • 修改Nacos中redis.host的值,访问/redis-host接口,观察返回值是否实时更新。

2. 共享公共配置

目标:多个服务复用同一份配置(如公共Redis、MySQL连接)。

步骤

  1. 创建共享配置
    在Nacos中新建common-redis.yaml,内容如下:

    redis:host: 192.168.1.100port: 6379password: 123456
    
  2. 服务引用共享配置
    修改服务的bootstrap.yml,添加共享配置:

    spring:cloud:nacos:config:shared-configs:- data-id: common-redis.yamlrefresh: true  # 开启动态刷新
    

优先级

  • 服务私有配置 > 共享配置 > 默认配置。

三、Nacos整合Gateway实现动态路由

目标:通过Nacos动态管理网关路由规则,无需重启网关服务。

1. 配置动态路由
  1. 创建路由配置
    在Nacos中新建gateway-routes.yaml,内容如下(JSON格式):

    routes:- id: user-serviceuri: lb://service-user  # 负载均衡到用户服务predicates:- Path=/user/**filters:- StripPrefix=1
    
  2. Gateway监听Nacos配置
    添加NacosRouteDefinitionRepository类实现动态路由加载:

    @Component
    public class NacosRouteDefinitionRepository implements RouteDefinitionRepository {@Autowiredprivate NacosConfigManager nacosConfigManager;@Overridepublic Flux<RouteDefinition> getRouteDefinitions() {String config = nacosConfigManager.getConfigService().getConfig("gateway-routes.yaml", "DEFAULT_GROUP", 5000);List<RouteDefinition> routes = JSON.parseArray(config, RouteDefinition.class);return Flux.fromIterable(routes);}// 监听配置变化@PostConstructpublic void init() {nacosConfigManager.getConfigService().addListener("gateway-routes.yaml", "DEFAULT_GROUP",new AbstractListener() {@Overridepublic void receiveConfigInfo(String configInfo) {// 触发路由刷新ApplicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));}});}
    }
    
2. 验证动态路由
  • 初始路由生效:访问http://localhost:8080/user/1,请求应转发至service-user服务。
  • 动态更新:在Nacos中修改gateway-routes.yaml,添加新的路由规则,观察网关是否自动生效。

四、总结与最佳实践

核心功能总结
功能实现方案优势
热部署@RefreshScope + Nacos配置监听实时更新配置,避免服务重启
共享配置shared-configs引用公共Data ID统一管理,减少冗余配置
动态路由监听Nacos配置 + RefreshRoutesEvent灵活调整流量,支持灰度发布
注意事项
  1. 配置格式:Nacos中的动态路由需使用JSON或YAML格式。
  2. 性能优化:频繁配置更新可能影响网关性能,建议合理设置刷新间隔。
  3. 安全加固:Nacos配置需设置权限控制,避免敏感信息泄露。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39465.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络基础梳理

为什么要有网络呢&#xff1f; 在一开始科学家们都是自己在计算机当中做实验但是难免需要共同进行科研。假设现在一个业务需要三个人共同完成&#xff0c;那么现在就有问题了&#xff1a; 由于第一个人完成工作前&#xff0c;其他两人无法开始&#xff0c;这导致工作流程是串行…

EMS小车技术特点与优势:高效灵活的自动化输送解决方案

北成新控伺服技术丨EMS小车调试视频 EMS小车是一种基于单轨运行的电动输送系统&#xff0c;通过电力驱动实现物料的高效搬运和输送&#xff0c;具有高效灵活、节能环保、多功能集成、行业适配性强等特性&#xff0c;广泛应用于汽车制造、工程机械、家电生产、仓储物流等行业自动…

Python实现deepseek接口的调用

简介&#xff1a;DeepSeek 是一个强大的大语言模型&#xff0c;提供 API 接口供开发者调用。在 Python 中&#xff0c;可以使用 requests 或 httpx 库向 DeepSeek API 发送请求&#xff0c;实现文本生成、代码补全&#xff0c;知识问答等功能。本文将介绍如何在 Python 中调用 …

2025清华大学:DeepSeek教程全集(PDF+视频精讲,共10份).zip

一、资料列表 第一课&#xff1a;Deepseek基础入门 第二课&#xff1a;DeepSeek赋能职场 第三课&#xff1a;普通人如何抓住DeepSeek红利 第四课&#xff1a;让科研像聊天一样简单 第五课&#xff1a;DeepSeek与AI幻觉 第六课&#xff1a;基于DeepSeek的AI音乐词曲的创造法 第…

“智改数转”新风口,物联网如何重构制造业竞争力?

一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接&#xff0c;江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划&#xff08;2025&#xff0d;2027年&#xff09;》&#xff0c;提出到2027年&#xff0c;全省制造业企业设备更新、工艺…

OpenHarmony 入门——ArkUI 跨页面数据同步和页面级UI状态存储LocalStorage小结(二)

文章大纲 引言一、在代码逻辑使用LocalStorage二、从UI内部使用LocalStorage三、LocalStorageProp和LocalStorage单向同步四、LocalStorageLink和LocalStorage双向同步五、兄弟组件之间同步状态变量七、将LocalStorage实例从UIAbility共享到一个或多个视图 引言 前面一篇文章主…

干货分享|DeepSeek技术革命、算力范式重构与场景落地洞察

本文为TsingtaoAI公司负责人汶生为某证券公司管理层和投资者教授的《DeepSeek技术革命、算力范式重构与场景落地洞察》主题培训内容&#xff0c;此次主题培训系统阐述了当前AI技术演进的核心趋势、算力需求的结构性变革&#xff0c;以及行业应用落地的关键路径。 现在我们将全…

从切图仔到鸿蒙开发01-文本样式

从切图仔到鸿蒙开发01-文本样式 本系列教程适合 HarmonyOS 初学者&#xff0c;为那些熟悉用 HTML 与 CSS 语法的 Web 前端开发者准备的。 本系列教程会将 HTML/CSS 代码片段替换为等价的 HarmonyOS/ArkUI 代码。 页面结构 HTML 与 ArkUI 在 Web 开发中&#xff0c;HTML 文档结…

零基础入门网络爬虫第5天:Scrapy框架

4周 Srapy爬虫框架 不是一个简单的函数功能库&#xff0c;而是一个爬虫框架 安装&#xff1a;pip install scrapy 检测&#xff1a;scrapy -h Scrapy爬虫框架结构 爬虫框架 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合爬虫框架是一个半成品&#xff0c;能够帮助…

C语言:扫雷

在编程的世界里&#xff0c;扫雷游戏是一个经典的实践项目。它不仅能帮助我们巩固编程知识&#xff0c;还能锻炼逻辑思维和解决问题的能力。今天&#xff0c;就让我们一起用 C 语言来实现这个有趣的游戏&#xff0c;并且通过图文并茂的方式&#xff0c;让每一步都清晰易懂 1. 游…

同一个局域网的话 如何访问另一台电脑的ip

在局域网内访问另一台电脑&#xff0c;可以通过以下几种常见的方法来实现&#xff1a; ‌直接通过IP地址访问‌&#xff1a; 首先&#xff0c;确保两台电脑都连接在同一个局域网内。获取目标电脑的IP地址&#xff0c;这可以通过在目标电脑上打开命令提示符&#xff08;Windows系…

记录我的ICME2025论文之旅:困顿与收获

人生第一次中B会&#xff0c;还是在课业繁重的大三上&#xff08;有点说法~&#xff09; “在最黑暗的时刻&#xff0c;总有一束光为你指引前行。” ——记录这段难忘的历程 今年的ICME投稿量创下新高&#xff0c;录取率却跌至20多%&#xff0c;并且首次加入了rebuttal&#xf…

MySQL多表查询

这是两个表多表查询&#xff0c;需要一个连接条件customer_id。如果有n个表实现多表查询&#xff0c;至少需要n-1个连接条件。如果少于n-1个&#xff0c;就会出现笛卡尔积的错误。 SELECT orders.order_id, customers.customer_name FROM orders INNER JOIN customers ON orde…

vue3 项目的最新eslint9 + prettier 配置

注意&#xff1a;eslint目前升级到9版本了 在 ESLint v9 中&#xff0c;配置文件已经从 .eslintrc 迁移到了 eslint.config.js 配置的方式和之前的方式不太一样了&#xff01;&#xff01;&#xff01;&#xff01; 详见自己的语雀文档&#xff1a;5、新版eslint9prettier 配…

目标检测20年(三)

对这篇论文感兴趣的小伙伴可以订阅笔者《目标检测》专栏&#xff0c;关注笔者对该文献的阅读和理解。 前两篇解读链接&#xff1a; 目标检测20年&#xff08;一&#xff09;-CSDN博客 目标检测20年&#xff08;二&#xff09;-CSDN博客 目录 四、 检测器的加速发展 4.1 特…

LLM之RAG实战(五十二)| 如何使用混合搜索优化RAG 检索

在RAG项目中&#xff0c;大模型生成的参考内容&#xff08;专业术语称为块&#xff09;来自前一步的检索&#xff0c;检索的内容在很大程度上直接决定了生成的效果&#xff0c;因此检索对于RAG项目至关重要&#xff0c;最常用的检索方法是关键字搜索和语义搜索。本文将分别介绍…

2025-3-24 leetcode刷题情况(动态规划——01背包)

一、416.分割等和子集 1.题目描述 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 2.代码 3.思路 首先进行边界检查&#xff0c;若数组为空则直接返回 false。接着计算数组元素总和&#xff…

Lineageos 22.1(Android 15)实现负一屏

一、前言 方案是参考的这位大佬的&#xff0c;大家可以去付费订阅支持一波。我大概理一下Android15的修改。 大佬的方案代码 二、Android15适配调整 1.bp调整&#xff0c;加入aidl引入&#xff0c;这样make之后就可以索引代码了 filegroup {name: "launcher-src"…

5G NR PRACH 随机接入前导序列

目录 一、前言二、随机接入前导序列的产生三、 N c s N_{cs} Ncs​的规划3.1、 L R A L_{RA} LRA​839 N c s N_{cs} Ncs​规划3.2、 L R A L_{RA} LRA​139 N c s N_{cs} Ncs​规划3.3、 N c s N_{cs} Ncs​确定方法 四、根序列的规划4.1、根序列的选择与确定4.2、循环移位 …

【VUE】day07 路由

【VUE】day07 路由 1. 路由2. 前端路由的工作方式3. 实现简易的前端路由4. 安装和配置路由4.1 安装vue-router包4.2 创建路由模块4.3 导入并挂在路由模块 5. 在路由模块中声明路由的对应关系5.1 router-view 1. 路由 在 Vue.js 中&#xff0c;路由&#xff08;Routing&#xf…