SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门

前言

在分布式系统中,雪崩效应(Avalanche Effect)是一种常见的故障现象,通常发生在系统中某个组件出现故障时,导致其他组件级联失败,最终引发整个系统的崩溃。为了有效应对雪崩效应,服务保护方案应运而生。本文将围绕雪崩问题展开,介绍如何通过 Sentinel 来实现服务保护和快速入门。


雪崩问题

微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。

雪崩问题产生的原因是什么?

  • 微服务相互调用,服务提供者出现故障或阻塞。
  • 服务调用者没有做好异常处理,导致自身故障。
  • 调用链中的所有服务级联失败,导致整个集群故障

解决问题的思路有哪些?

  • 尽量避免服务出现故障或阻塞。
    • 保证代码的健壮性;
    • 保证网络畅通
    • 能应对较高的并发请求;
  • 服务调用者做好远程调用异常的后备方案,避免故障扩散

服务保护方案

请求限流

请求限流:限制访问微服务的请求的并发量,避免服务因流量激增出现故障,

线程隔离

线程隔离:也叫做舱壁模式,模拟船舱隔板的防水原理。通过限定每个业务能使用的线程数量而将故障业务隔离,避免故障扩散。

服务熔断

服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出阈值则会熔断该业务,则拦截该接口的请求。

熔断期间,所有请求快速失败,全都走fallback逻辑。

解决雪崩问题的常见方案有哪些?

  • 请求限流:限制流量在服务可以处理的范围,避免因突发流量而故障
  • **线程隔离:**控制业务可用的线程数量,将故障隔离在一定范围
  • **服务熔断:**将异常比例过高的接口断开,拒绝所有请求,直接走faltback
  • **失败处理:**定义fallback逻辑,让业务失败时不再抛出异常,而是返回默认数据或友好提示

服务保护技术

Sentinel

初始Sentinel

Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/

Sentinel 的使用可以分为两个部分:

  • 核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。在项目中引入依赖即可实现服务限流、隔离、熔断等功能。
  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

安装Sentinel步骤:

(1)下载jar包
https://github.com/alibaba/Sentinel/releases

(2)运行

将jar包放在任意非中文、不包含特殊字符的目录下,重命名为sentinel-dashboard.jar:

打开控制台运行如下命令

java 复制代码
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

如果报以下错误只需在对应代码上加上' '即可

java 复制代码
java '-Dserver.port=8090' '-Dcsp.sentinel.dashboard.server=localhost:8090' '-Dproject.name=sentinel-dashboard' '-jar' sentinel-dashboard.jar

命令相关参数可查看如下文档
https://github.com/alibaba/Sentinel/wiki/启动配置项

(3)访问

访问http://localhost:8090就可以看到sentinel的控制台

账号和密码都是sentinel。

控制台如下:

微服务整合

在cart-service微服务中整合sentinel,连接sentinel-dashboard控制台

(1)引入sentinel坐标

xml 复制代码
<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

(2)修改对应的application.yaml文件,添加如下内容

xml 复制代码
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090

(3)访问cart-service服务的任意端口,就可以在sentinel-dashboard控制台查看到对应信息。

簇点链路

簇点链路,就是单机调用链路。是一次请求进入服务后经过的每一个被Sentinel监控的资源链。默认Sentinel会监控SpringMVC的每一个Endpoint(http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径:

只靠请求路径无法准确的区分究竟是哪一个端口。

Restful风格的API请求路径一般都相同,这会导致簇点资源名称重复。因此我们要修改配置,把请求方式+请求路径作为簇点资源名称:

java 复制代码
spring:
  cloud:
    sentinel:
      transport:
        dashboard:localhost:8090http-method-specify:true #开启请求方式前缓

总结

本文首先探讨了雪崩效应的概念及其对系统稳定性的影响,提出了有效的服务保护方案,并介绍了如何使用 Sentinel 进行服务保护。通过实际操作,快速入门 Sentinel 的核心功能和配置,能够帮助开发者更好地应对复杂的分布式环境中的故障问题,提高系统的可用性和容错性。

相关推荐
T_Ghost16 小时前
SpringCloud微服务服务容错机制Sentinel熔断器
spring cloud·微服务·sentinel
喂完待续18 小时前
【序列晋升】28 云原生时代的消息驱动架构 Spring Cloud Stream的未来可能性
spring cloud·微服务·云原生·重构·架构·big data·序列晋升
jzzy_hony18 小时前
云原生:微服务与Serverless指南
微服务·云原生·serverless
欧阳的棉花糖19 小时前
微前端俯瞰
微服务·前端工程化
掘金-我是哪吒20 小时前
分布式微服务系统架构第170集:Kafka消费者并发-多节点消费-可扩展性
分布式·微服务·架构·kafka·系统架构
惜.己1 天前
Docker启动失败 Failed to start Docker Application Container Engine.
spring cloud·docker·eureka
LQ深蹲不写BUG1 天前
微服务的保护方式以及Sentinel详解
微服务·云原生·架构
你是人间五月天1 天前
sentinel实现控制台与nacos数据双向绑定
windows·sentinel
无名客01 天前
sentinel限流常见的几种算法以及优缺点
算法·sentinel·限流
鼠鼠我捏,要死了捏1 天前
基于Apache Flink Stateful Functions的事件驱动微服务架构设计与实践指南
微服务·apache flink·实时处理