发布时间:2026/8/23 8:47:38
Spring Cloud 微服务实战(一):还在硬编码服务地址?Nacos 注册中心从零搭建 Spring Cloud 微服务实战一还在硬编码服务地址Nacos 注册中心从零搭建个人主页夏天拐跑了西瓜专栏传送门《大模型应用开发》、《Spring 生态全家桶体系化实战》学习方向Java 后端AI‑Agent 大模型应用开发爱好者⭐人生格言路虽远行则将至本文是「Spring Cloud 微服务实战」系列的第一篇。文章从单体架构到微服务架构的演变讲起介绍 Spring Cloud 生态的核心组件随后基于 Nacos 2.5.1 手把手搭建父工程与订单、库存两个子服务实现服务注册与发现、按服务名调用并讲解命名空间、分组与负载均衡机制。读完本文你可以独立搭建一套基于 Nacos 的微服务调用链路。系列文章导航《Spring Cloud 微服务实战一还在硬编码服务地址Nacos 注册中心从零搭建》本篇《Spring Cloud 微服务实战二改个配置还要重启服务Nacos 配置中心 OpenFeign 实战》《Spring Cloud 微服务实战三一个服务挂了凭什么拖垮整个系统Sentinel 限流熔断实战》《Spring Cloud 微服务实战四每个请求都直连服务你的集群缺一个 Gateway 门卫》环境与版本说明跟随本文实战需要提前准备如下环境环境版本要求JDK8 或 11Nacos Server 的运行要求Nacos Server2.5.1Spring Boot2.6.11Spring Cloud2021.0.4Spring Cloud Alibaba2021.0.4.0构建工具Maven 3.6开发工具IntelliJ IDEA社区版即可提示Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者的版本存在对应关系混用版本可能导致启动报错版本对应关系可查阅 Spring Cloud Alibaba 官方 Wiki。本系列以 Spring Boot 2.x 为基线暂不涉及 3.x。一、微服务架构介绍开始正文之前默认你已经具备以下基础掌握 SSM、Spring Boot 的基本使用熟悉 Maven、Git 的常规操作本地已安装 JDK 8 或 JDK 11 环境。1.1 架构演变软件架构的演进大致经历了三个阶段单体架构、SOA 架构和微服务架构。单体架构所有功能模块集中在一个工程中开发与部署即 All in One 模式。SOA架构面向服务的架构属于单体向微服务过渡的形态。它通常依赖 ESB企业服务总线、WebService 等较重的基础设施在当下的大型项目中已较少采用。微服务架构这一架构风格由 Martin Fowler 提出官方阐述见https://martinfowler.com/articles/microservices.html其核心定义如下In short, the microservice architectural style 1 is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. 简而言之微服务架构风格1是一种将单个应用程序开发为一套小型服务的方法每个服务都在自己的进程中运行并与轻量级机制通常是HTTP资源API通信。这些服务围绕业务能力构建并可通过全自动部署机制独立部署。这些服务的集中管理最低限度这些服务可能用不同的编程语言编写并使用不同的数据存储技术。对这段定义做进一步归纳可以得到微服务架构的几个关键特征微服务是一种架构风格而非强制标准将单体应用按业务能力拆分为多个小型服务多个服务共同组成完整的产品功能每个服务可以独立部署互不影响服务之间通常采用 HTTP 等轻量级方式进行通信拆分时一般按业务领域划分边界也可以将单个独立功能抽象为一个服务借助 DevOps 实现自动化部署本系列后续内容会涉及不同服务可以采用不同的编程语言与技术栈实现。最后区分三个容易混淆的概念微服务架构一种架构思想微服务拆分出来的具体服务实例例如上图中的商品服务微服务框架落地微服务架构思想的技术体系如 Spring Cloud。1.2 SpringCloud生态官方地址 https://spring.io/projects/spring-cloud本系列将围绕 Spring Cloud 生态中的以下组件展开Spring Cloud AlibabaNacos注册中心与配置中心Spring CloudOpenFeign声明式远程调用Spring Cloud AlibabaSentinel限流熔断降级Spring CloudGateway网关链路追踪Sleuth ZipkinSkyWalking 本系列不涉及说明本系列聚焦组件的应用与落地不涉及底层源码分析。二、Nacos注册中心2.1 注册中心考虑这样一个场景订单服务需要调用库存服务但它并不知道库存服务的 IP 和端口。如果把库存服务的地址硬编码在订单服务中会带来明显的耦合问题——库存服务地址变更、集群节点增减时订单服务都必须跟着修改和维护。注册中心正是为解决这一问题而生的每个服务启动时将自己的基本信息服务名、IP、端口等注册到 Nacos当某个服务需要调用其他服务时先从 Nacos 查询目标服务的地址信息再发起调用。这样服务之间的依赖就从硬编码地址变成了按服务名动态发现。2.2 Nacos安装Nacos Server 既可以在 Windows 下本地运行也可以部署到 Linux 环境本地开发直接使用官方安装包即可。需要注意的是Nacos Server 要求本地 Java 环境为 JDK 8 或 JDK 11通过java -version确认。2.5.1 版本下载地址https://download.nacos.io/nacos-server/nacos-server-2.5.1.zip点击即可直接下载最好去官网下载页获取最新版本。打开终端Windows 下为 cmd准备启动 Nacos 服务进入解压后的 bin 目录执行启动命令Windowsstartup.cmd -m standaloneLinux/Macsh startup.sh -m standalone启动成功要看到这个日志启动成功后浏览器访问 Nacos 提供的图形化控制台http://localhost:8848/nacos2.3 Nacos初体验注册中心2.3.1 构建父工程并管理版本在开始客户端开发之前先明确一个前提Spring Cloud 构建在 Spring Boot 之上而 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者的版本存在严格的对应关系。版本对应关系可查阅https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E版本不一致时部分组件的使用细节会出现差异建议与本文保持一致。本系列以 Spring Boot 2.x 为基线。首先构建一个普通的 Maven 父工程在 pom.xml 中完成四件事将工程的 packaging 设置为 pom继承 Spring Boot 的 parent 并指定版本声明 Spring Cloud 的版本声明 Spring Cloud Alibaba 的版本。?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.6.11/versionrelativePath//parentgroupIdcom.study/groupIdartifactIdspringcloud/artifactIdversion1.0-SNAPSHOT/versionpackagingpom/packagingpropertiesspring-cloud.version2021.0.4/spring-cloud.versionspring-cloud-alibaba.version2021.0.4.0/spring-cloud-alibaba.version/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement/project2.3.2 准备库存服务库存服务stock的搭建分为五步1、在父工程下创建子工程2、引入 Web 与 Nacos 服务发现依赖dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency/dependencies3、编写启动类并添加EnableDiscoveryClient注解开启服务注册与发现packagecom.study;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplicationEnableDiscoveryClientpublicclassStockStarterApp{publicstaticvoidmain(String[]args){SpringApplication.run(StockStarterApp.class,args);}}4、在 application.yml 中配置服务名与 Nacos 地址spring:application:name:stockcloud:nacos:discovery:server-addr:127.0.0.1:88485、启动服务在 Nacos 控制台的服务列表中可以看到 stock 已注册成功2.3.3 准备订单服务订单服务order的搭建步骤与库存服务完全一致仅需调整配置文件服务名改为 order并将端口固定为 80。spring:application:name:ordercloud:nacos:discovery:server-addr:127.0.0.1:8848server:port:80启动后同样可以在 Nacos 控制台确认注册结果2.3.4 库存服务提供接口在 stock 服务中提供一个对外的测试接口用于后续验证服务间调用packagecom.study.controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassStockController{GetMapping(/stock/test)publicStringtest(){returnstock test!;}}启动后访问http://localhost:8080/stock/test确认接口可以正常响应2.3.5 订单服务准备接口访问库存服务首先用最原始的方式实现调用在启动类中注册 RestTemplate Bean由 OrderController 直接访问库存服务的固定地址。注意此时地址是硬编码的尚未接入 Nacos。packagecom.study.controller;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;RestControllerpublicclassOrderController{// restTemplate是启动类里构建的AutowiredprivateRestTemplaterestTemplate;GetMapping(/order/test)publicStringtest(){//1、 直接访问库存服务的/stock/test接口获取数据StringresultrestTemplate.getForObject(http://localhost:8080/stock/test,String.class);//2、 响应数据returnOrder Test get result;}}确认硬编码地址可以正常调用后下面将其改造为基于 Nacos 的服务名调用。改造只需两步给 RestTemplate Bean 追加LoadBalanced注解BeanLoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}然后将调用地址中的localhost:8080替换为服务名stock。预期效果是 RestTemplate 发起请求时由 LoadBalancer 将 stock 服务名从 Nacos 解析为具体的 IP 和端口。但实际启动后会发现调用报错这是因为在 Spring Cloud 2021.x 版本中Ribbon 已被移除负载均衡能力需要显式引入 LoadBalancer 依赖。在 order 服务中补充依赖即可解决dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-loadbalancer/artifactId/dependency再次访问服务名成功被解析调用正常返回2.4 命名空间和分组了解默认情况下服务的注册与发现都发生在 Nacos 的 public 命名空间、DEFAULT_GROUP 分组下。实际项目中通常利用命名空间区分环境dev/test/prod利用分组对服务做进一步归类。这两者都可以在 yml 中指定。先在 Nacos 控制台创建一个新的命名空间然后让 order 服务连接该命名空间此时 stock 服务仍然注册在 public 命名空间下而 order 服务已改为从 dev 命名空间查找服务自然找不到 stock调用随之报错——这正验证了命名空间的隔离效果分组的用法类似。将 order 服务的注册与发现分组设置为 PDD_GROUP 后它只会在该分组内查找服务由于 stock 服务注册在 DEFAULT_GROUP 下order 在 PDD_GROUP 中无法找到它调用失败符合预期2.5 负载均衡了解需要明确一点负载均衡并不是 Nacos 本身的职责而是由客户端侧的Ribbon 或 LoadBalancer组件完成的低版本 Spring Cloud 默认集成 Ribbon当前版本需要手动引入 LoadBalancer。默认采用轮询策略即请求依次分发到各服务节点无需额外配置。虽然也支持权重等策略但实际项目中默认轮询已能满足大多数场景。为了直观观察轮询效果对 stock 服务的 test 接口稍作改造在返回结果中追加当前服务端口packagecom.study.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassStockController{Value(${server.port})privateStringserverPort;GetMapping(/stock/test)publicStringtest(){returnstock test!serverPort;}}首次启动时可能遇到占位符解析失败的错误原因是配置文件中尚未声明server.port补充对应配置后重启即可先启动一个 8080 端口的 stock 实例。为了验证集群效果再通过 IDEA 的启动配置启动第二个 stock 实例端口 8081。新版 IDEA 需要先开启Allow multiple instances多实例运行选项然后在 IDEA 中新增一个启动配置以 8081 端口启动 stock 服务两个实例启动成功后可以在 Nacos 控制台看到 stock 服务下挂载了两个集群节点注意同一集群的多个实例必须使用相同的服务名服务名不同会被识别为两个独立的服务。此时反复访问订单接口返回的端口号会在 8080 与 8081 之间交替出现即默认的轮询效果三、总结本文完成了微服务实战的第一步核心收获如下厘清了微服务架构的核心思想与 Spring Cloud 生态的技术选型。搭建父工程统一管理 Spring Boot 2.6.11、Spring Cloud 2021.0.4、Spring Cloud Alibaba 2021.0.4.0 三大版本。基于 Nacos 完成订单、库存服务的注册与发现配合 LoadBalancer 实现按服务名调用。验证了命名空间与分组的隔离效果以及负载均衡的默认轮询机制。下一篇预告使用 Nacos 配置中心集中管理配置文件并实现动态刷新再用 OpenFeign 优雅地简化跨服务 HTTP 调用。感兴趣的同学记得 点赞 关注第一时间获取更新通知

相关新闻

2026/8/23 8:47:38

数据结构:二叉树OJ题攻破

前言二叉树是数据结构与算法面试和笔试中的高频考点,也是许多复杂算法(如二叉搜索树、堆、AVL树等)的基础。掌握二叉树的常见OJ(Online Judge)题目,对于提升编程能力和算法思维至关重要。本文将系统梳理二叉…

2026/8/23 8:47:38

嵌入式系统架构演进:从轮询到FreeRTOS多任务实时操作系统

1. 项目概述:为什么嵌入式系统需要FreeRTOS?如果你刚开始接触嵌入式开发,可能还在用while(1)大循环里塞满各种函数调用的方式写代码。点个灯、读个传感器、发个串口数据,全挤在一个主循环里。代码跑起来似乎也没问题,直…

2026/8/23 8:42:38

APEX框架:打造制造业自适应AI智能体的三层自进化架构

1. 项目概述:当AI智能体走进生产车间最近和几个在制造业做数字化转型的朋友聊天,大家普遍有个痛点:生产线上的AI智能体,刚上线时表现还行,但产线一换、产品型号一变,或者设备参数稍有调整,模型性…

2026/8/23 9:57:42

大麦网抢票脚本:Python 自动抢票真能跑通吗

大麦网抢票脚本:Python 自动抢票真能跑通吗 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 开票前 5 分钟,页面已经打开,鼠标悬在按钮上方…

2026/8/23 9:57:42

Java技术栈深度面试:音视频与微服务实战设计

1. 项目概述:Java技术栈的深度面试场景设计 在技术招聘领域,如何设计能真实反映候选人工程能力的面试题一直是业界难题。这个面试场景设计项目聚焦Java技术生态,通过音视频处理和微服务架构两个典型技术方向,构建了一套层次化的能…

2026/8/23 9:57:42

从PAT真题到工程实践:浮点数精度处理与复数运算的编程实现

1. 项目概述:从一道PAT真题看复数运算的工程实现 最近在带学生刷PAT乙级(Basic Level)的题目,又碰到了那道经典的1051题——复数乘法。这道题本身在数学上并不复杂,就是两个复数相乘,然后按指定格式输出。但…

2026/8/23 9:57:42

从阿里面试题解析浮点数比较与运算符重载

1. 问题背景与面试意图解析 这道来自阿里的面试题看似简单&#xff0c;却暗藏玄机。当面试官抛出"i>j && i<j && i!j"这个条件表达式时&#xff0c;实际上是在考察候选人对以下几个维度的理解深度&#xff1a; 编程语言中比较运算符的底层实现…

2026/8/23 9:57:42

自适应多智能体脚手架:解锁大模型在复杂任务中的工程潜力

1. 从单兵作战到团队协作&#xff1a;为什么我们需要“脚手架”来解锁模型潜力最近在跟几个做AI应用落地的朋友聊天&#xff0c;大家普遍有个感觉&#xff1a;现在的大语言模型&#xff08;LLM&#xff09;&#xff0c;无论是GPT-4、Claude 3&#xff0c;还是国内的一些顶尖模型…

2026/8/23 9:52:42

多智能体隐蔽协调检测:从原理到工程实践

1. 先搞清楚这个研究到底在解决什么问题 看到“超越文本&#xff1a;检测潜在多智能体通信中的隐蔽协调”这个标题&#xff0c;很多人第一反应可能是“又一个多智能体协作的论文”。但它的核心价值不在于让智能体协作&#xff0c;而在于 如何发现和诊断智能体之间那些“看不见…

2026/8/23 0:02:04

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:02:04

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/23 0:02:04

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:02:04

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:02:04

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/23 0:02:04

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/21 15:40:01

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/23 6:14:43

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/23 4:22:01

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…