Sentinel解决雪崩问题
- 雪崩问题
- 服务保护方案
- 服务降级保护
- 服务保护技术
- Sentinel
- Fallback
- 服务熔断
雪崩问题
在微服务调用链中如果有一个服务的问题导致整条链上的服务都不可用,称为雪崩
- 原因
- 微服务之间的相互调用,服务提供者出现故障
- 服务的消费者没有很好的处理异常出现问题
- 微服务集群级联出现故障
服务保护方案
服务降级保护
请求限流
:限制访问接口的请求的并发量,避免服务因流量激增出现故障
通过限流器进行流量整形
线程隔离
:也称为舱壁模式,模拟船舱隔板的防水原理,通过限定每个业务能使用的线程数量而将故障业务隔离,避免故障扩散
服务熔断
:配合线程隔离进行,由断路器统计请求的异常比例或慢调用比例,如果超出阈值则会熔断该业务,则拦截该接口的请求,熔断期间,所有的请求快速失败,全都走fallback逻辑(让业务失败时不再抛出异常,而是走fallback逻辑)
服务保护技术
Sentinel
适用于新版本的SpringCloud
Sentinel
Sentinel是阿里巴巴开源的一款微服务流量控制组件
地址:https://sentinelguard.io/zh-cn/index.html
下载:https://github.com/alibaba/Sentinel/releases
下载好之后将jar包的版本后缀删除:
在管理员模式下运行
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
启动
然后访问对应的地址就能够进入到Sentinel管理界面
默认的用户和密码都是sentinel
然后在对应的微服务项目中引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
在配置文件中添加对应的配置信息即可
cloud:
sentinel:
transport:
dashboard: localhost:8090
然后启动服务即可在控制台中进行查看
- 簇点链路
单击调用链路,是一次请求进入服务后经过的每一个被Sentinel监控的资源链,默认会监控SpringMVC中的每一个EndPoint(http接口),限流,熔断等都是针对簇点链路中的资源设置的,而资源名默认就是接口的请求路径
但是RESTful风格的api请求路径都是相同的,这会导致簇点资源名称重复,修改配置,把请求方式+请求路径
作为簇点资源名称:
http-method-specify: true #开启请求方式前缀
然后可以在控制台中实现服务保护技术
线程熔断:需要在微服务中OpenFeign进行整合sentinel,需要在配置文件中进行配置
feign:
sentinel:
enabled: true #开启Feign的sentinel整合
Fallback
FeignClient的Fallback有两种配置方式:
方式一:FallbackClass
,无法对远程调用的异常做出处理
方式二: FallbackFactory
,可以对远程调用的异常做出处理,通常是这种
通过方式二进行Fallback处理:
- 第一步,编写通过工厂类创建失败的UserClient获取
public class UserClientbackFactory implements FallbackFactory<UserClient>{
@Override
public UserClient create(Throwable throwable){
return new UserClient(){
@Override
public User findById(Long id){
//记录异常信息,可以返回空或抛出异常
log,info("失败",throwable);
return null;
}
}
}
}
在正常情况下微服务通过提供的UserClient进行访问,当出现熔断的情况下,使用我们自定义的UserClient进行熔断后的Fallback逻辑处理
2. 将定义好的UserClient失败获取注册为一个Bean
@Bean
public UserClientFallbackFactory userclientfallback(){
return new UserClientFallbackFactory();
}
- 在UserClient接口中使用UserClientFallbackFactory:
@FeignClient(value="userservice",fallbackFactory=UserClientFallbackFactory.class)
public interface UserClient{
@GetMapper("/user/{id}")
User findById(@PathVariable("id") Long id);
}
服务熔断
当线程超过阈值或者达到熔断策略就会引发熔断,熔断时间结束后,尝试开启一次请求,如果成果则关闭短路器,如果失败,则开启断路器进行进行熔断
- 熔断策略
上述是按照慢调用比例判断,最小请求数5个,当5个请求中,出现3个以上(根据比例阈值)响应时间超过200ms就会触发熔断