微服务保护之初始Sentinel

微服务保护之初始Sentinel

雪崩问题

微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BFiLMwUn-1654477780515)(images/image-20220606073701370.png)]

如图,如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I,因此也会被阻塞。此时,其它不依赖于服务I的业务似乎不受影响。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bFpovXjC-1654477780516)(images/image-20220606073710318.png)]

但是,依赖服务I的业务请求被阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kx8VegXq-1654477780516)(images/image-20220606073729265.png)]

服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也就不可用了。

那么,依赖于当前服务的其它服务随着时间的推移,最终也都会变的不可用,形成级联失败,雪崩就发生了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-awoYv04l-1654477780517)(images/image-20220606073744429.png)]

1、雪崩问题集解决方案

解决雪崩问题的常见方式有四种:

1.1、超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待

1.2、舱壁模式:我们可以限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。

扫描二维码关注公众号,回复: 14238718 查看本文章

1.3、断路器模式:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。

当发现访问服务D的请求异常比例过高时,认为服务D有导致雪崩的风险,会拦截访问服务D的一切请求,形成熔断:

1.4、流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。【Sentinel】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7CLmzimi-1654477780517)(images/image-20220606074118638.png)]

总结

什么是雪崩问题?

  • 微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。

可以认为:

限流是对服务的保护,避免因瞬间高并发流量而导致服务故障,进而避免雪崩。是一种预防措施。

超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在一定范围,避免雪崩。是一种补救措施。

2、微服务保护技术

在SpringCloud当中支持多种服务保护技术:

早期比较流行的是Hystrix框架,但目前国内实用最广泛的还是阿里巴巴的Sentinel框架,这里我们做下对比:

Sentinel Hystrix
隔离策略 信号量隔离 线程池隔离/信号量隔离
熔断降级策略 基于慢调用比例或异常比例 基于失败比率
实时指标实现 滑动窗口 滑动窗口(基于 RxJava)
规则配置 支持多种数据源 支持多种数据源
扩展性 多个扩展点 插件的形式
基于注解的支持 支持 支持
限流 基于 QPS,支持基于调用关系的限流 有限的支持
流量整形 支持慢启动、匀速排队模式 不支持
系统自适应保护 支持 不支持
控制台 开箱即用,可配置规则、查看秒级监控、机器发现等 不完善
常见框架的适配 Servlet、Spring Cloud、Dubbo、gRPC 等 Servlet、Spring Cloud Netflix

3、Sentinel介绍和安装

使用文档地址:介绍 · alibaba/Sentinel Wiki (github.com)

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

Sentinel 具有以下特征:

丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

下载jar包,存放到非中文的目录下,通过下面的命令启动jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O6gnbM0s-1654477780518)(images/image-20220606080346210.png)]

本地地址访问8080端口进行登录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-svIHm6kk-1654477780518)(images/image-20220606080605223.png)]

如果要修改Sentinel的默认端口、账户、密码,可以通过下列配置:
配置项 默认值 说明
server.port 8080 服务端口
sentinel.dashboard.auth.username sentinel 默认用户名
sentinel.dashboard.auth.password sentinel 默认密码

例如,修改端口:

java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar

因为没有做微服务整合所以登录进去的页面是没有什么内容的

4、微服务整合Sentinel

创建一个微服务工程

GitHub地址:https://github.com/ZhongChunle/cloud-demo.git

启动nacks服务然后测试项目是否可以正常运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ql8uY1lV-1654477780519)(images/image-20220606081930855.png)]

目前的微服务项目是基于feign进行一个夸服务调用

4.1、在order-server微服务中引入依赖坐标

<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

4.2、配置Sentinel控制台的信息

server:
  port: 8088
spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8090

4.3、访问微服务的任意端点,触发sentine监控(刷新)

任意一个控制器被访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEBMHRCa-1654477780519)(images/image-20220606090616188.png)]

猜你喜欢

转载自blog.csdn.net/baidu_39378193/article/details/125140556