Spring Cloud 微服务实战(一):还在硬编码服务地址?Nacos 注册中心从零搭建

发布时间:2026/10/14 16:03:09

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/10/12 21:51:07

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

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

2026/10/8 20:23:43

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

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

2026/10/12 1:09:49

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

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

2026/10/14 16:00:31

医院网络安全建设规划:从资产梳理到主动防御

简介:《医院网络安全建设规划》是一份针对医疗机构信息安全整体规划的完整方案文档,适合医院信息科人员、网络安全工程师及医疗信息化项目管理者参考。内容依据等级保护基本要求,围绕设计原则、网络结构分析、业务系统分析、等保建设流程及安…

2026/10/14 16:00:31

波士顿房价数据集:线性回归教学与TensorFlow底层实践指南

1. 为什么波士顿房价数据集至今仍是回归教学的“黄金标尺”你打开任何一本机器学习入门教材,翻到线性回归章节,十有八九会看到一个叫“Boston Housing”的数据集。它只有506行样本、13个特征,连现代GPU显存都填不满——可为什么十多年过去&am…

2026/10/14 16:00:31

《敏捷实践指南》是 PMI 与敏捷联盟合作开发的实践标准,旨在帮助从业者理解“何时、何地、如何”应用敏捷与混合方法

《敏捷实践指南》是 PMI 与敏捷联盟合作开发的实践标准,旨在帮助从业者理解“何时、何地、如何”应用敏捷与混合方法。全书围绕七个章节展开,从思维模式到生命周期选择,再到团队交付与组织变革,形成了一条从“认知”到“行动”的完…

2026/10/14 15:55:28

MTBF计算书怎么写:从失效率模型到元器件计数法的完整指南

简介:一份MTBF计算书示例,源自常州智电电子有限公司实际项目,面向可靠性工程师、电子硬件设计及质量管理岗位,系统展示了平均故障间隔时间(MTBF)的完整测算流程。资源为单个PDF文档,体积仅187KB…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/13 17:09:18

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑