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 -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
如果报以下错误只需在对应代码上加上’ '即可
java '-Dserver.port=8090' '-Dcsp.sentinel.dashboard.server=localhost:8090' '-Dproject.name=sentinel-dashboard' '-jar' sentinel-dashboard.jar
命令相关参数可查看如下文档
https://github.com/alibaba/Sentinel/wiki/%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E9%A1%B9
(3)访问
访问http://localhost:8090就可以看到sentinel的控制台
账号和密码都是sentinel。
控制台如下:
微服务整合
在cart-service微服务中整合sentinel,连接sentinel-dashboard控制台
(1)引入sentinel坐标
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
(2)修改对应的application.yaml文件,添加如下内容
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8090
(3)访问cart-service服务的任意端口,就可以在sentinel-dashboard控制台查看到对应信息。
簇点链路
簇点链路,就是单机调用链路。是一次请求进入服务后经过的每一个被Sentinel监控的资源链。默认Sentinel会监控SpringMVC的每一个Endpoint(http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径:
只靠请求路径无法准确的区分究竟是哪一个端口。
Restful风格的API请求路径一般都相同,这会导致簇点资源名称重复。因此我们要修改配置,把请求方式+请求路径作为簇点资源名称:
spring:
cloud:
sentinel:
transport:
dashboard:localhost:8090http-method-specify:true #开启请求方式前缓
总结
本文首先探讨了雪崩效应的概念及其对系统稳定性的影响,提出了有效的服务保护方案,并介绍了如何使用 Sentinel 进行服务保护。通过实际操作,快速入门 Sentinel 的核心功能和配置,能够帮助开发者更好地应对复杂的分布式环境中的故障问题,提高系统的可用性和容错性。