Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。
Sentinel 分为两个部分:
Sentinel和Hystrix对比的差异
Sentinel 功能主要体现在三个方面
流量控制
对于系统来说,任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。
控制角度如下:
熔断降级
当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。手段如下
系统负载保护
Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果 这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。 针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。
服务降级
当流量达到一定的极限(后台可以配置阈值),请求的数量超出了设置的阈值,开启自我的保护,直接调用我们的服务降级的方法给一个友好的提示。
或者当服务错误率达到一定的比例,开启自我保护,直接调用服务降级的方法,给一个友好的提示。
Sentinel提供了多种配置方案(流量控制、线程数隔离、慢调用降级、速率控制、集群限流、异常熔断、调用关系限流、来源访问控制、、)
服务隔离
对于特定的服务(秒杀、特价、抢购、抢票、、、、高并发的服务),我们服务的隔离机制分为信号量和线程池隔离模式
服务的线程池隔离机制:每个服务接口都有自己独立的线程池,互不影响,缺点就是占用cpu资源非常大。
服务的信号量隔离机制:最多只有一定的阈值线程数处理我们的请求,超过该阈值会拒绝请求。
为什么选用Sentinel来做服务保护?
1.丰富的应用场景:前哨兵承接了阿里巴巴近10年的双十一大促流的核心场景,例如秒杀(即突然流量控制在系统容量可以承受的范围),消息削峰填谷,传递流量控制,实时熔断下游不可用应用等。
2.完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接收应用的单台机器秒级数据,甚至500台以下规模的整合的汇总运行情况。
广泛的开源生态:Sentinel提供开箱即用的与其他开源框架/库的集成模块,例如与Spring Cloud,Dubbo,gRPC的整合。您只需要另外的依赖并进行简单的配置即可快速地接入Sentinel。
3.完善的SPI扩展点:Sentinel提供简单易用,完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理,适应动态数据源等。
Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供可选的异常处理和 fallback 配置项 。该注解包含以下属性
Sentinel dashboard 控制台选择创建流量规则,设置资源名称(服务接口地址)、设置QPS 为1 表示每s最多能够访问1次接口。
下载地址:https://github.com/alibaba/Sentinel/releases
运行执行命令
java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8719 -jar
8718属于界面端口号; 8719 属于api通讯的端口号
在infosys-order服务中配置getOrder资源名(infosys-order服务中对应的限流方法名),配置每秒访问2次,超过了给出限流提示
对应业务配置
配置说明:当线程池达到每秒1个请求,走到限流逻辑
pom文件
com.alibaba.cloud
spring-cloud-alibaba-sentinel
2.2.0.RELEASE
org.springframework.boot
spring-boot-starter-actuator
业务代码:
/**
* value = getOrder,需要和sentinel-dashboard配置保持一致
* getOrderQpsException:服务降级走的流程
* <功能详细描述>
* @return[参数说明]
* @return String[返回类型说明]
* @exception throws [违例类型][违例说明]
* @see [类、类#方法、类#成员]
*/
@SentinelResource(value = "getOrder", blockHandler = "getOrderQpsException")
@RequestMapping("/getOrder")
public String getOrder()
{
return "getOrder接口,接口正常被调用!";
}
/**
* 被限流后返回的提示
*
* @param e
* @return
*/
public String getOrderQpsException(BlockException e) {
e.printStackTrace();
return "该接口已经被限流啦!";
}
application.yml配置
spring:
application:
###服务的名称
name: infosys-order
cloud:
nacos:
discovery:
###nacos注册地址
server-addr: 192.168.234.135:8848
sentinel:
eager: true
transport:
dashboard: 127.0.0.1:8718
server:
port: 8091
测试效果,当请求达到每秒2次,走限流接口.
默认的情况下Sentinel的规则是存放在内存中,如果Sentinel客户端重启后,Sentinel数据规则可能会丢失。
解决方案:Sentinel持久化机制支持四种持久化的机制。
[
{
"resource": "/ getOrderSentinel",
"limitApp": "default",
"grade": 1,
"count": 5,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
resource:资源名,即限流规则的作用对象
limitApp:流控针对的调用来源,若为 default 则不区分调用来源
grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
count:限流阈值
strategy:调用关系限流策略
controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
clusterMode:是否为集群模式
Nacos配置信息
yml信息
spring:
application:
###服务的名称
name: infosys-order
cloud:
nacos:
discovery:
###nacos注册地址
server-addr: 192.168.234.135:8848
sentinel:
eager: true
transport:
dashboard: 127.0.0.1:8718
datasource:
ds1:
nacos:
### nacos连接地址
server-addr: 192.168.234.135:8848
### 读取配置文件的 data-id
dataId: infosys-order
## nacos连接的分组
group-id: DEFAULT_GROUP
ruleType: flow
server:
port: 8091
业务调用
@SentinelResource(value = "getOrderSentinel", blockHandler =
"getOrderSentinelBlockHandler")
@RequestMapping("/getOrderSentinel")
public String getOrderSent() {
return "getOrderSentinel";
}
public String getOrderSentinelBlockHandler(BlockException e) {
return "当前访问人数过多,请稍后重试!";
}
配置nacos以后,会自动加载内存,显示到Sentinel-dashboard
参考:
中文文档:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
GitHub:https://github.com/all4you/sentinel-tutorial
GitHub:https://github.com/eacdy/Sentinel-Dashboard-Nacos