SpringCloud-Alibaba学习(九):Sentinel简介
Sentinel
1、服务雪崩
某个节点出现调用问题,导致其上游调用方发生级联故障,最终引起大面积的服务崩溃,这就叫做服务雪崩。
如图
1、服务 A 超时或不可用
2、服务 B 上大量请求被 hang 住
3、服务 B 资源耗尽崩溃
4、服务 C、D 也资源耗尽崩溃
解决方法
- 限流:基于 qps,请求数大于 qps 阈值时直接拒绝访问
- 仓壁模式:基于线程数,比如给每个资源分配最大 n 个线程,多余的请求丢弃,防止线程资源耗尽
- 断路器:大量请求超时、异常时能自动熔断,拒绝所有访问,一段时间后自动探测恢复
2、Sentinel是什么
Sentinel github:https://github.com/alibaba/Sentinel/wiki/介绍
以流量为切入点,从流量控制、熔断降级、负载均衡保护等多个维度保护服务的稳定性
2.1 特征
- 丰富的应用场景
秒杀、流量削峰填谷、集群流量控制、实时熔断下游不可用应用 - 完备的实时监控
能够实时监控资源调用情况,可以监控到资源维度的秒级数据,提供了 Dashboard 控制台 - 广泛的开源生态
提供了与气筒开源框架的整合模块,如SpringCloud、Dubbo的整合,引入依赖简单配置即可快速接入 - 完善的 SPI 扩展点
提供了简单易用、完善的 SPI 扩展接口,如定制规则管理、视频动态数据源等
2.2 Sentinel 分为两个部分
- 核心库(Java客户端):不依赖其他框架/库,能够运行于所有 Java 运行环境,同时堆 Dubbo/SpringCloud 等框架也有较好的支持
- 控制台(Dashboard):基于 SpringBoot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器
3、Sentinel 与 Hystrix 对比
4、Sentinel架构
# 接口概览
http://127.0.0.1:8720/api
# 获取资源的metrics信息 id=资源名
http://127.0.0.1:8720/cnode?id=/xxx
# 获取流控规则接口
http://127.0.0.1:8720/getRules?type=flow
# 设置规则接口
http://127.0.0.1:8720/setRules
5、控制台搭建
下载地址:https://github.com/alibaba/Sentinel/releases
下载下来是个 SpringBoot 工程的 jar 包,直接运行即可
java -jar sentinel-dashboard-1.8.0.jar --server.port=8888
写个脚本startup.bat
来运行,放在 jar 包同级目录
java -jar sentinel-dashboard-1.8.0.jar --server.port=8888
pause
用户名/密码:sentinel/sentinel
6、微服务整合
依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 端点监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- nacos 注册中心场景依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>cc.yuanspace</groupId>
<artifactId>cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Sentinel 配置 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
配置
# 服务端口
server.port=9010
server.servlet.context-path=/cloud-sentinel-demo
# 服务名称 必须有 保证唯一性
spring.application.name=cloud-sentinel-demo
# nacos server 的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# 服务发布到指定的namespace,不指定默认就是public
spring.cloud.nacos.discovery.namespace=qa
# 服务发布到指定的group,默认值是DEFAULT_GROUP
spring.cloud.nacos.discovery.group=my-group
# openfeign 的常用配置
# false表示当第一次发请求时才去注册中心拉取服务列表 true表示项目启动立即拉取
#ribbon.eager-load.enabled=true
# 指定哪些服务立即拉取服务列表
#ribbon.eager-load.clients=cloud-sentinel-demo
# 设置指定服务的连接超时时间,单位 ms
feign.client.config.openfeign-points.connect-timeout=1000
# 设置指定服务的响应超时时间,单位 ms
feign.client.config.openfeign-points.read-timeout=1000
# 设置默认超时时间,单位 ms
feign.client.config.default.connect-timeout=1000
feign.client.config.default.read-timeout=1000
# sentinel 配置
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=localhost:8888
# 开启饥饿加载,项目启动立即完成初始化,默认是懒加载
spring.cloud.sentinel.eager=true
启动服务,控制台有内容,监控粒度是接口级别(资源级别)
Sentinel 监控的最小粒度是资源也就是接口,默认每个 http 接口都是一个资源,以 uri 为资源名,如上图的 /test
也可以使用 @SentinelResource
定义资源
@Service
public class TestService {
@SentinelResource(value = "testServiceResource")
public String get() {
return "service resource";
}
}