Spring Cloud探索之旅:从零搭建微服务雏形 (Eureka, LoadBalancer 与 OpenFeign实战)

news2025/5/17 1:06:51

引言

大家好!近期,我踏上了一段深入学习Spring Cloud构建微服务应用的旅程。我从项目初始化开始,逐步搭建了一个具备服务注册与发现、客户端负载均衡以及声明式服务调用功能的基础微服务系统。本文旨在记录这一阶段的核心学习内容与实践成果,希望能为同样在探索Spring Cloud的朋友们提供一些参考。

项目源码已托管至GitHub: GitHub - Wilsoncyf/learning-spring-cloud: learning-spring-cloud


一、项目整体架构概览

在深入细节之前,我们先通过下图了解当前项目的整体架构:

当前项目模块: 本项目采用多模块Maven项目结构:

  • learning-spring-cloud-parent: 父POM。
  • microservice-eureka-server: 服务注册与发现中心。
  • microservice-order-service: 订单服务 (多实例)。
  • microservice-user-service: 用户服务。
  • microservice-api-gateway: API网关/服务消费者。

二、奠定坚实基础:项目初始化与环境配置

万丈高楼平地起,一个规范的项目结构和可靠的环境是成功的开端。

  1. 多模块Maven项目搭建:我们采用多模块Maven项目结构 (learning-spring-cloud-parent),这有助于统一管理各微服务模块的依赖版本和插件配置,确保项目整体的规范性。
  2. 版本选型与管理:经过细致查证与官方文档确认,我们选定了兼容的 Spring Boot 3.3.0 与 Spring Cloud 2023.0.5(Leyton) 版本组合。所有依赖版本均通过父POM的<dependencyManagement>进行集中管理。
  3. 构建一致性保障
    • 配置了 maven-compiler-plugin 的 -parameters编译参数,使得Spring MVC在处理请求映射时能正确获取方法参数名,从而简化了Controller层的代码。

三、服务治理核心:Eureka服务注册与发现

在微服务架构中,服务实例的动态变化使得服务间的相互定位成为关键。Eureka为此提供了优雅的解决方案。

  1. Eureka原理初探:我们探讨了Eureka Server与Client的工作机制,包括服务注册、心跳续约、注册表拉取与本地缓存、服务下线以及自我保护模式等核心概念。
  2. Eureka Server搭建 (microservice-eureka-server)
    • 成功部署了一个单节点的Eureka Server (运行于端口 8761)。
    • 通过 @EnableEurekaServer 注解启用其功能,并配置其不进行自我注册及关闭自我保护模式(便于开发调试)。
    • Eureka Server的Web控制台已能正常访问,为后续服务注册做好准备。
  3. 服务提供者注册 (Eureka Client)
    • 创建了两个微服务作为服务提供者:
      • microservice-order-service(订单服务):部署了两个实例,分别运行于端口 8081 和 8091
      • microservice-user-service(用户服务):单实例运行于端口 8082
    • 这三个服务实例均通过引入 spring-cloud-starter-netflix-eureka-client依赖,并正确配置 spring.application.name 和 eureka.client.service-url.defaultZone,成功向Eureka Server注册,并在Eureka控制台上显示为 UP 状态。
    • 集成了Spring Boot Actuator,其 /actuator/health 端点自动为Eureka提供了健康检查信息。

四、提升系统弹性:客户端负载均衡 (Spring Cloud LoadBalancer)

当同一服务有多个实例时,如何有效地分发请求,避免单点过载,是提升系统弹性的关键。

  1. 负载均衡机制理解:区分了服务器端负载均衡与客户端负载均衡的原理与优缺点。Spring Cloud主要采用客户端负载均衡。
  2. Spring Cloud LoadBalancer实践
    • 创建了 microservice-api-gateway 模块 (运行于端口 8080),作为服务消费者。
    • 在其配置类中定义了一个使用 @LoadBalanced 注解的 RestTemplate Bean。
    • GatewayController 通过这个 RestTemplate,使用服务名(http://microservice-order-service/...) 调用订单服务。
    • 成功验证:多次请求API网关后,通过观察订单服务两个实例(8081和8091)的控制台日志,确认请求被以轮询 (Round Robin) 的方式均匀分发,客户端负载均衡有效运作。

五、优雅的服务间调用:声明式客户端OpenFeign

为了简化服务间的调用代码,我们引入了OpenFeign。

  1. OpenFeign的优势与原理:学习了OpenFeign如何通过创建接口的动态代理,将HTTP调用转换为简单的Java方法调用,其与Eureka和服务负载均衡的无缝集成。
  2. 集成与改造
    • 在 microservice-api-gateway 中添加 spring-cloud-starter-openfeign 依赖,并在主类上使用 @EnableFeignClients
    • 定义了 OrderServiceClient Feign接口,声明对订单服务的调用。
    • GatewayController 改造为注入并使用 OrderServiceClient,代码显著简化。
  3. 功能验证与配置
    • 负载均衡:通过Feign客户端发起的调用,依然能够被 Spring Cloud LoadBalancer 自动进行负载均衡。
    • 日志配置:成功配置了Feign的 Logger.Level.FULL 以及相应包的Logback日志级别,实现了详细的请求/响应日志输出,便于调试。
    • 超时配置:学习并实践了如何通过 application.yml 为特定Feign客户端配置连接超时 (connectTimeout) 和读取超时 (readTimeout),并通过模拟下游服务慢响应成功验证了超时机制的触发。

学习心得与总结

本次阶段性学习,让我深刻体会到:

  • 版本兼容性的重要性:Spring Boot与Spring Cloud各组件间存在严格的版本对应关系,务必参考官方文档。
  • 实践与调试是王道:许多概念只有在动手搭建、遇到问题、分析日志、解决错误的过程中才能真正理解透彻。
  • Spring Cloud的强大抽象:它将分布式系统中的复杂问题(如服务发现、负载均衡)通过简洁的注解和配置进行了优雅封装,极大地提升了开发效率。

展望未来

目前,我们的 microservice-api-gateway 模块主要承担了服务消费和简单聚合的角色。接下来,我们将深入学习 Spring Cloud Gateway 的核心功能,将其改造为一个功能更全面的、真正的API网关,探索其强大的动态路由、断言、过滤器等特性。

感谢阅读,期待在微服务的道路上继续探索与进步!

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

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

相关文章

当 AI 邂逅丝路:揭秘「丝路智旅」,用 RAG 重塑中阿文化旅游体验

目录 系统命名:丝路智旅 (Silk Road Intelligent Travel)系统概述系统架构设计系统功能模块技术选型:为何是它们?系统优势与特点未来展望与扩展总结在数字浪潮席卷全球的今天,古老的丝绸之路正在以一种全新的方式焕发生机。当深厚的文化底蕴遇上尖端的人工智能技术,会碰撞…

18.Excel数据透视表:第1部分创建数据透视表

一 什么是数据透视表 通过万花筒可以用不同的方式査看里面画面图像&#xff0c;在excel中可以将数据透视表看作是对准数据的万花筒&#xff0c;用不同角度去观察数据&#xff0c;也可以旋转数据&#xff0c;对数据进行重新排列&#xff0c;对大量的数据可以快速的汇总和建立交叉…

CSS AI 通义灵码 VSCode插件安装与功能详解

简介 在前端开发领域&#xff0c;页面调试一直是个繁琐的过程&#xff0c;而传统开发中美工与前端的对接也常常出现问题。如今&#xff0c;阿里云技术团队推出的通义灵码智能编码助手&#xff0c;为前端开发者带来了新的解决方案&#xff0c;让开发者可以像指挥者一样&#xf…

【Linux网络】TCP全连接队列

TCP 相关实验 理解 listen 的第二个参数 基于刚才封装的 TcpSocket 实现以下测试代码对于服务器, listen 的第二个参数设置为 1, 并且不调用 accept测试代码链接 test_server.cc #include "tcp_socket.hpp"int main(int argc, char* argv[]) {if (argc ! 3) {pri…

HTML 颜色全解析:从命名规则到 RGBA/HSL 值,附透明度设置与场景应用指南

一、HTML 颜色系统详解 HTML 中的颜色可以通过多种方式定义&#xff0c;包括颜色名称、RGB 值、十六进制值、HSL 值等&#xff0c;同时支持透明度调整。以下是详细分类及应用场景&#xff1a; 1. 颜色名称&#xff08;预定义关键字&#xff09; HTML 预定义了 140 个标准颜色名…

深度剖析多模态大模型中的视频编码器算法

写在前面 随着多模态大型语言模型(MLLM)的兴起,AI 理解世界的能力从静态的文本和图像,进一步拓展到了动态的、包含丰富时空信息的视频。视频作为一种承载了动作、交互、场景变化和声音(虽然本文主要聚焦视觉部分)的复杂数据形式,为 MLLM 提供了理解真实世界动态和因果关…

游戏引擎学习第282天:Z轴移动与摄像机运动

运行游戏&#xff0c;展示目前进展 我们目前正在进行一个游戏开发项目。昨天&#xff0c;我们实现了基于房间的角色移动系统&#xff0c;并且加入了摄像机的跟随滚动功能。这是我们首次进入“游戏逻辑设计”阶段&#xff0c;也就是说&#xff0c;我们开始构建游戏本身的行为和…

aws 实践创建policy + Role

今天Cyber 通过image 来创建EC2 的时候,要添加policy, 虽然是administrator 的role, 参考Cyber 提供的link: Imageshttps://docs.cyberark.com/pam-self-hosted/14.2/en/content/pas%20cloud/images.htm#Bring 1 Step1:

【HarmonyOS 5】鸿蒙星闪NearLink详解

【HarmonyOS 5】鸿蒙星闪NearLink详解 一、前言 鸿蒙星闪NearLink Kit 是 HarmonyOS 提供的短距离通信服务&#xff0c;支持星闪设备间的连接、数据交互。例如&#xff0c;手机可作为中心设备与外围设备&#xff08;如鼠标、手写笔、智能家电、车钥匙等&#xff09;通过星闪进…

WF24 wifi/蓝牙模块串口与手机蓝牙通信

usb-ttl ch340接线 打开串口工具SSCOM&#xff0c;端口号选择ch340接的那个口&#xff0c;波特率改成115200 DX-SMART_2.0.5.apk下载 手机打开DX-SMART软件 点击透传-搜索BLE-连接WF24-BLE 连接成功串口会收到消息 [14:37:10.591]收←◆ BLE_CONNECT_SUCCESS发送命令ATBLUFI…

通义千问席卷日本!开源界“卷王”阿里通义千问成为日本AI发展新基石

据日本经济新闻&#xff08;NIKKEI&#xff09;报道&#xff0c;通义千问已成为日本AI开发的新基础&#xff0c;其影响力正逐步扩大&#xff0c;深刻改变着日本AI产业的格局。 同时&#xff0c;日本经济新闻将通义千问Qwen2.5-Max列为全球AI模型综合评测第六名&#xff0c;不仅…

流程编辑器Bpmn与LogicFlow学习

工作流技术如何与用户交互结合&#xff08;如动态表单、任务分配&#xff09;处理过 XML 与 JSON 的转换自定义过 bpmn.js 的样式&#xff08;如修改节点颜色、形状、图标&#xff09;扩展过上下文菜单&#xff08;Palette&#xff09;或属性面板&#xff08;Properties Panel&…

Figma 新手教程学习笔记

&#x1f4fa; 视频地址&#xff1a;Figma新手教程2025&#xff5c;30分钟高效掌握Figma基础操作与UI设计流程_哔哩哔哩_bilibili &#x1f9ed; 课程结构 Figma 简介&#xff08;00:38&#xff09; 熟悉工作环境&#xff08;01:49&#xff09; 操作界面介绍&#xff08;03:…

配置Spark环境

1.上传spark安装包到某一台机器&#xff08;自己在finaShell上的机器&#xff09;。 2.解压。 把第一步上传的安装包解压到/opt/module下&#xff08;也可以自己决定解压到哪里&#xff09;。对应的命令是&#xff1a;tar -zxvf 安装包 -C /opt/module 3.重命名。进入/opt/mo…

Window下Jmeter多机压测方法

1.概述 Jmeter多机压测的原理&#xff0c;是通过单个jmeter客户端&#xff0c;控制多个远程的jmeter服务器&#xff0c;使他们同步的对服务器进行压力测试。 以此方式收集测试数据的好处在于&#xff1a; 保存测试采样数据到本地机器通过单台机器管理多个jmeter执行引擎测试…

视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解

引言 在数字图像与视频压缩领域&#xff0c;离散余弦变换&#xff08;Discrete Cosine Transform, DCT&#xff09;凭借其卓越的能量集中特性&#xff0c;成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域&#xff0c;分离出DC系数&#xff08;直流分量&…

能源设备数据采集

在全球可持续发展目标与环境保护理念日益深入人心的时代背景下&#xff0c;有效管理和优化能源使用已成为企业实现绿色转型、提升竞争力的关键路径。能源设备数据采集系统&#xff0c;作为能源管理的核心技术支撑&#xff0c;通过对各类能源生产设备运行数据的全面收集、深度分…

Go语言安装proto并且使用gRPC服务(2025最新WINDOWS系统)

1.protobuf简介 protobuf 即 Protocol Buffers&#xff0c;是一种轻便高效的结构化数据存储格式&#xff0c;与语言、平台无关&#xff0c;可扩展可序列化。protobuf 性能和效率大幅度优于 JSON、XML 等其他的结构化数据格式。protobuf 是以二进制方式存储的&#xff0c;占用空…

[Linux性能优化] 线程卡顿优化。Linux加入USB(HID)热插拔线程占用CPU优化。Linux中CPU使用率过高优化

文章目录 [Linux性能优化] 线程卡顿优化。0、省流版本一、问题定位&#xff1a;CPU 资源分析二、线程卡顿现场复现线程优化前图片 三、线程卡顿优化方向1.如果是轮询方式2.如果是事件驱动方式 四、修改方式线程优化后图片 [Linux性能优化] 线程卡顿优化。 0、省流版本 如果采…

Ubuntu20.04下如何源码编译Carla,使用UE4源码开跑,踩坑集合

一、简介 作为一个从事算法研究的人员,无人驾驶仿真一直是比较重要的一部分,但是现在比较常见的算法验证都是在carla这个开源仿真平台上做的,所以我有二次开发carla的需求,今天就来讲讲编译CARLA。 网上的教材很多,但还是推荐大家看官网教程:Linux build - CARLA Simul…