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 的核心功能和配置,能够帮助开发者更好地应对复杂的分布式环境中的故障问题,提高系统的可用性和容错性。

相关推荐
忆~遂愿7 小时前
3大关键点教你用Java和Spring Boot快速构建微服务架构:从零开发到高效服务注册与发现的逆袭之路
java·人工智能·spring boot·深度学习·机器学习·spring cloud·eureka
麻辣香蝈蝈8 小时前
【Java】微服务找不到问题记录can not find user-service
java·微服务·nacos
Forest 森林19 小时前
【微服务与分布式实践】探索 Sentinel
sentinel
LUCIAZZZ19 小时前
SpringCloudGateWay和Sentinel结合做黑白名单来源控制
sentinel
小猫猫猫◍˃ᵕ˂◍1 天前
微服务入门(go)
微服务·eureka·golang
小韩学长yyds1 天前
解锁微服务:五大进阶业务场景深度剖析
微服务·云原生·架构
喵叔哟2 天前
29. 【.NET 8 实战--孢子记账--从单体到微服务】--项目发布
微服务·云原生·架构
喵叔哟2 天前
28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正
java·微服务·.net
云上的阿七2 天前
云计算中的微服务架构是什么
微服务·架构·云计算