一、Sentinel是什么?
Sentinel是一款开源的分布式系统流量控制、熔断降级和系统保护的工具。它由阿里巴巴集团开发并开源,旨在帮助开发者构建更加可靠、稳定和高性能的分布式系统。
在分布式系统中,流量控制和熔断降级是保护系统稳定性的重要手段。Sentinel提供了实时的流量控制、熔断降级和系统保护功能,帮助开发者限制接口的访问频率、控制并发量,从而提高系统的可用性和稳定性。
Sentinel具有以下特点和功能:
流量控制:通过定义资源、设置阈值和限流策略,可以对接口的并发量、访问频率进行控制,防止系统被过载。
熔断降级:通过定义熔断规则,当接口异常或达到一定阈值时,可以触发熔断保护,避免故障蔓延和雪崩效应。
系统保护:通过定义系统规则,可以对整个系统的入口流量进行控制,保护系统的稳定性和可靠性。
实时监控:Sentinel提供了实时的监控和统计功能,可以监控接口的QPS、响应时间等指标,并提供可视化的控制台展示。
规则持久化:Sentinel支持多种规则的持久化方式,包括注解方式、配置文件方式、动态API方式和Nacos配置中心方式。
高可扩展性:Sentinel可以与Spring Cloud、Dubbo等常见的分布式框架进行集成,提供更加全面的流量控制和熔断降级功能。
Sentinel的目标是为开发者提供一种可靠、易用的流量控制和熔断降级解决方案,帮助构建稳定、高效的分布式系统。通过合理配置和使用Sentinel,可以有效地保护系统免受异常流量和故障的影响,提高系统的可用性和可靠性。
二、windows下安装使用
1.下载
1.1、找到自己想要的版本进行下载
1.2、启动,java -jar sentinel-dashboard-1.8.2.jar(默认访问端口为8080),也可指定端口启动java -Dserver.port=8089 -jar sentinel-dashbord-1.8.2.jar;
1.3、打开sentinel控制台页面,启动后访问客户端,通过http://localhost:8080/访问,用户名和密码sentinel;
可以自己根据需要配置适合的
2.配置使用
2.1、application配置(做规则持久化时才需要配置,如果是简单玩一玩sentinel不做持久化的话可以不用配置,直接跳到nacos配置即可)
#flow-流控规则
spring.cloud.sentinel.datasource.flow.nacos.username=nacos
spring.cloud.sentinel.datasource.flow.nacos.password=nacos
spring.cloud.sentinel.datasource.flow.nacos.server-addr=localhost:8847
spring.cloud.sentinel.datasource.flow.nacos.namespace=rfid
spring.cloud.sentinel.datasource.flow.nacos.dataId=flow-rules
spring.cloud.sentinel.datasource.flow.nacos.groupId=SENTINEL_GROUP
spring.cloud.sentinel.datasource.flow.nacos.data-type=json
spring.cloud.sentinel.datasource.flow.nacos.rule-type=flow
#authority-授权规则
spring.cloud.sentinel.datasource.authority.nacos.username=nacos
spring.cloud.sentinel.datasource.authority.nacos.password=nacos
spring.cloud.sentinel.datasource.authority.nacos.server-addr=localhost:8847
spring.cloud.sentinel.datasource.authority.nacos.namespace=rfid
spring.cloud.sentinel.datasource.authority.nacos.dataId=authority-rules
spring.cloud.sentinel.datasource.authority.nacos.groupId=SENTINEL_GROUP
spring.cloud.sentinel.datasource.authority.nacos.data-type=json
spring.cloud.sentinel.datasource.authority.nacos.rule-type=authority
#degrade-降级规则
spring.cloud.sentinel.datasource.degrade.nacos.username=nacos
spring.cloud.sentinel.datasource.degrade.nacos.password=nacos
spring.cloud.sentinel.datasource.degrade.nacos.server-addr=localhost:8847
spring.cloud.sentinel.datasource.degrade.nacos.namespace=rfid
spring.cloud.sentinel.datasource.degrade.nacos.dataId=degrade-rules
spring.cloud.sentinel.datasource.degrade.nacos.groupId=SENTINEL_GROUP
spring.cloud.sentinel.datasource.degrade.nacos.data-type=json
spring.cloud.sentinel.datasource.degrade.nacos.rule-type=degrade
#param-flow-热点规则
spring.cloud.sentinel.datasource.param-flow.nacos.username=nacos
spring.cloud.sentinel.datasource.param-flow.nacos.password=nacos
spring.cloud.sentinel.datasource.param-flow.nacos.server-addr=localhost:8847
spring.cloud.sentinel.datasource.param-flow.nacos.namespace=rfid
spring.cloud.sentinel.datasource.param-flow.nacos.dataId=param-flow-rules
spring.cloud.sentinel.datasource.param-flow.nacos.groupId=SENTINEL_GROUP
spring.cloud.sentinel.datasource.param-flow.nacos.data-type=json
spring.cloud.sentinel.datasource.param-flow.nacos.rule-type=param-flow
#system-系统规则
spring.cloud.sentinel.datasource.system.nacos.username=nacos
spring.cloud.sentinel.datasource.system.nacos.password=nacos
spring.cloud.sentinel.datasource.system.nacos.server-addr=localhost:8847
spring.cloud.sentinel.datasource.system.nacos.namespace=rfid
spring.cloud.sentinel.datasource.system.nacos.dataId=system-rules
spring.cloud.sentinel.datasource.system.nacos.groupId=SENTINEL_GROUP
spring.cloud.sentinel.datasource.system.nacos.data-type=json
spring.cloud.sentinel.datasource.system.nacos.rule-type=system
这些配置文件需要在nacos配置管理加上一下五个配置文件:
flow-rules(流控规则)
authority-rules(授权规则)
degrade-rules(降级规则)
param-flow-rules(热点规则)
system-rules(系统规则)
规则格式示例:(规则格式可在官网学习)
2.2、nacos配置(若没有使用nacos,则将该配置加在application文件)
# sentinel配置
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
#默认8719,假如被占用了会自动从8719开始依次+1扫描。直至找到未被占用的端口
port: 8719
# feign调用超时时间配置
feign:
client:
config:
default:
connectTimeout: 10000
readTimeout: 600000
# 开启 sentinel 对 feign 的支持
sentinel:
enabled: true
配置之后启动自己的项目,即可实时监控自己项目中的接口调用情况;
2.3、sentinel自定义埋点
2.3.1、对自己想要做规则限制的接口添加@SentinelResource注解
@SentinelResource(value = "assetsList",
fallback = "assetsList",// fallback 只负责业务异常
fallbackClass = {AssetsFallback.class},
blockHandler = "assetsListBlockHandler", // blockHandler 只负责 sentinel 控制台配置违规
blockHandlerClass = {AssetsBlockHandler.class},
exceptionsToIgnore = {IllegalArgumentException.class} // 忽略业务异常,人工处理
)
@Component
public class AssetsFallback {
public static Result assetsListFallback(
Page pageReq,
TAssets assets,
Integer deleted,
List<Long> cabinetIds,
Throwable e
) {
return Result.businessFailure(MessageUtils.message("自定义异常处理"));
}
}
@Component
public class AssetsBlockHandler {
public static Result assetsListBlockHandler(
Page pageReq,
TAssets assets,
Integer deleted,
List<Long> cabinetIds,
BlockException exception
) {
return Result.businessFailure(MessageUtils.message("自定义控制台处理(限流等).."));
}
}
2.3.2、到sentinel控制台添加相应的规则,以流控规则为例,我添加了一个QPS阈值为2的流控规则,意思是一秒查询达到两次之后就会降级,抛出错误,并返回我们刚刚在上面配置的【自定义控制台处理(限流等)…】错误信息,等流量降到阈值以下时就能正常运行。
效果图:
2.3.3、熔断规则的配置,熔断规则有很多的策略,同学们都可以进行尝试。
2.4、规则持久化
方式一:通过naocs对sentinel规则进行持久化:(核心,上生产的必要条件)
因为在sentinel客户端创建的规则在sentinel服务重启后就会丢失,属于临时的数据,所以需要对规则数据进行持久化;
单向持久化:在nacos配置持久化文件,手动在持久化文件里面定义规则,sentinel客户端启动后会定期读取nacos中配置的规则持久化文件,到达规则持久化的目的;
不过在sentinel客户端手动建立的规则没法同步上传到规则持久化文件;
双向持久化:在单向持久化的基础上对源码进行改造,使得可以在sentinel客户端手动创建规则的时候将规则同步写入到nacos的规则持久化文件,使得规则持久化;
方式二:携程的阿波罗
方式三:存放本地文件
方式四:Zookeeper
本文只记录了方式一的单向持久化,其他持久化方式同学们也可去了解学习;
2.4.1 nacos方式持久化
通过nacos持久化规则(单向持久化):参看上面2.1
通过nacos持久化规则(双向向持久化):需要修改sentinel源码实现,目前暂未实现;可参看文章结尾的相关资料;
三、linux下安装使用
linux服务器搭建sentinel和本地没有太大的区别,只是需要把sentinel运行到服务器上就行,不管是以jar包的方式运行,还是以docker容器的方式运行。
1.以jar包的方式在服务器运行
1.1、linux服务器下载sentinel-dashboard-1.8.2.jar或者本地下载上传到服务器
1.2、其他配置和本地配置一样,都改为服务器相关信息的配置即可
1.3、启动sentinel,可使用自定义脚本start_sentinel.sh启动,可直接使用也可参考优化
启动:sh start_sentinel.sh start
停止:sh start_sentinel.sh stop
重启:sh start_sentinel.sh restart
脚本如下:
export JAVA_HOME="$JAVA_HOME"
export PATH=$JAVA_HOME/bin:$PATH
JAVA="java -Djava.net.preferIPv4Stack=true -Dserver.port=9139 -Dcsp.sentinel.dashboard.server=192.168.10.100:9139 -Dproject.name=sentinel-dashboard -jar "
#jar包名称 别名
appName="sentinel"
PROGRAM="sentinel-dashboard-1.8.2.jar $appName"
if [ $1 == "start" ] ; then
echo $PROGRAM "starting !"
if [ $debug == "true" ] ; then
nohup $JAVA $PROGRAM >sentinel.log 2>&1 &
else
nohup $JAVA $PROGRAM >/dev/null 2>&1 &
fi
echo "For details, please check the project log!"
elif [ $1 == "stop" ]
then
echo $PROGRAM "stopping !"
#查看是否存在这个进程,返回结果是数字,
pcount=`ps -ef | grep "$appName" | grep -v "grep" | wc -l`
if [ $pcount -gt 0 ]; then #返回的数字不小于0 说明存在进程
#获取进程ID 并 杀掉进程
pid=`ps -ef | grep "$appName" | grep -v "grep" | awk '{ print $2; }'`
kill -9 $pid
else
echo "$PROGRAM" not running;
fi
elif [ $1 == "restart" ]; then
echo $PROGRAM "restart !"
pcount=`ps -ef | grep "$appName" | grep -v "grep" | wc -l`
if [ $pcount -gt 0 ]; then #返回的数字不小于0 说明存在进程
#获取进程ID 并 杀掉进程
pid=`ps -ef | grep "$appName" | grep -v "grep" | awk '{ print $2; }'`
kill -9 $pid
sleep 1
fi
if [ $debug == "true" ] ; then
nohup $JAVA $PROGRAM >local.log 2>&1 &
else
nohup $JAVA $PROGRAM >/dev/null 2>&1 &
fi
echo "For details, please check the project log!"
else
echo "Please make sure the positon variable is [start] [stop] [restart]."
fi
exit 0
2.以容器的方式在服务器运行
操作基本类似,只是需要下载sentinel对应版本镜像在容器中运行,配置相关文件;
总结
针对自己学习sentinel做一个总结,希望和同学们一起进步。
参考文献
SpringCloud Alibaba Sentinel规则持久化
Sentinel配置规则持久化至Nacos
SpringCloudAlibaba - Sentinel使用nacos进行持久化
Sentinel规则持久化到Nacos及规则数据双向同步