服务容错的背景
在分布式系统中,每一个服务都是独立的,它们之间通过网络协议进行通信,可是在这样的架构中,往往会因为一些问题导致服务访问量过载,或请求时间超时,或网络波动等因素导致服务宕机,停止工作,而因一台底层的服务,出现了宕机,导致调用者发起请求调用该服务时,得不到回应,处于一直等待中,而越来越多的请求堆积才此处,会导致资源消耗过大,也会导致调用者发生宕机,这种现象称之为服务雪崩(一个服务发生故障引起多个服务同时故障),随着服务量的增加,出现故障的概率就会提高,所以服务容错的需求就产生了。
服务容错的常见解决方案
阿里巴巴提供了一套名为sentinel的框架https://sentinelguard.io/zh-cn/,可以解决服务容错的问题
基本搭建(注意:每次服务重启都会导致规则失效,需重新配置)
- sentinel是基于spring boot构建的项目,下载最新的sentinel的jar包
- 通过cmd控制台运行
java -Dserver.port=8840 -Dcsp.sentinel.dashboard.server=localhost:8840 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar 登录账户密码: sentinel/sentinel
- 访问本地地址http://localhost:8840/,进入Sentinel控制台
- 项目中,导入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.2.RELEASE</version> </dependency>
- 修改application.yml(application.properties)配置
spring: application: name: sentinel cloud: sentinel: transport: dashboard: localhost:8840 #控制面板ip clientIp: localhost #本应用的ip port: 8719 #本应用的通信端口(默认) eager: true
- 写好接口后,启动项目,并调用容易出现故障的接口(因为sentinel是懒加载,必须先调用一次,才能在控制台中找到对应的服务)
- 在控制台中找到自己的服务,对接口进行规则设置
超时
在服务调用者调用服务提供者时,设置一个最大响应时间,如果超过这个时间,服务提供者未作出反应,就断开请求,释放掉线程。
限流
对服务提供者的接口,配置限制进入系统的流量,确保在系统的负载范围内,保证系统能够正常运转。
流控模式:
- 直接 : 针对A的请求达到阈值,则对进入A的请求的流量进行限制
- 关联 : A 关联B资源,对B发起请求,造成对A限流
- 链路 : 当从某个接口过来的资源达到限流条件时,开启限流
流控效果:
- 快速失败:达到阈值,直接拒绝后面的流量
- warm up : 预热,冷启动。启动时QPS初始为=(预设QPS/冷加载因子(默认3))取整,然后在指定预热时间内逐渐上升到预设QPS
- 排队 : 匀速通过,通过计算1秒内除以指定的QPS,达到匀速通过
- 找到接口,配置规则
- 配置每秒允许的请求数量,就可以达到限流的目的了。
仓壁模式(隔离)
将系统中的服务按照一定规则进行划分隔离,使其之间不具有依赖性,当某个服务出现故障时,能将问题与影响隔离在一个模块,不波及其他模块,这样就不会影响整体的系统服务。
熔断器
在服务调用者这边进行控制,根据策略定义失败情况,失败数字达到阈值时打开熔断器,不再调用底层服务,熔断窗口(一段时间过后)达到时,释放一个请求进入底层,如果请求执行成功则关闭熔断器,正常调用,如果请求失败则继续保持熔断器打开直到下一个熔断窗口达到。
- 需要有两个服务,进行交互
- 调用一下顶层的接口,然后再sentinel控制台进行配置
- 如图,配置完成,立即生效