Nacos 核心功能实战笔记(超详细)

Nacos 核心功能实战笔记

一、Nacos 简介

1. 是什么?

  • 全称:Nacos = Naming and Configuration Service
  • 定位:阿里巴巴开源的 动态服务发现、配置管理、服务管理平台
  • 核心功能:服务注册与发现 + 统一配置管理 + 服务健康监测
  • 适用场景:微服务架构、云原生应用(如 Spring Cloud、Dubbo)

2. 同类产品对比

产品主要功能优势局限性典型场景
Nacos服务发现 + 配置管理功能全面,支持动态配置、AP/CP模式切换学习成本略高需要统一管理服务与配置的场景
Eureka服务发现简单轻量,AP模型保证高可用无配置管理功能,已停止维护纯服务发现场景
Consul服务发现 + 配置管理 + 健康检查支持多数据中心,安全性强配置管理功能较弱复杂分布式系统
Zookeeper服务发现 + 分布式协调强一致性(CP模型)配置管理需自行实现,运维复杂强一致性要求的场景

二、Nacos 核心功能详解

1. 服务注册与发现

  • 工作原理

    1. 服务启动时向Nacos注册自己的元数据(IP、端口、健康状态)
    2. 消费者通过Nacos查询可用服务实例列表
  1. 内置心跳机制自动剔除故障节点
  • 示例场景

    // 订单服务注册到Nacos
    @SpringBootApplication
    @EnableDiscoveryClient  // 关键注解
    public class OrderServiceApplication { ... }// 用户服务调用订单服务
    @Autowired
    private RestTemplate restTemplate;public String getOrder() {// 直接使用服务名调用(需配合@LoadBalanced)return restTemplate.getForObject("http://order-service/orders", String.class);
    }
    

2. 动态配置管理

  • 核心特性
    • 配置热更新:修改Nacos控制台配置 → 应用实时生效(无需重启)
    • 多环境支持:通过 Namespace 隔离开发/测试/生产环境
    • 灰度发布:支持按IP或分组推送特定配置

3. 服务健康监测

  • 机制

    • 客户端每5秒发送心跳包到Nacos服务器
    • 超过15秒未收到心跳标记为"不健康"
    • 30秒未恢复则从服务列表移除
  • 扩展能力

    // 自定义健康检查规则
    @Component
    public class CustomHealthChecker implements HealthIndicator {@Overridepublic Health health() {// 检查数据库连接等自定义逻辑return Health.up().withDetail("db", "connected").build();}
    }
    

三、为什么选择 Nacos?

1. 核心优势

  • 一站式解决方案:同时解决服务发现与配置管理问题
  • 灵活性:支持AP(高可用)和CP(强一致)模式动态切换
  • 生态整合:无缝对接Spring Cloud、Dubbo、K8s
  • 易用性:提供可视化控制台,降低运维复杂度

2. 典型应用场景

  1. 微服务架构:统一管理上百个服务的注册与配置
  2. 配置灰度发布:只对部分服务实例推送新配置
  3. 多环境管理:通过Namespace快速切换开发/测试/生产环境
  4. 服务熔断:结合Sentinel实现流量控制

附:快速命令备忘

# 启动Nacos服务器(单机模式)
startup.sh -m standalone

四、注册中心实战

远程调用 - 基本流程

在这里插入图片描述

1. 基础配置

步骤:

  1. 添加依赖
<!-- pom.xml -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.配置Nacos地址

在这里插入图片描述

# Nacos服务器中显示的名称
spring.application.name=service-order
# 该模块启动占用的端口
server.port=8000
# application.yml
server:port: 8000
spring:application:name: order-servicespring:cloud:nacos:discovery:server-addr: localhost:8848  # Nacos服务地址

3.开启服务发现
在启动类添加注解:

@SpringBootApplication
@EnableDiscoveryClient  // 开启服务注册与发现
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}

查看注册中心效果 访问 http://localhost:8848/nacos

集群模式启动测试 单机情况下通过改变端口模拟微服务集群


2. 扩展功能

1. 获取服务实例列表
通过 DiscoveryClient 查询服务实例:(Spring提供的,NacosDiscoveryClient是DiscoveryClient的实现)

@Autowired
private DiscoveryClient discoveryClient;public void listServices() {List<String> services = discoveryClient.getServices();  // 获取所有服务名List<ServiceInstance> instances = discoveryClient.getInstances("order-service");  // 获取指定服务的实例
}

2. 负载均衡调用
引入依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

使用 LoadBalancerClient 选择实例:

//负载均衡基础版
@Configuration
public class OrderConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}//负载均衡发送请求public Product getProductFromRemoteWithLoadBalancer(Long productId){//1.获取服务实例ServiceInstance choose = loadBalancerClient.choose("service-product");//2.获取服务实例的uriString url = "http://"+choose.getHost()+":"+choose.getPort()+"/product/"+productId;log.info("请求地址:{}",url);//3.发送请求Product product = restTemplate.getForObject(url, Product.class);return product;}
//进阶基于注解的负载均衡
@Configuration
public class OrderConfig {@LoadBalanced//使用注解,自动实现负载均衡@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
private Product getProductFromRemqteWithLoadBalanceAnnotation(Long productId) {String url="http://service-product/product/"+productId;//给远程发送请求;service-product会被动态替换Product product = restTemplate.getForObject(url,Product.class);return product;
}

3.远程调用 - 面试题

思考:注册中心宕机,远程调用还能成功吗?
在这里插入图片描述

1.调用过:远程调用虽然不在依赖中心,但是可以通过。

2.没调用过:相当于第一次发起远程调用,不能通过。


五、配置中心实战

1. 配置中心 - 基本使用

步骤:

  1. 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

​ 2.配置Nacos地址

spring.application.name=service-product # 在Nacos中展示的模块名称
server.port=9000 # 项目启动的默认端口号spring.cloud.nacos.server-addr=127.0.0.1:8848 # Nacos占用的端口号
spring.config.import=nacos:service-order.properties  # 导入Nacos中的配置

补充:

# nacos禁用导入检查
spring.nacos.config.import-check.enabled=false  

2.1动态读取配置
使用 @Value + @RefreshScope 实现动态刷新(在Nacos中更新,就会立即在项目中更新):

@RestController
@RefreshScope  // 支持配置热更新
public class UserController {@Value("${app.maxRetry:3}")  // 默认值3private int maxRetry;
}

​ 2.2批量绑定配置
使用 @ConfigurationProperties

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "order")//配置批量绑定在nacos下,可以无需@RefreshScope注解就能实现自动刷新
@Component
@Data
public class OrderProperties {String timeout;String autoConfirm;
}

优点:

​ 1.代码更简洁,使用的时候直接注入即可。

​ 2.使用批量绑定配置,spring的底层会自动实现动态刷新,不用再加@RefreshScope注解。

3.在Nacos中配置数据集:

例如:service-order.properties

# Nacos中的配置service-order.properties
order.timeout=10min
order.auto-confirm=7d

4.如何在NacosConfigManager 监听配置变化?

​ 1、项目启动就监听配置文件变化
​ 2、发生变化后拿到变化值
​ 3、发送邮件

@EnableDiscoveryClient//开启服务发现功能
@SpringBootApplication
public class OrderMainApplication {public static void main(String[] args) {SpringApplication.run(OrderMainApplication.class, args);}//1、项目启动就监听配置文件变化//2、发生变化后拿到变化值//3、发送邮件@BeanApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager){return (ApplicationArguments args )-> {ConfigService configService = nacosConfigManager.getConfigService();configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {@Overridepublic void receiveConfigInfo(String configInfo) {System.out.println("配置文件发生变化:"+configInfo);System.out.println("邮件通知");}@Overridepublic Executor getExecutor() {return Executors.newFixedThreadPool(4);}});System.out.println("启动成功");};}
}

5.思考: Nacos中的数据集和application.properties 有相同的配置项,哪个生效?

答:Nacos中的数据集生效,因为在spring中导入优先级遵循:先导入优先,外部优先。


2. 配置中心 - 数据隔离

需求描述

​ • 项目有多套环境:dev,test,prod

​ • 每个微服务,同一种配置,在每套环境的值都不一样。

	• 如:database.properties 

​ • 如:common.properties

​ • 项目可以通过切换环境,加载本环境的配置

​ • **难点 **

​ • 区分多套环境

​ • 区分多种微服务

​ • 区分多种配置

​ • 按需加载配置

1.在Nacos中 配置优先级

  • Namespace:区分环境(如 dev/test/prod)
  • Group:区分微服务(如product-service/order-service)
  • Data ID:具体配置文件(如 commom.properties)

示例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 在Nacos中创建配置

在这里插入图片描述
在这里插入图片描述

# 例在Nacos中创建配置:
Data ID: commom.properties
Group: order  
Namespace: dev
配置内容:order.timeout=1minorder.auto-confirm=1h

3.在项目中按需加载配置

spring:application:name: order-servicecloud:nacos:server-addr: 127.0.0.1:8848config:namespace: devconfig:import:- nacos:common.properties?group=order

三、总结

功能核心步骤扩展能力
注册中心1. 引入依赖 2. 配置地址 3. 启用 @EnableDiscoveryClient1. 服务实例查询(DiscoveryClient) 2. 负载均衡调用(LoadBalancerClient+RestTemplate
配置中心1. 引入依赖 2. 配置地址+导入数据集 3. 使用 @Value+@RefreshScope实现绑定属性以及动态刷新1. 多环境隔离(Namespace/Group/Data ID) 2. 批量绑定(@ConfigurationProperties

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

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

相关文章

安装remixd,在VScode创建hardhat

在终端&#xff0c;以管理员身份&#xff0c;cmd 需要科学上网 npm install -g remix-project/remixd 在vscode插件中&#xff0c;安装solidity插件&#xff0c;是暗灰色那款 1.将nodeJs的版本升级至18以上 2.在vscode打开一个新的文件&#xff0c;在终端输入 npx hardhat 3.…

unity pico开发 四 物体交互 抓取 交互层级

文章目录 手部设置物体交互物体抓取添加抓取抓取三种类型抓取点偏移抓取事件抓取时不让物体吸附到手部 射线抓取交互层级 手部设置 为手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor脚本 并添加一个球形碰撞盒&#xff0c;勾选isTrigger,调整大小为0.1 …

CyberRT(apollo) 定时器模块简述及bug分析

timer 模块 timer的定义&#xff0c;cyberrt中timer模块用于设置定时器任务&#xff0c;字面意思&#xff0c;设置设置定时周期及出发频次&#xff08;周期 or oneshot)&#xff0c;到达指定时间时间触发callback time wheel 时钟节拍轮&#xff0c;常见的定时器设计&#x…

java八股文之消息中间件

1.RabbitMQ如何保证消息不丢失 开启生产者确认机制&#xff0c;确保生产者的消息能到达队列开启持久化功能&#xff0c;确保消息未消费前在队列中不会丢失&#xff08;交换机&#xff0c;队列&#xff0c;消息都需要开启持久化功能&#xff09;开启消费者确认机制为auto,由spr…

Win7重装不翻车!ISO镜像安全下载渠道+BIOS设置避雷手册

一、写在前面&#xff1a;为什么你需要这份教程&#xff1f; 当电脑频繁蓝屏、系统崩溃甚至无法开机时&#xff0c;重装系统可能是最后的救命稻草。但市面上的教程往往存在三大痛点&#xff1a; ⚠️ 镜像来源不明导致系统被植入后门 ⚠️ 启动盘制作失败反复折腾 ⚠️ 操作失…

大学至今的反思与总结

现在是2025年的3月5日&#xff0c;我大三下学期。 自大学伊始&#xff0c;我便以考研作为自己的目标&#xff0c;有时还会做自己考研上岸头部985,211&#xff0c;offer如潮水般涌来的美梦。 但是我却忽略了一点&#xff0c;即便我早早下定了决心去考研&#xff0c;但并没有早…

SpringBoot 全局异常处理

文章目录 异常处理全局异常处理(推荐)局部异常处理高级技巧设置返回状态码处理404异常异常处理 全局异常处理(推荐) 创建一个全局异常处理类,使用 @RestControllerAdvice 注解标记。 在方法上使用 @ExceptionHandler 声明当前方法可处理的异常类型。当系统发生异常时,…

【四.RAG技术与应用】【11.阿里云百炼应用(上):RAG在云端的实践】

一、为什么需要RAG?大模型的“知识困境”与破局之道 大模型虽然“博学”,但它的知识库存在两个致命短板: 缺乏私有知识:比如企业内部的产品手册、客户数据、行业报告等;知识更新滞后:大模型的训练数据往往停留在某个时间点,无法实时获取最新信息(比如今天的股票行情或…

使用wifi连接手机adb进行调试|不使用数据线adb调试手机|找应用错误日志和操作日志

手机在开发者选项里要开启无线调试 在手机设置中查看WiFi的IP地址 设置 -> WLAN -> 已连接的WiFi -> IP地址 使用手机的IP地址连接 adb connect 192.168.1.12:xxxxx 检查连接状态 adb devices 断开特定设备 adb disconnect 192.168.x.x:xxxxx 断开所有设备 …

mapbox高阶,结合threejs(threebox)添加三维球体

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Sphere静态对象二、🍀使用t…

游戏引擎学习第140天

回顾并为今天的内容做准备 目前代码的进展到了声音混音的部分。昨天我详细解释了声音的处理方式&#xff0c;声音在技术上是一个非常特别的存在&#xff0c;但在游戏中进行声音混音的需求其实相对简单明了&#xff0c;所以今天的任务应该不会太具挑战性。 今天我们会编写一个…

golang并发编程如何学习

《掌握 Golang 并发编程的通关秘籍》 在当今的编程世界中&#xff0c;Golang 并发编程正以其独特的魅力和强大的能力吸引着众多开发者。然而&#xff0c;对于许多小伙伴来说&#xff0c;如何学好这门技术却成了一个头疼的问题。别担心&#xff0c;今天就让我来为大家揭开 Gola…

SpringMVC学习(controller层加载控制与(业务、功能)bean加载控制、Web容器初始化配置类)(3)

目录 一、SpringMVC、Spring的bean加载控制。 &#xff08;1&#xff09;实际开发的包结构层次。 &#xff08;2&#xff09;如何"精准"控制两个容器分别加载各自bean。(分析) <1>SpringMVC相关bean加载控制。(方法) <2>Spring相关bean加载控制。(方法) …

fastapi+mysql实现增删改查

说明&#xff1a; 我计划用python的fastapi框架&#xff0c;实现操作MySQL数据库的表&#xff0c;实现增删改查的操作&#xff0c;并且在postman里面测试 step1: 安装数据库依赖 pip install fastapi uvicorn pymysqlstep2:C:\Users\Administrator\PycharmProjects\FastAPIPro…

Linux系统之配置HAProxy负载均衡服务器

Linux系统之配置HAProxy负载均衡服务器 前言一、HAProxy介绍1.1 HAProxy简介1.2 主要特点1.3 使用场景二、本次实践介绍2.1 本次实践简介2.2 本次实践环境规划三、部署两台web服务器3.1 运行两个Docker容器3.2 编辑测试文件3.3 访问测试四、安装HAProxy4.1 更新系统软件源4.2 安…

CS144 Lab Checkpoint 2: the TCP receiver

Overview TCPReceiver 从对等的sender接收消息&#xff0c;使用 receive() 方法&#xff0c;然后调用 Reassembler() 方法&#xff0c;后者写入 ByteStream 中 然后应用程序从 ByteSteam 中读取。 同时&#xff0c;TCPReceiver 还会通过 send() 方法给sender发送消息&#xff…

Spring Boot 3.x 核心注解详解与最佳实践

Spring Boot 3.x 核心注解详解与最佳实践 前言 随着Spring Boot 3.x的正式发布&#xff0c;这个基于Spring Framework 6的里程碑版本带来了诸多新特性。本文将深入剖析Spring Boot 3.x的核心注解体系&#xff0c;结合代码示例讲解其作用及使用场景&#xff0c;助您快速掌握新…

PHP之常量

在你有别的编程语言的基础下&#xff0c;你想学习PHP&#xff0c;可能要了解的一些关于常量的信息。 PHP中的常量不用指定数据类型&#xff0c;可以使用两次方法定义。 使用const //定义常量 const B 2; echo B . PHP_EOL;使用define define("A", 1); echo A . P…

计算机网络——子网掩码

一、子网掩码是什么&#xff1f;它长什么样&#xff1f; 子网掩码的定义 子网掩码是一个32位的二进制数字&#xff0c;与IP地址“配对使用”&#xff0c;用于标识IP地址中哪部分属于网络地址&#xff0c;哪部分属于主机地址。 示例&#xff1a;IP地址 192.168.1.10&#xff0c;…

Tomcat-web服务器介绍以及安装部署

一、Tomcat简介 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用…