IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 系统保护:微服务架构雪崩效应与服务限流 -> 正文阅读

[Java知识库]系统保护:微服务架构雪崩效应与服务限流

微服务的雪崩效应

一次线上的服务雪崩事故

“雪崩”一词指的是山地积雪由于底部溶解等原因造成的突然大块塌落的现象,具有很强的破坏力。在微服务项目中指由于突发流量导致某个服务不可用,从而导致上游服务不可用,并产生级联效应,最终导致整个系统不可用,使用雪崩这个词来形容这一现象最合适不过。

雪崩之后可以在以下几方面作出应对:

  • 提高可用性,将单台设备转为多台负载均衡集群。
  • 提高性能,检查慢 SQL、优化算法、引入缓存来缩短单笔业务的处理时间。
  • 预防瞬时 TPS 激增,将系统限流作为常态加入系统架构。
  • 完善事后处理,遇到长响应,一旦超过规定窗口时间,服务立即返回异常,中断当前处理。
  • 加强预警与监控,引入 ELK,进行流量实时监控与风险评估,及时发现系统风险。

为什么微服务会产生雪崩效应

如下图所示,假如开发了一套分布式应用系统,前端应用分别向 A/H/I/P 四个服务发起调用请求:

前端应用需要四个服务

但随着时间推移,假如服务 I 因为优化问题,导致需要 20 秒才能返回响应,这就必然会导致 20 秒内该请求线程会一直处于阻塞状态。

其中一个出现长延时,会导致前端应用线程阻塞

但是,如果这种状况放在高并发场景下,就绝对不允许出现,假如在 20 秒内有 10 万个请求通过应用访问到后端微服务。容器会因为大量请求阻塞积压导致连接池爆满,而这种情况后果极其严重!轻则“服务无响应”,重则前端应用直接崩溃。

以上这种因为某一个节点长时间处理导致应用请求积压崩溃的现象被称为微服务的“雪崩效应”。

当大量线程积压后,前端应用崩溃,雪崩效应产生

?

如何有效避免雪崩效应?

刚才分析了雪崩效应是因为出现瞬间大流量+微服务响应慢造成的。针对这两点在架构设计时要采用不同方案。

  • 采用限流方式进行预防:可以采用限流方案,控制请求的流入,让流量有序的进入应用,保证流量在一个可控的范围内。
  • 采用服务降级与熔断进行补救:针对响应慢问题,可以采用服务降级与熔断进行补救。服务降级是指当应用处理时间超过规定上限后,无论服务是否处理完成,便立即触发服务降级,响应返回预先设置的异常信息。

以下图为例。在用户支付完成后,通过消息通知服务向用户邮箱发送“订单已确认”的邮件。假设消息通知服务出现异常,需要 10 秒钟才能完成发送请求, 这是不能接受的。为了预防雪崩,我们可以在微服务体系中增加服务降级的功能,预设 2 秒钟有效期,如遇延迟便最多允许 2 秒,2 秒内服务未处理完成则直接降级并返回响应,此时支付服务会收到“邮件发送超时”的错误信息。这也就意味着消息通知服务最多只有两秒钟的处理时间。处理结果,要么发送成功,要么超时降级。 因此阻塞时间缩短,产生雪崩的概率会大大降低。

?Alibaba Sentinel

在 Spring Cloud Alibaba 生态中有一个重要的流控组件 Sentinel。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其他开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 整合只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Alibaba Sentinel特性图

Sentinel 配置入门

Sentinel 分为两个部分:Sentinel Dashboard和Sentinel 客户端。

Sentinel Dashboard:Sentinel Dashboard 是 Sentinel 配套的可视化控制台与监控仪表盘套件,它支持节点发现,以及健康情况管理、监控(单机和集群)、规则管理和推送的功能。Sentinel Dashboard 是基于 Spring Boot 开发的 WEB 应用,打包后可以直接运行,目前最新版本为 1.8.0。

Sentinel 客户端:Sentinel 客户端需要集成在 Spring Boot 微服务应用中,用于接收来自 Dashboard 配置的各种规则,并通过 Spring MVC Interceptor 拦截器技术实现应用限流、熔断保护。

部署 Sentinel Dashboard(仪表盘)

1. 访问:https://github.com/alibaba/Sentinel/releases,下载最新版 Sentinel Dashboard。

2. 利用下面的命令启动 Dashboard。

java -jar -Dserver.port=9100 sentinel-dashboard-1.8.0.jar

这个命令的含义是启动 Sentinel Dashboard 应用,Sentinel Dashboard 会监听9100端口实现与微服务的通信。同时我们可以访问下面的网址查看 Sentinel Dashboard 的UI界面。
http://192.168.31.10:9100

在用户名、密码处输入 sentinel/sentinel,便可进入 Dashboard。

微服务内置 Sentinel 客户端

第一步,利用 Spring Initializr 向导创建 sentinel-sample 工程,pom.xml 增加以下三项依赖。

<!-- Nacos客户端Starter-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- Sentinel客户端Starter-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- 对外暴露Spring Boot监控指标-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

第二步,配置 Nacos 与 Sentinel 客户端。

spring:
  application:
    name: sentinel-sample #应用名&微服务id
  cloud:
    sentinel: #Sentinel Dashboard通信地址
      transport:
        dashboard: 192.168.31.10:9100
      eager: true #取消控制台懒加载
    nacos: #Nacos通信地址
      server-addr: 192.168.31.10:8848
      username: nacos
      password: nacos
server:
  port: 80
management:
  endpoints:
    web: #将所有可用的监控指标项对外暴露
      exposure: #可以访问 /actuator/sentinel进行查看Sentinel监控项
        include: '*'

第三步,验证配置。

访问下面网址,在 Sentinel Dashboard 左侧看到 sentinel-sample 服务出现,则代表 Sentinel 客户端与 Dashboard 已经完成通信。

http://192.168.31.10:9100/
确认 sentinel-sampl e与 Dashboard 通信成功

?

配置限流规则

第一步,在 sentinel-sample 服务中,增加 SentinelSampleController 类,用于演示 Sentinel 限流规则。

package com.vincent.sentinelsample.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SentinelSampleController {
    @GetMapping("/test_flow_rule")
    public String testFlowRule(){
        return "SUCCESS";
    }
}

启动 sentinel-sample,访问http://localhost/test_flow_rule,无论刷新多少次,都会看到“SUCCESS”。

正常访问结果

第二步,访问 Sentinel Dashboard 配置限流规则。

在左侧找到簇点链路,右侧定位到 /test_flow_rule,点击后面的“流控”按钮。

设置接口流控规则

在弹出界面,按下图配置,其含义为 /test_flow_rule 接口每秒钟只允许 1QPS 访问,超出的请求直接服务降级返回异常。最后点击“新增”完成规则设置。

设置流控规则

?此时针对 /test_flow_rule 接口的流控规则已生效,可以在“流控规则”面板看到。

现有流控规则列表

第三步,验证流控效果。

重新访问http://localhost/test_flow_rule,浏览器反复刷新。

第一次刷新时会出现“SUCCESS”文本代表处理成功。

第一次执行成功

?同一秒内再次刷新便会出现 “Blocked by Sentinel (flow limiting)”,代表服务已被限流降级。

第二次限流降级
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 15:48:10  更:2021-12-14 15:50:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:20:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码