【微服务-Sentinel】微服务架构避免雪崩之服务限流实战

前面我们介绍了微服务架构中的网关知识,这些是日常业务中的正常处理情况,但是在微服务环境下受制于网络、机器性能、算法、程序各方面影响,运行异常的情况也在显著提升,如果不做好异常保护,微服务架构就像空中楼阁一样随时可能会崩溃,从本篇我们开始一个新话题:微服务的系统保护

在微服务架构中,主要是通过Alibaba Sentinel组件来进行服务保护的,下面我们就先来了解下Alibaba Sentinel以下几个方面的内容:

  • 1、什么是微服务雪崩效应?
  • 2、为什么会产生雪崩效应?
  • 3、如何有限避免雪崩效应?
  • 4、Alibaba Sentinel有哪些特征?
  • 5、Alibaba Sentinel部署与配置。
  • 6、配置接口限流规则。

下面正餐开始!

一、什么是微服务雪崩效应?

“雪崩”一词指的是山地积雪由于底部溶解等原因造成的突然大块塌落的现象,具有很强的破坏力。

在微服务项目中指由于突发流量导致某个服务不可用,从而导致该服务上游服务不可用,并产生级联效应,最终导致整个系统不可用,使用雪崩这个词来形容这一现象最合适不过。

二、为什么会产生雪崩效应

引用一下前面的一个场景:

我们有个微服务是做数据推送的,因为没预计到大流量的情况,微服务的性能要求也没那么高,可能每次推送的耗时会有个五秒钟。那么海量的请求进来后,就会逮住一台服务器拼命推送,如果请求量巨大,把第一台服务器搞宕机了,那么海量的请求就会去第二台服务器,把第二台服务器也整宕机了,请求继续去嚯嚯第三台服务器,第三台也毫无疑问的就义了。那么我们数据推送功能就彻底废了。。。数据推送下游服务就没事儿可干了,但业务也就中断了,P0级别的事故就此产生。。。大概就这么个道理。

三、如何有效避免雪崩效应

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

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

以上述场景为例:在需要数据推送时,为了预防雪崩,我们可以在微服务体系中增加服务降级的功能,预设 2 秒钟有效期,如遇延迟便最多允许 5 秒,5秒内服务未处理完成则直接降级并返回响应,此时推送服务会反馈“系统忙碌中”的提示信息。这也就意味着消息通知服务最多只有两秒钟的处理时间。处理结果要么推送成功,要么超时降级。 因此阻塞时间缩短,产生雪崩的概率会大大降低。

四、Alibaba Sentinel

有了解决问题的方案,下面咱们就可以聊聊落地实现的事情。在 Spring Cloud Alibaba 生态中有一个重要的流控组件 Sentinel。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战Sentinel具有以下几个特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

  • 完备的实时监控:Sentinel 同时提供实时的监控功能。我们可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态:Sentinel 提供开箱即用的与其他开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 整合只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战

五、Sentinel配置入门

Sentinel 分为两个部分Sentinel DashboardSentinel 客户端

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

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战

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

1、部署Sentinel Dashboard

(1)下载Sentinel Dashboard jar包

大家可以在GitHub上下载最新的jar包即可。

(2)利用启动命令启动Sentinel Dashboard

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

(3)访问Sentinel Dashboard

在浏览器输入地址和9100端口,即可打开网页。用户名密码都是sentinel。打开后页面如下:

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战到这里,我们的Sentinel Dashboard就安装好了,接下来我们继续开始实现Sentinel客户端。

2、实现Sentinel客户端

(1)创建工程

利用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>

(2)配置application.yml

spring:

  application:

    name: sentinel-sample #应用名&微服务id

  cloud:

    sentinel: #Sentinel Dashboard通信地址

      transport:

        dashboard: 106.14.221.171:9100

      eager: true #取消控制台懒加载

    nacos: #Nacos通信地址

      server-addr: 106.14.221.171:8848

      username: nacos

      password: nacos

server:

  port: 80

management:

  endpoints:

    web: #将所有可用的监控指标项对外暴露

      exposure: #可以访问 /actuator/sentinel进行查看Sentinel监控项

        include: '*'

(3)配置验证

访问我们Sentinel Dashboard地址,可以看到我们的sentinel-sample服务已经出现了,说明Sentinel客户端与Dashboard已经完成通信。

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战

前面的工作都已经做完了,那我们再来通过 Dashboard 配置应用的限流规则,来体验下 Sentinel 的用法。

六、配置Sentinel限流规则

1、增加限流类

我们需要在 sentinel-sample 服务中,增加 SentinelSampleController 类,用于演示 Sentinel 限流规则。

package com.example.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】微服务架构避免雪崩之服务限流实战

2、配置限流规则

打开我们的Sentinel Dashboard站点,在控制面板中配置。

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战

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

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战此时针对 /test_flow_rule 接口的流控规则已生效,可以在“流控规则”面板看到。

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战

3、验证限流规则

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

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

【微服务-Sentinel】微服务架构避免雪崩之服务限流实战同一秒内再次刷新便会出现 “Blocked by Sentinel (flow limiting)”,代表服务已被限流降级。【微服务-Sentinel】微服务架构避免雪崩之服务限流实战

到这里,我们已经利用 Sentinel 对微服务接口实施了初步的限流降级控制,Sentinel 还有很多高级的用法,我们在后面继续深入介绍。

文章将持续更新,欢迎关注公众号:服务端技术精选。欢迎点赞、关注、转发


原文始发于微信公众号(服务端技术精选):【微服务-Sentinel】微服务架构避免雪崩之服务限流实战

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/258966.html

(0)
服务端技术精选的头像服务端技术精选

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!