微服务架构 | 5. 服务容灾

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作;

前言

参考资料
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》

当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作;


1. 服务容灾基础知识

1.1 由一个服务资源耗尽引发的连锁反应

服务资源耗尽引发的连锁反应

  • A 服务调用 B 服务,B 服务调用 C 服务;
  • 当 C 服务出现调用缓慢问题是,影响 B 服务的响应;B 服务又会影响 A 服务,导致其他服务不可用;

1.2 服务雪崩效应

  • 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的 100% 可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪;
  • 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪;

服务雪崩效应

1.3 四种客户端弹性模式

  • 客户端负载均衡模式(client load balance):让客户端从服务注册中心查找服务的所有实例,然后缓存服务实例的物理位置;
  • 断路器模式(circuit breaker):远程服务调用时间太长,断路器将会介入并中断调用 ;
  • 后备模式(fallback):远程服务调用失败时,服务消费者将执行替代代码路径, 并尝试通过其他方式执行操作,而不是生成一个异常;
  • 舱壁模式(bulkhead):每个远程资源、都是隔离的,并分配给线程池;

四种客户端弹性模式

1.4 服务容灾的几种解决方案

  • 服务隔离:即舱壁模式。将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。常见的隔离方式有:线程池隔离和信号量隔离;
  • 服务超时:在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放线程;
  • 服务降级:即后备模式。服务提供一个托底方案,一旦服务无法正常调用,就使用托底方案;
  • 服务熔断:即断路器。上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。一种“牺牲局部,保全整体”的策略;
  • 服务限流:限制系统的输入和输出流量已达到保护系统的目的;

1.5 服务降级的参考指标

  • 服务降级需要有一个参考指标,一般来说有以下几种常见方案;

    • 平均响应时间:比如15内持续进入5个请求,对应时刻的平均响应时间均超过阈值,那么接下来在一个固定的时间窗口内,对这个方法的访问都会自动熔断;
    • 异常比例:当某个方法每秒调用所获得的异常总数的比例超过设定的阈值时,该资源会自动进入降级状态,也就是在接下来的一个固定时间窗口中,对这个方法的调用都会自动返回;
    • 异常数量:和异常比例类似,当某个方法在指定时间窗口内获得的异常数量超过闽值时会触发熔断;

1.6 服务限流的作用

  • 限流的主要目的是通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统,一旦达到限制数量则对当前请求进行处理采取对应的拒绝策略,比如跳转到错误页面拒绝请求、进入排队系统、降级等;
  • 从本质上来说,限流的主要作用是损失一部分用户的可用性,为大部分用户提供稳定可靠的服务;
  • 实际开发中的限流应用:

    • 在 Nginx 层添加限流模块限制平均访问速度;
    • 通过设置数据库连接池、线程池的大小来限制总的并发数;
    • 通过 Guava 提供的 Ratelimiter 限制接口的访问速度;
    • TCP 通信协议中的流量整形;

1.7 常见的几种限流算法

1.7.1 计数器算法

  • 一种比较简单的限流实现算法;
  • 原理:在指定周期内累加访问次数,当访问次数达到设定的闽值时,触发限流策略,当进入下一个时间周期时进行访问次数的清零;
  • 存在临界问题:前一个周期的后半部分与后一个周期的前半部分的总访问次数可能超过阈值;

计数器算法

1.7.2 滑动窗口算法

  • 是一种流量控制技术,在 TCP 网络通信协议中,就采用了滑动窗口算法来解决网络拥塞的情况;
  • 原理:在固定窗口中分割出多个小时间窗口,分别在每个小时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小时间窗口。最终只需要统计滑动窗口范围内的所有小时间窗口总的计数即可;
  • 该算法解决了临界问题,Sentinel 采用滑动窗口算法来实现限流

滑动窗口算法

1.7.3 令牌桶算法

  • 网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法;
  • 原理:对于每一个请求,都需要从令牌桶中获得一个令牌,如果没有获得令牌,则需要触发限流策略;
  • 由于令牌桶有固定的大小,当请求速度小于令牌生成速度时,令牌桶会被填满。所以令牌桶能够处理突发流量,也就是在短时间内新增的流量系统能够正常处理,这是令牌桶的特性;

令牌桶算法

1.7.4 漏桶限流算法

  • 主要作用是控制数据注入网络的速度,平滑网络上的突发流量;
  • 原理:在漏桶算法内部同样维护一个容器,这个容器会以恒定速度出水,不管上面的水流速度多快,漏桶水滴的流出速度始终保持不变;
  • 消息中间件就使用了漏桶限流的思想;
  • 请求速度大于漏桶流出水滴的速度时,触发限流策略;
  • 令牌桶算法的区别:漏桶无法处理短时间内的突发流量,漏桶限流算法是一种恒定速度的限流算法;

漏桶限流算法

1.8 利用 Postman 模拟请求高并发场景

  • Postman 里新建多线程集合组;

Postman 里新建多线程集合组

  • 右键添加请求

右键添加请求

  • 将访问地址添加进新新线程组;

将访问地址添加进新新线程组

  • 设置多线程组的运行状态;

设置多线程组的运行状态

  • 使用 postman 密集访问 testA,下面配置的含义是:

    • 20个线程每次间隔 0.3s 访问一次;

使用 postman 密集访问 testA

1.9 目前几种流行的服务降级组件对比

比较项 Hystrix Sentinel Resilience4j
贡献者 Netflix Alibaba Apache 基金会
隔离策略 线程池隔离/信号量隔离 信号量隔离(并发线程数限流) 信号量隔离
熔断降级策略 基于异常比率 基于响应时间、异常比率、异常数 基于异常比率、响应时间
实时统计实现 滑动窗口(基于 RxJava) 滑动窗口(LeapArray) Ring Bit Buffer
动态规则配置 支持多种数据源 支持多种数据源 有限支持
扩展性 插件的形式 多个扩展点 接口的形式
基于注解的支持 支持 支持 支持
限流 有限的支持 基于 QPS,支持基于调用关系的限流 Rate Limiter
流量整形 不支持 支持预热模式、匀速器模式、预热排队模式 简单的 Rate Limiter模式
系统自适应保护 不支持 支持 不支持
控制台 简单的监控查看 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 不提供控制台,可对接其它监控系统


2. Hystrix

Hystrix 是一个延迟和容灾库,旨在隔离远程系统、服务和第三方库的访问点,停止级联故障,并在故障不可避免的复杂分布式系统中实现弹性;


3. Sentinel

Sentinel 是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、服务降级、系统负载保护等多个维度来帮助我们保障微服务的稳定性;


4. Resilience4j

Resilicence4j 一款非常轻量、简单,并且文档非常清晰、丰富的熔断工具,这也是Hystrix官方推荐的替代产品。不仅如此,Resilicence4j 还原生支持Spring Boot 1.x/2.x,而且监控也支持和 prometheus 等多款主流产品进行整合
  • 点击访问:[]()



相关文章
|
18天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
17天前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
131 68
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
16天前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
143 36
微服务架构解析:跨越传统架构的技术革命
|
5天前
|
消息中间件 存储 安全
分布式系统架构3:服务容错
分布式系统因其复杂性,故障几乎是必然的。那么如何让系统在不可避免的故障中依然保持稳定?本文详细介绍了分布式架构中7种核心的服务容错策略,包括故障转移、快速失败、安全失败等,以及它们在实际业务场景中的应用。无论是支付场景的快速失败,还是日志采集的安全失败,每种策略都有自己的适用领域和优缺点。此外,文章还为技术面试提供了解题思路,助你在关键时刻脱颖而出。掌握这些策略,不仅能提升系统健壮性,还能让你的技术栈更上一层楼!快来深入学习,走向架构师之路吧!
36 11
|
4天前
|
NoSQL 前端开发 测试技术
👀探秘微服务:从零开启网关 SSO 服务搭建之旅
单点登录(Single Sign-On,简称SSO)是一种认证机制,它允许用户只需一次登录就可以访问多个应用程序或系统。本文结合网关和SaToken快速搭建可用的Session管理服务。
31 8
|
23天前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
19天前
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
48 8
|
20天前
|
弹性计算 Kubernetes API
构建高效后端服务:微服务架构的深度剖析与实践####
本文深入探讨了微服务架构的核心理念、设计原则及实现策略,旨在为开发者提供一套系统化的方法论,助力其构建灵活、可扩展且易于维护的后端服务体系。通过案例分析与实战经验分享,揭示了微服务在提升开发效率、优化资源利用及增强系统稳定性方面的关键作用。文章首先概述了微服务架构的基本概念,随后详细阐述了其在后端开发中的应用优势与面临的挑战,最后结合具体实例,展示了如何从零开始规划并实施一个基于微服务的后端项目。 ####
|
24天前
|
消息中间件 运维 Kubernetes
后端架构演进:从单体到微服务####
本文将探讨后端架构的演变过程,重点分析从传统的单体架构向现代微服务架构的转变。通过实际案例和理论解析,揭示这一转变背后的技术驱动力、挑战及最佳实践。文章还将讨论在采用微服务架构时需考虑的关键因素,包括服务划分、通信机制、数据管理以及部署策略,旨在为读者提供一个全面的架构转型视角。 ####
34 1
|
26天前
|
消息中间件 运维 Cloud Native
云原生架构下的微服务优化策略####
本文深入探讨了云原生环境下微服务架构的优化路径,针对服务拆分、通信效率、资源管理及自动化运维等核心环节提出了具体的优化策略。通过案例分析与最佳实践分享,旨在为开发者提供一套系统性的解决方案,以应对日益复杂的业务需求和快速变化的技术挑战,助力企业在云端实现更高效、更稳定的服务部署与运营。 ####