微服务保护方案

简介: Spring Cloud微服务中,服务保护机制对保障系统稳定性至关重要,主要包括熔断、降级、超时、线程隔离和限流。熔断快速失败避免雪崩,降级提供默认响应保证核心功能,超时防止长时间等待,线程隔离限制故障影响范围,限流控制流量峰值,共同提升系统容错与可用性。

Spring Cloud微服务架构中的服务保护是非常重要的,它能够确保系统的稳定性和可用性,特别是在面对突发流量或者服务异常的情况下。常用的微服务保护方案包括但不限于以下几个方面:

  1. 熔断 (Circuit Breaker) 熔断机制用于在服务出现问题时快速失败,避免调用链路中的服务相互等待,导致整体系统响应变慢甚至不可用。

如何快速失败(fast fail)呢?当服务的错误率达到一定程度时,断路器(相当于保险丝)会打开,直接返回错误而不是尝试调用服务。一段时间后,断路器会处于半开状态尝试调用服务,如果服务恢复正常,则关闭断路器。

【知识拓展】

AI:fast fail和safe fail区别

答:

Fast Fail(快速失败):旨在快速暴露问题,防止错误扩散或导致更严重的后果,如医疗、金融场景。缺点是:导致系统中断,影响用户体验【直接抛异常】

Safe Fail(安全失败):旨在最大程度保证系统可用和安全性,如在线服务、云计算平台。缺点是:可能导致问题被掩盖,增加修复难度。【try-catch,返回一个默认值(即降级)】

断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。

  1. 降级 (Degradation) 断路器会统计访问某个服务的请求数量统计服务提供方的异常比例,当比例过高表明该接口会影响到其它服务,应该拒绝调用该接口,而是直接走降级逻辑

降级逻辑 即提供一个简化的响应或者默认的响应来代替正常的服务调用。这样可以保证核心业务不受影响,非核心业务暂时被限制或关闭。

熔断后,接口还通吗?

不通,直接异常

降级后,接口还通吗?

通,但返回的是降级逻辑,即类似一个默认值,故业务逻辑不一定闭环,后续还需要人工补偿

  1. 超时 (Timeout) 设置合理的超时时间可以避免长时间等待响应导致的问题。当请求超时时,可以选择快速失败并返回错误信息,或者重试等策略。

常见的远程调用框架,都设置了超时机制。

AI:目前Http、Dubbo、WebService都有超时机制吗?

答:是的,HTTPDubboWebService 都支持超时机制,但它们的实现方式和配置方法有所不同

HTTP连接超时、读取超时

Dubbo:服务调用超时(默认3s),超时后自动重试2次

WebService连接超时、读取超时

  1. 线程隔离 (Thread Isolation) 线程隔离是指为每个服务分配独立的线程池,这样即使某个服务出现问题也不会影响到其他服务。

线程隔离的思想来自轮船的舱壁模式:

轮船的船舱会被隔板分割为N个相互隔离的密闭舱,假如轮船触礁进水,只有损坏的部分密闭舱会进水,而其他舱由于相互隔离,并不会进水。这样就把进水控制在部分船体,避免了整个船舱进水而沉没。

为了避免某个接口故障或压力过大导致整个服务不可用,我们可以限定每个接口可以使用的资源范围,也就是将其“隔离”起来。

如图所示,我们给查询购物车业务限定可用线程数量上限为20,这样即便查询购物车的请求因为查询商品服务而出现故障,也不会导致服务器的线程资源被耗尽,不会影响到其它接口。

  1. 限流 (Rate Limiting) 限流是最常见的服务保护措施之一,其目的是为了防止服务因为过大的流量而崩溃。

对于某些关键资源或者参数的访问,可以采取特殊的限流措施来防止这些热点成为瓶颈。

限流往往会有一个限流器,数量高低起伏的并发请求曲线,经过限流器就变的非常平稳。这就像是水电站的大坝,起到蓄水的作用,可以通过开关控制水流出的大小,让下游水流始终维持在一个平稳的量。

可以通过以下几种方式进行限流(有兴趣的可以看看下面两种实现方案,前期可以仅做了解):

  • 基于令牌桶算法:允许一定数量的请求通过,超出则拒绝或排队等待。
  • 基于滑动窗口:在一段时间内对请求进行计数,超过阈值则触发限流。
相关文章
|
Java 测试技术 网络架构
SpringBoot之请求处理
SpringBoot之请求处理
320 1
|
10月前
|
人工智能 安全 Java
掌握 Spring 中的 WebClient
本文介绍了 Spring Boot 开发中 WebClient 的使用场景及优势。WebClient 是非阻塞响应式 Web 客户端,适合高并发、流式数据处理和微服务通信。它支持事件驱动架构、大文件传输、超时重试机制,并可与 OAuth2 集成实现安全通信。相比 RestTemplate,WebClient 提供更高效的资源利用和灵活的并发处理能力,适用于现代响应式应用开发。文中通过代码示例详细对比了两者的区别,展示了 WebClient 在异步编程中的强大功能。
1272 0
|
4月前
|
Java 调度
什么是分片广播任务
本文介绍XXL-JOB的分片广播机制,通过集群执行器动态分片处理任务。调度中心为每个执行器分配分片参数,实现任务并行处理,提升效率。适用于大数据量分布式场景,支持动态扩容,每台机器处理部分数据,显著降低耗时。开发时可通过`getShardIndex()`和`getShardTotal()`获取分片信息,灵活控制业务逻辑。
|
4月前
|
缓存 NoSQL 关系型数据库
【高并发实战】Redis缓存穿透、击穿、雪崩:3大经典的“炸库”危机与自救指南
本文详解缓存穿透、击穿、雪崩三大问题:穿透是查不存在的数据,击穿是热点Key失效被高并发冲击,雪崩是大量Key同时过期或Redis故障。结合比喻与解决方案,助你彻底理解并防范数据库风险。
|
4月前
|
弹性计算 安全 Linux
【安全硬核】3分钟学会配置Linux防火墙:Firewalld实战指南
本文介绍Linux服务器防火墙Firewalld的使用,作为云安全组后的第二道防线。涵盖启停服务、开放/关闭端口、查看状态、IP白名单设置等核心操作,并强调与阿里云安全组协同配置的重要性,助力构建生产环境的纵深防御体系。(238字)
|
4月前
|
SQL Java 关系型数据库
【并发实战】拒绝数据乱套!乐观锁与悲观锁的落地应用指南
在分布式场景下,Java锁无法解决数据并发问题。本文详解悲观锁(SELECT FOR UPDATE)与乐观锁(版本号机制),结合MySQL与MyBatis-Plus实战,助你应对秒杀超卖等高并发难题,提升系统一致性与性能。
|
4月前
|
缓存 Java Docker
【Docker实战】如何写出“性感”的Dockerfile?从1GB瘦身到100MB的秘籍
本文介绍如何编写高效、安全的Dockerfile,以Java和Python为例,分享四大核心技巧:多阶段构建减小镜像体积,利用缓存加速构建,选用轻量基础镜像,配置.dockerignore忽略无用文件。助你打造小巧、快速、安全的容器镜像,提升部署效率与安全性。
|
4月前
|
存储 运维 Java
【Docker入门】5分钟彻底搞懂镜像、容器与仓库:Docker的核心三剑客
Docker 通过“镜像、容器、仓库”三大核心实现“一次构建,到处运行”。镜像如食谱,容器是做好的菜,仓库似超市货架。用生活化比喻秒懂其原理与协作流程。
|
4月前
|
关系型数据库 MySQL Shell
【DBA实战】删库跑路?不存在的!生产环境MySQL自动备份全攻略
本文介绍如何用Shell脚本结合`mysqldump`实现MySQL数据库的自动备份,涵盖备份、压缩、按日期命名及30天自动清理策略,并通过Crontab定时执行,确保数据安全。
|
4月前
|
SQL 关系型数据库 MySQL
【SQL优化】不再抓瞎!手把手教你读懂MySQL Explain执行计划
本文详解MySQL执行计划工具EXPLAIN,教你读懂其输出的“天书”表格。重点掌握四个核心指标:`type`(访问类型)、`key`(实际使用索引)、`Extra`(额外信息)和`rows`(扫描行数)。通过实战案例解析慢查询成因与优化方案,助你快速定位SQL性能瓶颈,写出高效数据库查询。

热门文章

最新文章