微服务学习笔记(2)——SpringCloud Nacos

微服务学习笔记(2)——SpringCloud Nacos
在这里插入图片描述

🔥我的主页:九转苍翎⭐️个人专栏:《Java SE 》《Java集合框架系统精讲》《MySQL高手之路:从基础到高阶 》《计算机网络 》《Java工程师核心能力体系构建》《RabbitMQ理论与实践》天行健,君子以自强不息。


0.前言

  • SpringBoot版本:3.2.5
  • SpringCloud版本:2023.0.3
  • SpringCloud Alibaba版本:2023.0.1.0
  • nacos版本:2.2.3(已免费上传至我的资源)
  • 项目源码spring-cloud-blog

1.概述

Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置和管理平台。在 Spring Cloud 体系中,Nacos为微服务架构提供服务注册与发现以及动态配置管理能力

启动:双击startup.cmd,默认端口号8848

在这里插入图片描述

配置:在记事本中打开startup.cmd文件,修改set MODE="cluster"set MODE="standalone"

在这里插入图片描述

下载Nacos

在这里插入图片描述

2.服务注册与发现

服务提供者(Service Provider):在启动时,会将自己的网络地址(IP + Port)、服务名称等信息注册到 Nacos 服务器。同时,它会定时向 Nacos 发送心跳,以证明自己“活着”服务消费者(Service Consumer):在需要调用某个服务时,它会向 Nacos 服务器查询该服务的地址列表(服务发现)。获取到列表后,消费者会根据负载均衡策略选择一个提供者进行调用。Nacos也会在提供者列表发生变化时,实时通知消费者

Nacos 服务器(Nacos Server):注册中心的核心。它负责接收服务注册请求,管理所有注册的服务实例,维护服务实例的健康状态,并响应消费者的服务发现请求

在这里插入图片描述

引入依赖:在modules模块中引入依赖

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

添加配置:在application.yml中添加以下配置

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

启动服务并访问http://127.0.0.1:8848/nacos/#/serviceManagement观察是否注册成功

在这里插入图片描述

3.远程调用

3.1 RestTemplate

RestTemplate是 Spring 框架提供的同步客户端 HTTP 访问的核心类,用于简化与 HTTP 服务的通信

        本项目包含两个微服务:order-service(订单服务)和 product-service(商品服务),它们分别提供了查询订单详情和商品详情的接口。
        在 order-service 的业务逻辑中,当需要查询订单信息并同时获取该订单关联的商品详情时,就必须调用 product-service 提供的接口。为了实现这一跨服务调用,我们需要借助 RestTemplate 来完成服务间的通信。

在这里插入图片描述


代码实现如下

远程调用product-service(商品服务)

@ServicepublicclassOrderService{privatefinalOrderMapper orderMapper;privatefinalRestTemplate restTemplate;@AutowiredpublicOrderService(OrderMapper orderMapper,RestTemplate restTemplate){this.orderMapper = orderMapper;this.restTemplate = restTemplate;}publicOrderInfoselectOrderById(Integer id){OrderInfo orderInfo = orderMapper.selectOrderById(id);String url ="http://127.0.0.1:9000/product/getProductById?id="+ orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url,ProductInfo.class); orderInfo.setProductInfo(productInfo);return orderInfo;}}

配置RestTemplate实例

@ConfigurationpublicclassBeanConfig{@BeanpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}

3.2 引入后Nacos进行远程调用

  • 硬编码IP的RestTemplate调用的痛点:在代码中写死"http://127.0.0.1:9000/product/getProductById?id=" + orderInfo.getProductId()。如果商品服务的 IP 地址变了,或者需要切换环境,必须修改代码
  • Nacos 优势:服务调用方只需知道服务提供方的服务名 ,Nacos 负责将服务名动态解析为具体的IP地址

引入依赖:在modules模块中引入依赖

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

为RestTemplate添加@LoadBalanced注解

@ConfigurationpublicclassBeanConfig{@Bean@LoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}

远程调用product-service(商品服务)

@ServicepublicclassOrderService{privatefinalOrderMapper orderMapper;privatefinalRestTemplate restTemplate;@AutowiredpublicOrderService(OrderMapper orderMapper,RestTemplate restTemplate){this.orderMapper = orderMapper;this.restTemplate = restTemplate;}publicOrderInfoselectOrderById(Integer id){OrderInfo orderInfo = orderMapper.selectOrderById(id);String url ="http://product-service/product/getProductById?id="+ orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url,ProductInfo.class); orderInfo.setProductInfo(productInfo);return orderInfo;}}

4.负载均衡

Nacos 作为服务注册与发现中心,本身不直接提供负载均衡能力,而是与客户端负载均衡器(如 Spring Cloud LoadBalancer)配合使用,实现服务调用的负载均衡

由于Spring Cloud LoadBalancer默认的负载均衡策略(轮询、随机)不会读取 Nacos 实例的权重属性。要让 Nacos 中配置的权重生效,我们需要添加配置来开启Nacos的负载均衡策略

# 在服务消费者order-service的yml文件中添加如下配置 -> 开启负载均衡策略spring:cloud:loadbalancer:nacos:enabled:true

Nacos 权重配置

  1. 进入「服务管理」->「服务列表」
  2. 点击product-service服务,进入详情页
  3. 在实例列表中,点击实例的「编辑」按钮

设置「权重」值

在这里插入图片描述

5.同集群优先访问

在微服务部署中,经常会将服务部署在不同的机房或区域(如北京、上海、杭州),为了减少跨机房调用的网络延迟和成本,我们需要实现同集群优先访问的策略

集群配置

product-service:编辑启动配置

在这里插入图片描述

添加配置-Dspring.cloud.nacos.discovery.cluster-name=cluster-beijing

在这里插入图片描述

order-service:在yml文件中添加如下配置

spring:cloud:nacos:discovery:cluster-name: cluster-beijing 

6. 健康检查

Nacos健康检查机制确保了服务调用始终指向健康的实例,共有两种模式

在这里插入图片描述
  • 客户端主动上报机制
    • 客户端通过心跳上报方式告知服务端(Nacos注册中心)健康状态,默认心跳间隔5秒
    • Nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除
  • 服务器端反向探测机制
    • Nacos主动探知客户端健康状态,默认间隔为20秒
    • 健康检查失败后实例会被标记为不健康,不会被立即删除

具体使用哪种模式与Nacos的服务实例类型强相关

  • 临时实例:采取客户端主动上报机制。如果实例宕机超过一定时间,会从服务列表剔除,默认类型
  • 非临时实例:采取服务器端反向探测机制。如果实例宕机,不会从服务列表剔除

如果想要将某一服务(如order-service)修改为非临时实例,需要在yml文件中添加如下配置

spring:cloud:nacos:discovery:ephemeral:false
在这里插入图片描述


注意:由于注册到Nacos上的实例默认为临时实例,而Nacos的服务实例类型一旦确定,不能随意更改,否则会导致启动报错

  • 解决办法:先停止Nacos服务,删除/data/protocol/raft目录下的所有文件,里面保存的是应用实例的元数据信息,然后重启Nacos服务

7.环境隔离

在微服务架构中,环境隔离是实现多环境并行管理的关键。对于企业开发来说,一个服务一般会划分为开发环境,测试环境和生产环境

  • 开发环境:开发人员用于开发的服务器,是最基础的环境
  • 测试环境:测试人员用来进行测试的服务器,是开发环境到生产环境的过渡环境
  • 生产环境:正式提供对外服务的环境

环境之间需要严格隔离,避免相互干扰。Nacos提供了namespace(命名空间)来实现环境的隔离,不同的namaspace的服务不可见(Nacos默认提供了一个public[保留空间])


创建命名空间

在这里插入图片描述

配置命名空间

spring:cloud:nacos:discovery:namespace: 0bec5adc-2787-44b0-b826-e4bb48746c4e 
在这里插入图片描述


在这里插入图片描述

使用dev环境的order-service服务调用public环境的product-service服务

在这里插入图片描述

8.配置中心

在微服务架构中,传统的application配置文件存在以下痛点:

  • 修改需重启:修改配置后必须重启应用,无法动态调整配置
  • 环境管理困难:每个环境(如dev/test/prod)都要维护独立的配置文件,容易出错

Nacos作为配置中心,提供了以下核心功能:

  • 配置集中管理:统一管理不同环境、不同服务的配置

配置实时生效:配置变更后,应用可以实时感知并更新

在这里插入图片描述

引入nacos-config依赖

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

8.1 bootstrap启动文件详解

当配置文件交由Nacos管理后,应用程序的启动流程发生了根本性的变化。不再是简单的本地文件读取(application.properties/application.yml),而是变成了一个 “先连接配置中心,再加载配置,最后启动应用” 的流程

bootstrap.yml(或bootstrap.properties)是Spring Cloud应用程序的引导配置文件,在应用程序启动时优先于application.yml被加载,主要配置以下内容

  • Nacos服务器IP地址:连接Nacos配置中心
  • 应用程序名称:作为Data ID的前缀,用于在Nacos服务器上定位到具体的配置文件
  • file-extension:指定配置文件的格式,用于正确解析

order-service的bootstrap.yml文件

spring:application:name: order-service profiles:active: local cloud:nacos:config:server-addr: 127.0.0.1:8848namespace: 0bec5adc-2787-44b0-b826-e4bb48746c4e file-extension: yaml discovery:server-addr: 127.0.0.1:8848ephemeral:truenamespace: 0bec5adc-2787-44b0-b826-e4bb48746c4e 

从SpringCloud 2020.0.0版本开始,Spring Cloud默认禁用了bootstrap上下文,导致:

  • bootstrap.yml/properties 文件不会被自动加载
  • Nacos配置中心的配置无法自动获取
  • 启动时出现配置缺失错误

解决方案引入bootstrap依赖

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

8.2 Data ID

在连接到Nacos配置中心后,应用会根据特定的规则来确定读取哪个配置文件。这个规则由Data ID的构建逻辑决定,Data ID的构建公式如下

Data ID = ${prefix} - ${spring.profiles.active} . ${file-extension} 
在这里插入图片描述


以上述bootstrap.yml文件为例,order-service服务将从Nacos上读取order-service-local.yaml配置文件。但实际启动服务时,会同时监听三个配置文件

在这里插入图片描述
  • order-service-local.yaml:${prefix} - ${spring.profiles.active} . ${file-extension}
  • order-service.yaml:${prefix} . ${file-extension}
  • order-service:${prefix}

测试优先级

@RestController@RequestMapping("/config")@RefreshScope// 当Nacos中的配置发生变化时,被@RefreshScope标注的Bean会重新创建,从而加载新的配置值@Slf4jpublicclassNacosConfigController{@Value("${test.value}")privateString value;@GetMapping("/getValue")publicvoidgetValue(){ log.info("getValue:{}",value);}}
在这里插入图片描述


访问URL:http://127.0.0.1:8000/config/getValue

在这里插入图片描述


删除order-service-local.yaml,再次访问URL

在这里插入图片描述


删除order-service.yaml,再次访问URL

结论:配置文件优先级 order-service-loval.yaml > order-service.yaml > order-service

Read more

【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论 : 本章是动态规划算法的基础入门篇,我将通过三道简单题 + 一道中等难度的一维动态规划题来带你对动态规划有个初认识,并基本了解动态规划的最基本常见的写法,只有将基本写法了解了,对后续的难的题目自然也不会毫无头绪,后续还将持续更新更多相关的动规算法,敬请期待~🙃 ———————— 早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。 👻动态规划🌥️ 这里通过大量练习得出下面动态规划做题步骤 简单的说动态规划理解成:某种状态的公式 + 提前求出来值的容器 求出当前位置的值然后放到容器中后后续使用 因为最开始的值一般是会看见的所以就能有初始值,从而启动动态规划 从上中可以主要提炼出: * 状态 * 容器的重要性 * 公式,可以换种说法:状态转移方程 这样严格😈的说:动态规划 = 状态定义 + 状态转移方程 + 初始条件 + 状态存储(容器) 下述步骤是通过写完下述四道题后的总结,所以同样需要道友🗡️大量的练习沉淀最终就能对动态规划的题目

By Ne0inhk
Python从0到100(九十八):融合选择性卷积与残差结构的SKResNet架构详解

Python从0到100(九十八):融合选择性卷积与残差结构的SKResNet架构详解

前言:零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者! 【优惠信息】 • 新专栏订阅前500名享9.9元优惠 • 订阅量破500后价格上涨至19.9元 • 订阅本专栏可免费加入粉丝福利群,享受: - 所有问题解答 -专属福利领取 欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程! 本文目录: * 一、SKResNet的理论基础与创新点 * 1. 传统卷积神经网络的局限性 * 2. SKResNet的核心创新 * 3. 技术优势分析 * 二、SKResNet架构设计详解 * 1. 整体架构概览 * 2. SKBlock:选择核模块详解 * 2.1 多尺度卷积核设计 * 2.2 注意力机制实现 * 2.

By Ne0inhk
AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题

AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题

AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题 AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题,本文介绍了如何利用豆包平台打造专属Python智能管家。首先简述豆包平台的核心优势,接着说明创建前的准备工作,包括注册账号、明确定位和收集训练资料。随后详细讲解创建流程,从新建智能体、基础设置、能力配置到测试优化,还提及集成代码执行环境等高级功能扩展,以及使用技巧与实际应用案例。该智能官能解决多种Python编程问题,可提升学习效率和问题解决速度,是实用的个性化编程助手。 前言     人工智能学习合集专栏是 AI 学习者的实用工具。它像一个全面的 AI 知识库,把提示词设计、AI 创作、智能绘图等多个细分领域的知识整合起来。无论你是刚接触 AI 的新手,还是有一定基础想提升的人,都能在这里找到合适的内容。从最基础的工具操作方法,到背后深层的技术原理,专栏都有讲解,还搭配了实例教程和实战案例。这些内容能帮助学习者一步步搭建完整的 AI 知识体系,让大家快速从入门进步到精通,

By Ne0inhk

Python 代码打包为 EXE 完全指南

Python 代码打包为 exe 完全指南(2025–2026 年最新实用版) 目前最主流、最稳定的几种打包方式对比(按推荐顺序): 排名工具优点缺点/坑点适合场景推荐指数 (2026)1PyInstaller兼容性最好、社区最大、文档最全生成的 exe 偏大、启动稍慢几乎所有场景(首选)★★★★★2Nuitka启动速度最快、文件体积较小、接近原生性能编译时间长、对依赖处理更严格对启动速度敏感的项目★★★★☆3cx_Freeze跨平台支持好、配置灵活社区活跃度低、文档较老需要高度自定义打包逻辑★★★☆☆4PyOxidizer极致体积优化、Rust 底层配置复杂、生态不成熟极致追求小体积的场景★★☆☆☆5Shiv / PEX生成 .pex 文件(类似 jar),不生成 exe需要 Python 环境才能运行服务器/内部工具分发(非桌面程序)★★☆☆☆ 绝大多数人(尤其是 Windows 桌面程序)2026 年仍然首选:

By Ne0inhk