设计稳定的微服务系统时不得不考虑的场景

Java后端稳定性建设最佳实践 合理设置网络超时时间 什么叫网络调用超时时间呢? 如应用服务器之间、应用服务器与 redis 服务器之间、应用服务器与 mq 服务器之间的网络请求,这些网络请求一般有三个超时时间: connectRequestTimeout :客户端从连接池获取连接超时时间。 connectTimeout:客户端与服务端建立连接超时时间。 sockettimeout :客户端与服务端读取数据超时时间。 为什么需要设置超时时间? 由于系统的连接池或者线程池的资源是有限的,假设没有设置超时时间,由于下游服务慢或者下 阅读详情

我们的生产环境经常会出现一些不稳定的情况,如:

  • 大促时瞬间洪峰流量导致系统超出最大负载,load 飙高,系统崩溃导致用户无法下单
  • “黑马”热点商品击穿缓存,DB 被打垮,挤占正常流量
  • 调用端被不稳定服务拖垮,线程池被占满,导致整个调用链路卡死

这些不稳定的场景可能会导致严重后果。大家可能想问:如何做到均匀平滑的用户访问?如何预防流量过大或服务不稳定带来的影响?

介绍

下面两种方式是在面对流量不稳定因素时常见的两种方案,也是我们在设计高可用的系统前不得不考虑的两种能力,是服务流量治理中非常关键的一环。

流量控制

流量是非常随机性的、不可预测的。前一秒可能还风平浪静,后一秒可能就出现流量洪峰了(例如双十一零点的场景)。每个系统、服务都有其能承载的容量上限,如果突然而来的流量超过了系统的承受能力,就可能会导致请求处理不过来,堆积的请求处理缓慢,CPU/Load 飙高,最后导致系统崩溃。因此,我们需要针对这种突发的流量来进行限制,在尽可能处理请求的同时来保障服务不被打垮,这就是流量控制。

熔断降级

一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。

现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。

Q:不少同学在问了,那么是不是服务的量级很小就不用进行流量控制限流防护了呢?是不是微服务的架构比较简单就不用引入熔断保护机制了呢?

A:其实,这与请求的量级、架构的复杂程度无关。很多时候,可能正是一个非常边缘的服务出现故障而导致整体业务受影响,造成巨大损失。我们需要具有面向失败设计的意识,在平时就做好容量规划和强弱依赖的梳理,合理地配置流控降级规则,做好事前防护,而不是在线上出现问题以后再进行补救。

在流量控制、降级与容错场景下,我们有多种方式来描述我们的治理方案,下面我将介绍一套开放、通用的、面向分布式服务架构、覆盖全链路异构化生态的服务治理标准 OpenSergo,我们看看 OpenSergo 是如何定义流控降级与容错的标准,以及支撑这些标准的实现有哪些,能帮助我们解决哪些问题?

OpenSergo 流控降级与容错 v1alpha1 标准

在 OpenSergo 中,我们结合 Sentinel 等框架的场景实践对流控降级与容错场景的实现抽象出标准的 CRD。我们可以认为一个容错治理规则 (FaultToleranceRule) 由以下三部分组成:

  • Target: 针对什么样的请求
  • Strategy: 容错或控制策略,如流控、熔断、并发控制、自适应过载保护、离群实例摘除等
  • FallbackAction: 触发后的 fallback 行为,如返回某个错误或状态码

那我们看看针对常用的流控降级场景,OpenSergo 具体的标准定义是什么样的,他是如何解决我们的问题的?

首先提到的,只要微服务框架适配了 OpenSergo,即可通过统一 CRD 的方式来进行流控降级等治理。无论是 Java 还是 Go 还是 Mesh 服务,无论是 HTTP 请求还是 RPC 调用,还是数据库 SQL 访问,我们都可以用这统一的容错治理规则 CRD 来给微服务架构中的每一环配置容错治理,来保障我们服务链路的稳定性。让我们来详细看看OpenSergo在各个具体场景下的一个配置。

流量控制

以下示例定义了一个集群流控的策略,集群总体维度每秒不超过 180 个请求。示例 CR YAML:

apiVersion: fault-tolerance.opensergo.io/v1alpha1
kind: RateLimitStrategy
metadata:
  name: rate-limit-foo
spec:
  metricType: RequestAmount
  limitMode: Global
  threshold: 180
  statDuration: "1s"
复制代码

这样一个简单的 CR 就能给我们的系统配置上一个流量控制的能力,流控能力相当于应用的一个安全气囊,超出系统服务能力以外的请求将被拒绝,具体逻辑可由我们自定义(如返回指定内容或跳转页面)。

熔断保护

以下示例定义了一个慢调用比例熔断策略,示例 CR YAML:

apiVersion: fault-tolerance.opensergo.io/v1alpha1
kind: CircuitBreakerStrategy
metadata:
  name: circuit-breaker-slow-foo
spec:
  strategy: SlowRequestRatio
  triggerRatio: '60%'
  statDuration: '30s'
  recoveryTimeout: '5s'
  minRequestAmount: 5
  slowConditions:
    maxAllowedRt: '500ms'
复制代码

这个 CR 的语意就是:在 30s 内请求超过 500ms 的比例达到 60% 时,且请求数达到 5 个,则会自动触发熔断,熔断恢复时长为 5s。

想象一下,在业务高峰期。当某些下游的服务提供者遇到性能瓶颈,甚至影响业务。我们对部分非关键服务消费者配置一个这样的规则,当一段时间内的慢调用比例或错误比例达到一定条件时自动触发熔断,后续一段时间服务调用直接返回 Mock 的结果,这样既可以保障调用端不被不稳定服务拖垮,又可以给不稳定下游服务一些“喘息”的时间,同时可以保障整个业务链路的正常运转。

流控降级与容错标准的实现

Sentinel 介绍

下面介绍一款支持 OpenSergo 流控降级与容错标准的项目 Sentinel 。

Sentinel 是阿里巴巴开源的,面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、流量整形、熔断降级、系统自适应保护等多个维度来帮助开发者保障微服务的稳定性。

Sentinel 的技术亮点:

  • 高度可扩展能力:基础核心 + SPI 接口扩展能力,用户可以方便地扩展流控、通信、监控等功能
  • 多样化的流量控制策略(资源粒度、调用关系、流控指标、流控效果等多个维度),提供分布式集群流控的能力
  • 热点流量探测和防护
  • 对不稳定服务进行熔断降级和隔离
  • 全局维度的系统负载自适应保护,根据系统水位实时调节流量
  • 覆盖 API Gateway 场景,为 Spring Cloud Gateway、Zuul 提供网关流量控制的能力
  • 云原生场景提供 Envoy 服务网格集群流量控制的能力
  • 实时监控和规则动态配置管理能力

一些普遍的使用场景:

  • 在服务提供方(Service Provider)的场景下,我们需要保护服务提供方自身不被流量洪峰打垮。这时候通常根据服务提供方的服务能力进行流量控制,或针对特定的服务调用方进行限制。我们可以结合前期压测评估核心接口的承受能力,配置 QPS 模式的限流,当每秒的请求量超过设定的阈值时,会自动拒绝多余的请求。

  • 为了避免调用其他服务时被不稳定的服务拖垮自身,我们需要在服务调用端(Service Consumer)对不稳定服务依赖进行隔离和熔断。手段包括信号量隔离、异常比例降级、RT 降级等多种手段。

  • 当系统长期处于低水位的情况下,流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。这时候我们可以借助 Sentinel 的 WarmUp 流控模式控制通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,而不是在一瞬间全部放行。这样可以给冷系统一个预热的时间,避免冷系统被压垮。

  • 利用 Sentinel 的匀速排队模式进行“削峰填谷”,把请求突刺均摊到一段时间内,让系统负载保持在请求处理水位之内,同时尽可能地处理更多请求。

  • 利用 Sentinel 的网关流控特性,在网关入口处进行流量防护,或限制 API 的调用频率。

阿里云微服务解决方案

在阿里云上提供了一款完全遵循 OpenSergo 微服务标准的企业级产品 MSE,MSE 服务治理的企业版中的流量治理能力我们可以理解为是一个商业化版本的 Sentinel ,我们也简单总结了一下 MSE 流量治理与社区方案在流控降级与容错场景下的一个能力对比。

下面我将基于 MSE 来演示一下,如何通过流量控制与熔断降级来保护我们的系统,可以从容地面对不确定性的流量以及一系列不稳定的场景。

  • 配置流控规则

我们可以在监控详情页面查看每个接口实时的监控情况。

我们可以点击接口概览右上角的“新增防护规则”按钮,添加一条流控规则:

我们可以配置最简单的 QPS 模式的流控规则,比如上面的例子即限制该接口每秒单机调用量不超过 80 次。

  • 监控查看流控效果

配置规则后,稍等片刻即可在监控页面看到限流效果:

被拒绝的流量也会返回错误信息。MSE 自带的框架埋点都有默认的流控处理逻辑,如 Web 接口被限流后返回 429 Too Many Requests,DAO 层被限流后抛出异常等。若用户希望更灵活地定制各层的流控处理逻辑,可以通过 SDK 方式接入并配置自定义的流控处理逻辑。

总结

流控降级与容错是我们设计稳定的微服务系统时不得不考虑的场景,如果我们设计每一套系统都要花许多心思来设计系统的流控降级与容错能力,这将会成为让我们每一个开发者都头疼的问题。那么我们接触与设计了那么多系统的流控降级,有没什么通用的场景、最佳实践、设计标准与规范乃至参考实现可以沉淀的?

本文从场景出发简单介绍了 OpenSergo 的流量控制与熔断保护标准,同时也介绍了 Sentinel 流量防护的背景和手段,最后通过示例来介绍如何利用 MSE 服务治理的流量防护能力来为 您的应用保驾护航。

微服务中的服务保护方案:确保系统稳定与安全 在微服务架构中,服务保护方案是确保系统稳定性和高可用性的关键。通过合理应用熔断器模式、限流、负载均衡、健康检查、重试机制、超时与快速失败以及安全防护等策略, 阅读详情

相关推荐

当我们谈微服务,我们在谈什么 (3) — 如何保障微服务的稳定性

当一个单体应用改造成多个微服务之后,在请求调用过程中往往会出现更多的问题,通信过程中的每一个环节都可能出现问题。而在出现问题之后,如果不加处理,还会出现链式反应导致服务雪崩。服务治理功能就是用来处理此类问题的。我们将从微服务的三个角色:注册中心、服务消费者以及服务提供者一一说起。 注册中心如何保障稳定性 注册中心主要是负责节点状态的维护,以及相应的变更探测与通知操作。一方面,注册中心自身的稳定性是...

weixin_33782386的博客 1686

桑基图实战指南:Excel/Python/R三工具高效绘制方法

桑基图是一种以线条宽度编码流量大小、以节点位置表达流程阶段、以连接关系呈现数据流向的专项可视化技术,其核心原理在于‘宽即量、位即序、连即逻辑’。它并非装饰性图表,而是面向业务诊断的分析前置工具,尤其适用于预算分配、能源损耗、用户转化等存在明确单向流动与显著数值差异的场景。相比传统柱状图或漏斗图,桑基图能天然暴露系统瓶颈与隐性损耗,大幅提升决策效率。本文聚焦工程落地,覆盖Excel插件快速交付、Python Plotly交互开发、R networkD3生态集成三大主流路径,兼顾数据准备铁律、索引映射规范与中文

cuml0912的博客 489

微服务(Microservice)那点事

WHAT - 什么是微服务 微服务简介 这次参加JavaOne2015最大的困难就是听Microservice相关的session,无论内容多么水,只要题目带microservice,必定报不上名,可见Microservice有多火。最喜欢其中一页。关于这个典故,可以参考this,此图适用于一切高大上的名字——技术有SOA,Agile,CLOUD,DevOps等等,古代有道,气,八卦等

Enweitech Software Works 5997

COMSOL 6.3合规安装与教育许可全流程指南

COMSOL Multiphysics 是面向多物理场耦合仿真的专业商业科学软件,其运行高度依赖合法许可证机制,而非传统意义上的‘安装即用’。它基于Java 17运行时构建,集成自研求解器内核与模块化功能包,需严格匹配版本、硬件环境及授权状态。教育许可(需.edu.cn邮箱认证)、试用许可(30天)和商业授权是唯一合规使用路径;所谓‘永久免费’实为对许可证生命周期的误解——即使标注permanent,仍受版本兼容性、服务器连通性与学术身份有效性制约。本文聚焦科研用户高频场景:如何通过官方渠道获取COMSOL

weixin_30681615的博客 739

rk3568 rockit编译测试

编译rockit不能使用SDK默认编译kernel的交叉编译,需要采用编译buildroot的,而编译buildroot的编译器SDK并没有存放,需要编译过buildroot之后才可以用。命令参数相关解析可查阅代码,这里提醒一下-l参数,这是程序运行计数,默认是100,时间很短,基本上显示画面一闪而过,一度以为是程序哪里出问题了,改用-l 1000,画面显示时间加长。此处跳过系统,单领出来编译。rockit组件包在4.10版本需要手动编译,奈何我的版本怎么都编译不了,后来改用5.10版本才编译通过。

zfenggo的博客 4198

微服务是否适用于我的系统——《微服务架构设计模式》读书笔记

本文主要是《微服务架构设计模式》的摘抄笔记,对于想了解微服务架构是否适用于自己系统的朋友,可以一看: 一、写在最前面 第一、编写简洁的代码和使用自动化测试至关重要,因为这是现代软件开发的基础。 第二、关注微服务的本质,即服务的分解和定义,而不是技术,如容器和其他工具。 第三、确保你的服务松耦合,并且何以独立开发、测试和部署,不要搞成分布式单体,那将会是巨大的灾难。 第四、不能只是在...

Pc620的专栏 1537

在centos7部署k8s搭建kubernetes集群

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。 Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找

山东梅长苏 1万+

微服务平台建设方案详细介绍:项目核心功能/场景

微服务平台建设方案详细介绍:项目核心功能/场景 去发现同类优质开源项目:https://gitcode.com/ 微服务平台建设方案——为开发者提供高效、稳定、安全的微服务架构设计。 项目介绍 在数字化时代,企业架构的灵活性、可扩展性以及稳定性变得尤为重要。微服务平台建设方案应运而生,它是一套全面的微服务架构设计方案,旨在为开发者提供一个高效率、稳定运行、安全可靠的微服务开发与运维环境。该方案通过...

gitblog_06712的博客 460

从登录到应用可见:在 SAP S/4HANA Cloud Private Edition 中创建用户与打通 SAP Fiori 权限的完整思路

在SAP S/4HANA系统中,用户创建远非简单的账号开通,而是涉及认证、授权、数据访问等多维度的复杂过程。用户主数据记录(User Master Record)是系统访问的起点,包含登录方式、角色分配等关键信息。认证解决"你是谁"的问题,授权则决定"你能做什么"。SAP Fiori访问链路涉及Launchpad内容分配、应用启动映射、OData服务权限等多层校验。角色(Role)通过PFCG维护,包含业务目录(Catalog)和空间(Space)等元素,共同构成完整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 151

Pytorch实用教程:super(MLP,self).__init__()和super().__init__()有什么区别?

在 Python 中,super()函数用于调用父类(超类)的方法。它的使用在继承关系中非常常见,特别是在初始化继承自父类的属性时。在 PyTorch 中,这通常见于初始化nn.Module类的子类。super()的两种调用方式有微妙的差别,但在 Python 3 中常常用来达到同样的目的。这种写法在 Python 2 中非常常见。这里,super()被调用时需要指定当前类名(MLP)和当前实例(self。

若北辰 1026

​手把手教你微服务的可用性设计

微服务现在有多火,应该不需要我过多解释了。现在可以确定,只要有点规模的公司,肯定是跑微服务架构。简单来说下背景,随着业务量越来越大,一台机器的性能已经无法满足了,我们需要多台机器才能应对...

pdcfighting的博客 386

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Golang微服务:彻底掌握7大设计模式,构建高并发系统(Context实战)

Go语言凭借其并发性能与云原生支持,成为团队微服务重构的首选。本文结合实际医疗业务场景,分享7个核心设计模式:1)领域驱动设计(DDD)指导服务拆分,如将患者管理与临床试验拆分为独立服务;2)gRPC与消息队列组合实现同步/异步通信;3)熔断器模式防止服务雪崩。这些模式通过Go-Zero框架实现,帮助团队构建高可用微服务系统。文章强调服务边界应由业务而非技术决定,建议初期粗拆后演进优化。

张国良的博客 713

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

《Java面试自救指南》(专题七)系统场景设计(含分布式、微服务)

面试需要掌握的分布式知识点,看这一篇就够了!

试问道几许 555

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

PHP微服务新星:Jin-microservices全面解析与应用推荐

PHP微服务新星:Jin-microservices全面解析与应用推荐 随着微服务架构在软件开发界的兴起,PHP开发者也迎来了新的挑战与机遇。Jin-microservices正是在此背景下诞生,它是一个基于PHP语言和高性能的Hyperf微服务框架的实战级示例项目,旨在填补PHP微服务领域高质量示例的空白。今天,让我们深入探索这个项目,看看它是如何将PHP带入微服务的新纪元。 项目介绍 Jin-...

gitblog_01100的博客 995

如何用 claude-skills Microservices Architect 设计微服务架构:从拆分到落地的完整指南

**claude-skills** 是面向全栈开发者的 Claude Code 技能库,其中内置的 **Microservices Architect(微服务架构师)** 技能,能帮你把庞大的单体应用拆分成边界清晰、通信合理、具备弹性的微服务架构。它内置了领域驱动设计(DDD)、Saga 模式、熔断器、事件溯源、CQRS 等分布式系统最佳实践,相当于给 AI 装上了一位资深架构师的大脑。 [![

gitblog_00947的博客 1056

TS.Microservices:构建高效.NetCore微服务架构的利器

TS.Microservices:构建高效.NetCore微服务架构的利器 项目介绍 TS.Microservices 是一个基于 .NetCore 的微服务框架,旨在帮助开发者快速构建高效、可扩展的微服务应用。该项目不仅提供了丰富的功能模块,还通过简洁的代码结构和强大的扩展性,使得开发者能够轻松应对复杂的业务需求。无论你是微服务架构的新手,还是经验丰富的开发者,TS.Microservices ...

gitblog_01075的博客 707

使用Golang构建的电商微服务框架:Go Ecommerce Microservices

在这个快速发展的技术时代,构建可扩展且灵活的后台系统变得越来越重要。【Go Ecommerce Microservices】是一个以Go语言为核心的开源项目,它采用了微服务架构、垂直切片设计,并融合了CQRS模式、领域驱动设计(DDD)和事件驱动架构等多种先进技术。这个项目不仅是实现一个电商样本,更是提供了一个模板,帮助开发者快速启动他们的Go语言后端项目。 ## 项目简介 Go Ecomme

gitblog_00028的博客 1010

微服务治理中的稳定性设计

视频号2023年度优秀创作者,互联网大厂P8技术专家,Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电子工业出版技术成长领路人称号。

huxian1234的专栏 1156

基于DDD的微服务设计和开发实战

基于DDD的微服务设计和开发实战 作者:欧创新、邓頔、文艺 目录 基于DDD的微服务设计和开发实战 1 目标 2 适用范围 3 DDD 分层架构视图 展现层 应用层 领域层 基础层 4 服务视图 微服务内的服务视图 1、接口服务 2、应用服务 3、领域服务 4、基础服务 微服务外的服务视图 1. 前端应用与微...

Liyiming 1万+

探索FastAPI微服务框架:Kludex的fastapi-microservices

探索FastAPI微服务框架:Kludex的fastapi-microservices 项目简介 是一个基于 FastAPI 构建的微服务框架。FastAPI是一个现代、高性能的web框架,用于构建API,它以类型提示为基础,提供了出色的开发体验和速度。而Kludex的这个项目则进一步扩展了FastAPI的功能,为开发者提供了一套完整的微服务解决方案。 技术分析 基于FastAPI的强力支持 Fa...

gitblog_00017的博客 642
上一篇: SpringBoot接口 - 如何生成接口文档之非侵入方式(通过注释生成)Smart-Doc?
下一篇: SpringBoot整合oceanbase,实现oracle无缝切换到oceanbase
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值