1. Sentinel
- Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性
- 源代码:https://github.com/alibaba/Sentinel
- 其中例子代码:Sentinel/sentinel-demo
- Dashboard下载:https://github.com/alibaba/Sentinel/releases
- 中文用户文档:https://sentinelguard.io/zh-cn/docs/introduction.html
Sentinel组成
- 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持
- 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等
控制台不维护规则,仅会通过端口查看
2. 使用步骤
- 定义资源
- 代码直接定义
- 使用注解定义
- 自动定义
- 定义规则
- 流量控制规则
- 熔断降级规则
- 系统保护规则
- 来源访问控制规则
- 热点参数规则
- 查看效果
- 日志
- Dashboard
定义资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源
定义规则
- 围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整
- 规则的种类
- 流量控制规则
- 熔断降级规则
- 系统保护规则(CPU、内存占用等)
- 来源访问控制规则(客户端来源)
- 热点参数规则(依据请求的某一个参数来做限定)
查看效果
- QPS一般指每秒查询率。每秒查询率(QPS,Queries-per-second)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
日志路径:C:\Users\14669\logs\csp\com-alibaba-csp-sentinel-demo-flow-FlowQpsDemo-metrics.log.2023-04-08
—timestamp-|———date time——|—resource—|p|block|s|e|rt
- p 代表通过的请求, block 代表被阻止的请求, s 代表成功执行完成的请求个数, e 代表用户自定义的异常, rt 代表平均响应时长
3. 简单的例子
@SentinelResource
注解(基于Spring Boot)
- 文档(注解支持):https://sentinelguard.io/zh-cn/docs/annotation-support.html
- 例子代码:Sentinel/sentinel-demo/sentinel-demo-annotation-spring-aop
- 依赖:sentinel-core、sentinel-annotation-aspectj、sentinel-transport-simple-http(与控制台连接)
配置Bean
SentinelResourceAspect
、注解@SentinelResource
sentinel.properties(配置项)
- 文档:https://sentinelguard.io/zh-cn/docs/startup-configuration.html
csp.sentinel.dashboard.server=www.sentinel.com:80
csp.sentinel.api.port=8719
project.name=mydemo
Sentinel 控制台
- 文档:https://sentinelguard.io/zh-cn/docs/dashboard.html
配置控制台的参数传入
java -Dcsp.sentinel.dashboard.server=www.sentinel.com:80 ......
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dcsp.sentinel.dashboard.server=www.sentinel.com:80"
配置应用的端口号
- 应用默认端口号:8719
csp.sentinel.api.port=8719
4. 限流
- 限流的直接表现是在执行
Entry nodeA = SphU.entry(资源名字)
的时候抛出 FlowException 异常 - FlowException 是 BlockException 的子类,您可以捕捉 BlockException 来自定义被限流之后的处理逻辑
- 一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果
- resource:资源名,即限流规则的作用对象
- count: 限流阈值
- grade: 限流阈值类型,QPS 或线程数
- strategy: 根据调用关系选择策略
并发线程数流量控制
- 线程数限流用于保护业务线程数不被耗尽
Sentinel线程数限流不负责创建和管理线程池,而是简单统计当前请求上下文的线程个数,如果超出阈值,新的请求会被立即拒绝
代码:
Sentinel\sentinel-demo\sentinel-demo-basic\..\flow\FlowThreadDemo.java
QPS流量控制
- 当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出 FlowException
- 代码:
Sentinel\sentinel-demo\sentinel-demo-basic\..\flow\FlowQpsDemo.java
5. 熔断降级
熔断策略—慢调用比例 (SLOW_REQUEST_RATIO)
代码:
Sentinel\sentinel-demo\sentinel-demo-basic\..\degrade\SlowRatioCircuitBreakerDemo.java
设置RT(最大的响应时间),用于判断慢调用
熔断策略—异常比例 (ERROR_RATIO)
代码:Sentinel\sentinel-demo\sentinel-demo-basic\..\degrade\ExceptionRatioCircuitBreakerDemo.java
异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
熔断策略—异常数 (ERROR_COUNT)
6. Spring Cloud Alibaba Sentinel
- 文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
- 例子代码:https://github.com/alibaba/spring-cloud-alibaba.git
- 子目录:spring-cloud-alibaba-examples
- 增加依赖:spring-cloud-starter-alibaba-sentinel
- 配置控制台信息
- HTTP 埋点(自动定义url资源)
- Feign 支持,断路器支持
- RestTemplate 支持
- Spring Cloud Gateway 支持
- Endpoint 支持(/actuator/sentinel)
- management.endpoints.web.exposure.include=*
注册 DataSource
- 目前支持file、nacos、zk、apollo、redis 这 5 种类型
- FileRefreshableDataSource 和 NacosDataSource
- nacos需要添加依赖sentinel-datasource-nacos
服务部署
演示内容
- 访问sentinel控制台
- 访问get-licenses: http://www.license.com/v1/organizations/e254f8c-c442-4ebe-a82a-e2fc1d1ff78a/licenses/
- 控制台查询:实时监控、簇点链路,可以看到已经自动创建了资源
- 定义流控规则(阈值0)、熔断规则
- 访问get-license-feign:http://www.license.com/v1/organizations/e254f8c-c442-4ebe-a82a-e2fc1d1ff78a/licenses/f3831f8c-c338-4ebe-a82a-e2fc1d1ff78a/feign
- 查看链路资源:
GET:http://organizationservice/v1/organizations/{organizationId}
- 定义熔断规则,测试发现返回了缺省值