Sentinel学习分享


一、Sentinel是什么?

Sentinel官方文档

Sentinel是一款开源的分布式系统流量控制、熔断降级和系统保护的工具。它由阿里巴巴集团开发并开源,旨在帮助开发者构建更加可靠、稳定和高性能的分布式系统。

在分布式系统中,流量控制和熔断降级是保护系统稳定性的重要手段。Sentinel提供了实时的流量控制、熔断降级和系统保护功能,帮助开发者限制接口的访问频率、控制并发量,从而提高系统的可用性和稳定性。

Sentinel具有以下特点和功能:

流量控制:通过定义资源、设置阈值和限流策略,可以对接口的并发量、访问频率进行控制,防止系统被过载。

熔断降级:通过定义熔断规则,当接口异常或达到一定阈值时,可以触发熔断保护,避免故障蔓延和雪崩效应。

系统保护:通过定义系统规则,可以对整个系统的入口流量进行控制,保护系统的稳定性和可靠性。

实时监控:Sentinel提供了实时的监控和统计功能,可以监控接口的QPS、响应时间等指标,并提供可视化的控制台展示。

规则持久化:Sentinel支持多种规则的持久化方式,包括注解方式、配置文件方式、动态API方式和Nacos配置中心方式。

高可扩展性:Sentinel可以与Spring Cloud、Dubbo等常见的分布式框架进行集成,提供更加全面的流量控制和熔断降级功能。

Sentinel的目标是为开发者提供一种可靠、易用的流量控制和熔断降级解决方案,帮助构建稳定、高效的分布式系统。通过合理配置和使用Sentinel,可以有效地保护系统免受异常流量和故障的影响,提高系统的可用性和可靠性。

二、windows下安装使用

1.下载

Sentinel官网下载

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及规则数据双向同步

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值