Spring Cloud 技术实战
Spring Cloud 简介
Spring Cloud 是基于 Spring Boot 构建的微服务框架,提供了一套完整的微服务解决方案。它利用 Spring Boot 的开发便利性,并通过各种组件简化分布式系统的开发。
核心组件
- Spring Cloud Netflix Eureka: 服务注册与发现
- Spring Cloud Gateway: API 网关
- Spring Cloud Config: 配置中心
- Spring Cloud OpenFeign: 声明式 REST 客户端
- Spring Cloud Circuit Breaker: 断路器
- Spring Cloud Sleuth & Zipkin: 分布式追踪
实战部署
项目结构
spring-cloud-demo/
├── eureka-server/ # 服务注册中心
├── config-server/ # 配置中心
├── gateway-service/ # API 网关
├── user-service/ # 用户服务
├── order-service/ # 订单服务
└── pom.xml # 父 POM
步骤一:创建父项目
创建 pom.xml
,管理依赖版本:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.7</version>
</parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.2</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
步骤二:Eureka 服务注册中心
- 添加依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 配置
application.yml
:
server:port: 8761eureka:client:register-with-eureka: falsefetch-registry: false
- 启动类添加
@EnableEurekaServer
注解
步骤三:配置中心
- 添加依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 配置
application.yml
:
server:port: 8888spring:cloud:config:server:git:uri: https://github.com/your-repo/config-repodefault-label: main
- 启动类添加
@EnableConfigServer
注解
步骤四:API 网关
- 添加依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置路由:
spring:cloud:gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/api/users/**- id: order-serviceuri: lb://order-servicepredicates:- Path=/api/orders/**
步骤五:微服务实现
- 创建公共模块依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
- 服务调用示例:
@FeignClient(name = "user-service")
public interface UserClient {@GetMapping("/api/users/{id}")User getUserById(@PathVariable("id") Long id);
}
服务降级策略
在微服务架构中,服务降级是保障系统可用性的关键策略。Spring Cloud 提供了多种服务降级机制,主要通过 Resilience4j(替代了之前的 Hystrix)实现。
1. 断路器(Circuit Breaker)
断路器模式用于防止服务级联故障。当某个服务频繁失败时,断路器会"断开",快速失败而不是等待超时。
添加依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
配置断路器:
resilience4j:circuitbreaker:instances:userService:registerHealthIndicator: trueslidingWindowSize: 10minimumNumberOfCalls: 5permittedNumberOfCallsInHalfOpenState: 3automaticTransitionFromOpenToHalfOpenEnabled: truewaitDurationInOpenState: 5sfailureRateThreshold: 50slowCallRateThreshold: 100slowCallDurationThreshold: 2s
在代码中使用:
@CircuitBreaker(name = "userService", fallbackMethod = "getUserFallback")
public User getUser(Long id) {return userClient.getUserById(id);
}public User getUserFallback(Long id, Exception e) {log.error("获取用户信息失败,进入服务降级", e);return new User(id, "默认用户", 0);
}
2. 舱壁模式(Bulkhead)
舱壁模式限制对特定服务的并发调用数,防止单个服务故障影响整个系统资源。
配置:
resilience4j:bulkhead:instances:userService:maxConcurrentCalls: 10maxWaitDuration: 1s
使用方式:
@Bulkhead(name = "userService", fallbackMethod = "getUserFallback")
public User getUser(Long id) {return userClient.getUserById(id);
}
3. 超时处理(TimeLimiter)
防止长时间运行的调用阻塞资源:
resilience4j:timelimiter:instances:userService:timeoutDuration: 2scancelRunningFuture: true
代码实现:
@TimeLimiter(name = "userService", fallbackMethod = "getUserFallback")
public CompletableFuture<User> getUserWithTimeout(Long id) {return CompletableFuture.supplyAsync(() -> userClient.getUserById(id));
}
4. 重试机制(Retry)
当服务调用失败时进行重试:
resilience4j:retry:instances:userService:maxAttempts: 3waitDuration: 1sretryExceptions:- org.springframework.web.client.HttpServerErrorExceptionignoreExceptions:- java.util.NoSuchElementException
代码实现:
@Retry(name = "userService", fallbackMethod = "getUserFallback")
public User getUserWithRetry(Long id) {return userClient.getUserById(id);
}
5. Feign 客户端降级
为 Feign 客户端配置服务降级:
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {@GetMapping("/api/users/{id}")User getUserById(@PathVariable("id") Long id);
}@Component
public class UserClientFallback implements UserClient {@Overridepublic User getUserById(Long id) {return new User(id, "默认降级用户", 0);}
}
配置 Feign:
feign:circuitbreaker:enabled: true
6. 集成服务降级与监控
使用 Spring Boot Actuator 监控断路器状态:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置监控端点:
management:endpoints:web:exposure:include: health,info,circuitbreakersendpoint:health:show-details: alwayshealth:circuitbreakers:enabled: true
部署运行
- 构建各模块:
mvn clean package
- 启动顺序:Eureka Server > Config Server > 微服务 > Gateway
- 访问 Eureka 控制台:
http://localhost:8761
- 通过网关访问服务:
http://localhost:8080/api/users/1
总结
Spring Cloud 提供了构建微服务架构的完整解决方案,通过服务降级策略可以有效提高系统的稳定性和可用性。在微服务架构中,服务降级是必不可少的弹性设计,它确保了当部分服务不可用时,系统依然能够提供基本功能,避免级联故障导致整个系统瘫痪。实际生产环境中,还需根据业务需求和服务特性合理配置断路器阈值、超时时间和重试策略,同时结合监控系统实时关注服务健康状态。
相关文章:
Spring Cloud 技术实战
Spring Cloud 简介 Spring Cloud 是基于 Spring Boot 构建的微服务框架,提供了一套完整的微服务解决方案。它利用 Spring Boot 的开发便利性,并通过各种组件简化分布式系统的开发。 核心组件 Spring Cloud Netflix Eureka: 服务注册与发现Spring Clou…...
《云端共生体:Flutter与AR Cloud如何改写社交交互规则》
当Flutter遇上AR Cloud,一场关于社交应用跨设备增强现实内容共享与协作的变革正在悄然发生。 Flutter是谷歌推出的一款开源UI软件开发工具包,其最大的优势在于能够实现一套代码,多平台部署,涵盖iOS、Android、Web、Windows、macO…...
【数据结构】1-3 算法的时间复杂度
数据结构知识点合集:数据结构与算法 • 知识点 • 时间复杂度的定义 1、算法时间复杂度 事前预估算法时间开销T(n)与问题规模 n 的关系(T 表示 “time”) 2、语句频度 算法中语句的执行次数 对于以上算法,语句频度:…...
Science Robotics 封面论文:基于形态学开放式参数化的仿人灵巧手设计用于具身操作
人形机械手具有无与伦比的多功能性和精细运动技能,使其能够精确、有力和稳健地执行各种任务。在古生物学记录和动物王国中,我们看到了各种各样的替代手和驱动设计。了解形态学设计空间和由此产生的涌现行为不仅可以帮助我们理解灵巧的作用及其演变&#…...
Vue百日学习计划Day24-28天详细计划-Gemini版
总目标: 在 Day 24-27 熟练掌握 Vue.js 的各种模板语法,包括文本插值、属性绑定、条件渲染、列表渲染、事件处理和表单绑定,并能结合使用修饰符。 所需资源: Vue 3 官方文档 (模板语法): https://cn.vuejs.org/guide/essentials/template-syntax.htmlVu…...
C++_数据结构_哈希表(hash)实现
✨✨ 欢迎大家来到小伞的大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 小伞的主页:xiaosan_blog 制作不易!点个赞吧!!谢谢喵!&…...
elasticsearch kibana ik 各版本下载
https://release.infinilabs.com/analysis-ik/stable/或者 https://github.com/infinilabs/analysis-ik/releases...
Uniapp 与 Uniapp X 对比:新手上手指南及迁移到 Uniapp X 的注意事项
文章目录 前言一、Uniapp 与 Uniapp X 核心区别二、Uniapp X 的核心优势三、新手学习 Uniapp X 必备技能栈3.1 基础技能要求3.2 平台相关知识3.3 工具链掌握 四、从 Uniapp 迁移到 Uniapp X 的注意事项4.1 语法转换:4.2 组件替换:4.3 状态管理࿱…...
SQL性能分析
查看数据库操作频次 使用SHOW GLOBAL STATUS LIKE Com_______; 指令,能查看当前数据库的INSERT、UPDATE、DELETE、SELECT访问频次 。若以查询为主,需重点优化查询相关性能,如索引;若以增删改为主,可考虑事务处理、批量…...
CANoe测试应用案例之A2L
写在前面 本系列文章主要讲解CANoe测试应用案例之A2L的相关知识,希望能帮助更多的同学认识和了解CANoe测试。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) CANoe Option AMD/XCP支持加载A2L到CANoe中,方便ECU内部变量在功能验…...
H2数据库源码学习+debug, 数据库 sql、数据库引擎、数据库存储从此不再神秘
一、源码结构概览 H2源码采用标准Maven结构,核心模块在src/main/org/h2目录下: ├── command/ # SQL解析与执行 ├── engine/ # 数据库引擎核心(会话、事务) ├── table/ # 表结构定义与操作 ├── index/ # 索引实现&am…...
PopSQL:一个支持团队协作的SQL开发工具
PopSQL 是一款专为团队协作设计的现代化 SQL 编辑器,通过通团队过协作编写 SQL 查询、交互式可视化以及共享结果提升数据分析和管理效率。 PopSQL 提供了基于 Web 的在线平台以及跨系统(Windows、macOS、Linux)的桌面应用,包括免费…...
tomcat查看状态页及调优信息
准备工作 先准备一台已经安装好tomcat的虚拟机,tomcat默认是状态页是默认被禁用的 1.添加授权用户 vim /usr/local/tomcat/conf/tomcat-users.xml22 <role rolename"manager-gui"/>23 <user username"admin" password"tomcat&q…...
贝塞尔曲线原理
文章目录 一、 低阶贝塞尔曲线1.一阶贝塞尔曲线2. 二阶贝塞尔曲线3. 三阶贝塞尔曲线 一、 低阶贝塞尔曲线 1.一阶贝塞尔曲线 如下图所示, P 0 P_0 P0, P 1 P_1 P1 是平面中的两点,则 B ( t ) B ( t ) B(t) 代表平面中的一段线段。…...
【MYSQL】笔记
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 在ubuntu中,改配置文件: sudo nano /etc/mysql/mysql.conf.d/mysq…...
构建 TypoView:一个富文本样式预览工具的全流程记录
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在一次和 CodeBuddy 的日常交流中,我提出了一个构想:能不能帮我从零构建一个富文本样式…...
使用conda创建python虚拟环境,并自定义路径
创建虚拟环境 conda create --prefixE:/ai-tools/Luoxuejiao/envs/Luo24 python3.8 此时虚拟环境没有名字,只有路径,下面将名字添加到配置中: conda config --append envs_dirs E:/ai-tools/Luoxuejiao/envs/...
【自然语言处理与大模型】向量数据库技术
向量数据库,是专门为向量检索设计的中间件! 高效存储、快速检索和管理高纬度向量数据的系统称为向量数据库 一、向量数据库是什么有什么用? 向量数据库是一种专门用于高效存储和检索高维向量数据的系统。它通过嵌入模型将各类非结构化数据&am…...
Java中的伪共享(False Sharing):隐藏的性能杀手与高并发优化实战
引言 在高性能Java应用中,开发者通常会关注锁竞争、GC频率等显性问题,但一个更隐蔽的陷阱——伪共享(False Sharing)——却可能让精心设计的并发代码性能骤降50%以上。伪共享是由CPU缓存架构引发的底层问题,常见于多…...
【数据结构】2-3-3单链表的查找
数据结构知识点合集 知识点 单链表的按位查找 GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。 /*查找L中的第i个节点并返回*/ LNode *GetElm(LinkList L,int i) { /*位置不合法返回NULL*/ if(i<0) return NULL; /*p指向当前节…...
从0开始学linux韦东山教程第四章问题小结(1)
本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。说实在的越看视频越感觉他讲的有点乱后续将以他的新版PDF手册为中心,视频作为辅助理解的工具。参考手册为嵌入式Linux应用开发…...
TYUT-企业级开发教程-第三章
JAVAWEB的三大组件 在 Spring Boot 项目中,会自动将 Spring 容器中的 Servlet 、 Filter 、 Listener 实例注册为 Web 服务器中对应的组件。因此,可以将自定义的 Java Web 三大组件作为 Bean 添加到 Spring 容器中,以实现组件的注册。使用 S…...
【数据结构】2-3-2 单链表的插入删除
数据结构知识点合集 知识点 按位序插入带头节点链表 ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e;找到第 i-1 个结点,将新结点插入其后 。 /*在带头节点的单链表L的第i个位置插入元素e*/ bool ListInsert(LinkList …...
spark-配置yarn模式
1.上传并解压spark-3.1.1-bin-hadoop3.2.tgz (/opt/software) 解压的命令是:tar -zxvf spark-3.3.1-bin-hadoop3.tgz -C /opt/module (cd /opt/software 进入software) 2.重命名 解压之后的目录为spark-yarn(原为spark-3.1.1-…...
鸿蒙系统电脑:开启智能办公新时代
鸿蒙系统电脑:开启智能办公新时代 引言 2025 年 5 月 8 日,华为正式推出了鸿蒙系统电脑,这款具有里程碑意义的产品,不仅彰显了华为在智能设备领域的创新实力,也为用户带来了全新的智能办公体验。在数字化转型加速的背…...
Ubuntu---omg又出bug了
自用遇到问题的合集 250518——桌面文件突然消失 ANS:参考博文...
COCO数据集神经网络性能现状2025.5.18
根据当前搜索结果,截至2025年5月,COCO数据集上性能最佳的神经网络模型及其关键参数如下: 1. D-FINE(中科大团队) 性能参数: 在COCO数据集上以78 FPS的速度实现了59.3%的平均精度(AP࿰…...
elementplus menu 设置 activeindex
<el-menu:default-active"defaultActive"> 更改当前激活的 index 可以 绑定:default-active"defaultActive" 改变 defaultActive 值 即会改变 index 但不会改变路径 watch(() > route.fullPath,(newPath: string) > {defaultActive.value…...
张 心理问题的分类以及解决流程
心理问题的分类以及解决流程 目录 心理问题的分类以及解决流程心理问题的分类**一、心理问题的分类与层次****1. 一般心理问题****2. 严重心理问题****3. 神经症性心理问题(神经症)****4. 精神障碍**轻度问题以心理咨询==判断:时间(3个月,1年,大于1年=神经质),社会功能(…...
网页 H5 微应用接入钉钉自动登录
ℹ️关于云审批 云审批(cloud approve) ,一款专为小微企业打造,支持多租户的在线审批神器。它简化了申请和审批流程,让您随时随地通过手机或电脑完成请款操作。员工一键提交申请,审批者即时响应,…...
接口——类比摄像
最近迷上了买相机,大疆Pocket、Insta Go3、大疆Mini3、佳能50D、vivo徕卡人像大师(狗头),在买配件的时候,发现1/4螺口简直是神中之神,这个万能接口让我想到计算机设计中的接口,遂有此篇—— 接…...
java每日精进 5.18【文件存储】
1.文件存储思路 支持将文件上传到三类存储器: 兼容 S3 协议的对象存储:支持 MinIO、腾讯云 COS、七牛云 Kodo、华为云 OBS、亚马逊 S3 等等。磁盘存储:本地、FTP 服务器、SFTP 服务器。数据库存储:MySQL、Oracle、PostgreSQL、S…...
LeetCode 394. 字符串解码详解:Java栈实现与逐行解析
文章目录 1. 问题描述2. 解决思路核心问题栈的应用遍历逻辑 3. 完整代码实现4. 关键代码解析处理右括号 ]处理嵌套的示例 5. 复杂度分析6. 总结 1. 问题描述 给定一个经过编码的字符串,要求将其解码为原始字符串。编码规则为 k[encoded_string],表示方括…...
基于STC89C52的红外遥控的电子密码锁设计与实现
一、引言 电子密码锁作为一种安全便捷的门禁系统,广泛应用于家庭、办公室等场景。结合红外遥控功能,可实现远程控制开锁,提升使用灵活性。本文基于 STC89C52 单片机,设计一种兼具密码输入和红外遥控的电子密码锁系统,详细阐述硬件选型、电路连接及软件实现方案。 二、硬…...
Android 性能优化入门(一)—— 数据结构优化
1、概述 一款 app 除了要有令人惊叹的功能和令人发指交互之外,在性能上也应该追求丝滑的要求,这样才能更好地提高用户体验: 优化目的性能指标优化的方向更快流畅性启动速度页面显示速度(显示和切换)响应速度更稳定稳定性避免出现 应用崩溃&…...
深入理解Docker和K8S
深入理解Docker和K8S Docker 是大型架构的必备技能,也是云原生核心。Docker 容器化作为一种轻量级的虚拟化技术,其核心思想:将应用程序及其所有依赖项打包在一起,形成一个可移植的单元。 容器的本质是进程: 容器是在…...
5.18本日总结
一、英语 复习list3list28 二、数学 学习14讲部分内容,1000题13讲部分 三、408 学习计网5.3剩余内容 四、总结 计网TCP内容比较重要,连接过程等要时常复习;高数学到二重积分对定积分的计算相关方法有所遗忘,需要加强巩固。…...
muduo库TcpServer模块详解
Muduo库核心模块——TcpServer Muduo库的TcpServer模块是一个基于Reactor模式的高性能TCP服务端实现,负责管理监听端口、接受新连接、分发IO事件及处理连接生命周期。 一、核心组件与职责 Acceptor 监听指定端口,接受新连接,通过epoll监听l…...
深入理解 OpenCV 的 DNN 模块:从基础到实践
在计算机视觉领域蓬勃发展的当下,深度学习模型的广泛应用推动着技术的不断革新。OpenCV 作为一款强大且开源的计算机视觉库,其 DNN(Deep Neural Network)模块为深度学习模型的落地应用提供了高效便捷的解决方案。本文将以理论为核…...
MyBatis 延迟加载与缓存
一、延迟加载策略:按需加载,优化性能 1. 延迟加载 vs 立即加载:核心区别 立即加载:主查询(如查询用户)执行时,主动关联加载关联数据(如用户的所有账号)。 场景…...
6.2.2邻接表法-图的存储
知识总览: 为什么要用邻接表 因为邻接矩阵的空间复杂度高(O(n)),且不适合边少的稀疏图,所以有了邻接表 用代码表示顶点、图 声明顶点图信息 声明顶点用一维数组存储各个顶点的信息,一维数组字段包括2个,每个顶点的…...
【甲方安全建设】拉取镜像执行漏洞扫描教程
文章目录 前置知识镜像(Docker Image)是什么?镜像的 tag(标签)查看本地已有镜像的 tag查看远程仓库的所有 tag构建镜像与拉取镜像的区别正文安装docker拉取待扫描镜像安装 veinmind-runner 镜像下载 veinmind-runner 平行容器启动脚本快速扫描本地镜像/容器6. 生成 报告前…...
第四天的尝试
目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 很抱歉的说一下,我昨天看白色巨塔电视剧,看的入迷了,同时也看出一些道理,学到东西; 但是把昨天的写事情给忘记了,今天…...
大数据场景下数据导出的架构演进与EasyExcel实战方案
一、引言:数据导出的演进驱动力 在数字化时代,数据导出功能已成为企业数据服务的基础能力。随着数据规模从GB级向TB级甚至PB级发展,传统导出方案面临三大核心挑战: 数据规模爆炸:单次导出数据量从万级到亿级的增长…...
svn: E170013 和 svn: E120171 的问题
在 Deepin23 上尝试用 svn 连接我的 Visual SVN 服务器,得到如下错误信息, > svn: E170013: Unable to connect to a repository at URL https://my.com/svn/mysource/branch_4.2.x > svn: E120171: 执行上下文错误: An error occurred during SSL…...
Limesurvay系统“48核心92GB服务器”优化方案
1、Redis maxmemory 16GB # 限制Redis内存(预留足够空间给其他服务) maxmemory-policy volatile-lru # 自动淘汰旧会话(仅对带TTL的键) save 300 100 # 仅保留一个条件减少阻塞 stop-writes-on-bgsave-error no #…...
DockerFile实战
背景 在上一篇文章中,我们对DockerFile有了一个较为深刻的认识,那么这篇文章,我将会向你展示如何自定义一个镜像并且在docker上运行。 一、基础指令 指令技术说明生产环境最佳实践典型错误示例FROM- 必须作为Dockerfile第一条指令 - 推…...
【Linux】简易版Shell实现(附源码)
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 前言 之前我们学习了Linux的进程概念以及进程控制相关接口: 【Linux】进程控制-CSDN博客 本篇文章,我们将一起踏上一段有趣的旅程&a…...
MATLAB安装常见问题解决方案
目前新版本的matlab安装往往需要十几G的本地安装容量,例如matlab2022b、matlab2023b, 首先就是要保证本地硬盘空间足够大,如果没有足够的本地内存空间,那么可以尝试释放本地硬盘空间,或者安装所需内存空间较小的旧版本的matlab&am…...
在 Vue 中插入 B 站视频
前言 在 Vue 项目中,有时我们需要嵌入 B 站视频来丰富页面内容,为用户提供更直观的信息展示。本文将详细介绍在 Vue 中插入 B 站视频的多种方法。 使用<iframe>标签直接嵌入,<iframe>标签是一种简单直接的方式,可将 B 站视频嵌…...