Sprinig Cloud Alibaba Sentinel:服务限流
一、Spring Cloud Alibaba Sentinel介绍
1. Spring Cloud Alibaba Sentinel简介
Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量控制、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
2. 特性
3.1 丰富的应用场景
Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
3.2 完备的实时监控
Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
3.3 广泛的开源生态
Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
3.4 完善的 SPI 扩展点
Sentinel 提供简单易用、完善的 SPI(Service Provider Interface) 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
3.5 组件图
4. Sentinel功能和设计理念
4.1 流量控制
流量控制是互联网应用非常重要的一个概念。Sentinel作为流量控制适配器可以把随机过来的流量调整成合适的形状。当超出服务器上限会丢弃部分请求。
4.2 熔断降级
灾难性雪崩效应是在服务链条中可能出现的问题。熔断降级是在服务链条中不可缺少的一部分。熔断降级就是Sentinel的一大功能。
4.3 通过控制资源的并发数进行限流
Sentinel通过控制资源的并发数,来减少不稳定资源对其他资源的影响。当某个资源请求响应变长以后,就会逐渐累积线程数,当线程数到达一定的数量后就会拒绝其他的请求。这样不但没有线程切换的消耗,也不需要预先分配线程池的大小(或信号量的大小)。
4.4 针对慢调用或异常进行降级
Sentinel可以根据响应时间或异常等不稳定因素进行熔断。当调用的资源出现响应时间变长,就会拒绝访问,直到调用资源逐渐恢复。
4.5 系统自适应保护机制
无论是单机应用还是集群应用都会有一个负载上限,当超过负载上限就会导致单机或集群应用崩溃。Sentinel会自动监听整个单机或集群应用的入口,让入口流量达到负载均衡,保证系统在能力范围内处理最多请求。
二、基于Docker安装Sentinel Dashboard
1. 拉取镜像
docker pull bladex/sentinel-dashboard
2. 创建并运行容器
docker run --name sentinel -d -p 8858:8858 --restart=always bladex/sentinel-dashboard
3. 访问Dashboard平台
访问 http://192.168.8.128:8858 进入控制台,登录用户名和密码都是 sentinel 。
三、搭建微服务应用并交由Sentinel流控管理
1. 新建工程
新建工程 test_alibaba_sentinel 。
2. POM依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<!-- spring cloud 总体依赖版本管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<!-- spring cloud alibaba 总体依赖版本管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency