正文
一、Sentinel是什么
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
说到这下面几个名词需要知道
服务降级:在高并发的情况下,有的程序会处于等待状态, 防止用户一直等待,采用限流/熔断方法,使用服务降级的方式返回一个友好的提示给客户端,不会执行业务逻辑请求,直接走本地的falback的方法。
服务限流:服务限流目的是为了更好的保护我们的服务,在高并发的情况下,如果客户端请求的数量达到一定极限(后台可以配置阈值),请求的数量超出了设置的阈值,开启自我的保护,直接调用我们的服务降级的方法,不会执行业务逻辑操作,直接走本地falback的方法,返回一个友好的提示。
服务的雪崩效应: tomcat只有一个线程池处理所有的接口,高并发的情况下,所有的请求堆积到一个接口(所有的线程都处理这个 接口,没有空闲的线程处理别的接口)导致其他接口发生等待。
二、Sentinel与Hystrix
三、Linux搭建Sentinel环境
首先去官网下载相应的jar包,或者下载源码自己打包https://github.com/alibaba/Sentinel/releases
将下载好的jar包上传到服务器以下是脚本,加入开机启动
Sentinel 配置开机启动 进入目录 [root@localhost sentinel]# cd /etc/rc.d/init.d/ 启动脚本 #!/bin/bash # # chkconfig: 2345 10 90 # # description:auto_run #程序名 RUN_NAME="sentinel-dashboard-1.8.1.jar" #资源位置 自己创建文件 JAVA_OPTS=/opt/sentinel/sentinel-dashboard-1.8.1.jar #日志位置 LOG_DIR=/opt/sentinel/logs/ LOG_FILE=$LOG_DIR/sentinel-dashboard.log LOG_OPTS=/opt/sentinel/sentinel_temp.log #开始方法 start() { source /etc/profile; nohup java -Xms256M -Xmx512M -XX:PermSize=128M -XX:MaxPermSize=256M -Dcsp.sentinel.log.dir=$LOG_DIR -Dlogging.file=$LOG_FILE -Dserver.port=8849 -Dcsp.sentinel.dashboard.server=127.0.0.1:8849 -Dproject.name=Sentinel基本控制台 -jar $JAVA_OPTS >$LOG_OPTS 2>&1 & echo "$RUN_NAME started success." } #结束方法 stop() { echo "stopping $RUN_NAME ..." kill -9 `ps -ef|grep $JAVA_OPTS|grep -v grep|grep -v stop|awk '{print $2}'` } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Userage: $0 {start|stop|restart}" exit 1 esac #授权为可执行文件 chmod +x sentinel chmod +x /opt/sentinel/sentinel-dashboard-1.8.1.jar #添加至系统服务 [root@localhost init.d]# chkconfig --add sentinel #开机启动 [root@localhost init.d]# chkconfig sentinel on #查看列表 [root@localhost init.d]# chkconfig --list
四、项目配置
spring: application: ###服务的名称 name: xiaojie-order cloud: nacos: discovery: ###nacos注册地址 server-addr: 127.0.0.1:8848 sentinel: transport: #sentinel的地址 dashboard: ip:8849 eager: true datasource: ds: nacos: ### nacos连接地址 server-addr: localhost:8848 ## nacos连接的分组 group-id: DEFAULT_GROUP ###路由存储规则 rule-type: flow ### 读取配置文件的 data-id对应下图的nacos的DATA-ID data-id: xiaojie-order-sentinel ### 读取培置文件类型为json data-type: json server: port: 8090 tomcat: max-threads: 20
接口对应的代码
/* * * fallback 服务降级后执行的办法 * blockHandler 限流/熔断出现异常执行的方法 * value 指定我们的资源的名称(配置的资源名) * @author xiaojie * @date 2021/6/17 9:36 * @return java.lang.String */ @SentinelResource(value = GETORDER_KEY, blockHandler = "getOrderQpsException") @RequestMapping("/orderToMemberSentinelResource") public String orderToMemberSentinelResource() { return "orderToMemberSentinelResource"; } /* * @param e * @限流后返回的提示 * @author xiaojie * @date 2021/6/17 9:38 * @return java.lang.String */ public String getOrderQpsException(BlockException e) { e.printStackTrace(); return "该接口已经被限流啦!"; }
面的资源名对应的是接口中@SentinelResource的value值,如果使用注解,则对应的是value值,若没有注解,对应的是相应的url值。
五、将配置信息持久化到nacos
持久化可以使用Apollo、Consul、数据库、Nacos、Redis、Zookeeper,我是用的是nacos
具体内容如下
[ { "resource":"orderToMember", 资源名称 "limitApp":"default",来源 "grade":1,阈值类型0--线程数1-QPS "count":1,阈值 "strategy":0,流控模式 0-直接;1-关联,2-链路 "controlBehavior":0,流控效果 0-快速失败;1-WarmUp;2-排队等候 "clusterMode":false }, { "resource":"/orderToMember", "limitApp":"default", "grade":1, "count":1, "strategy":0, "controlBehavior":0, "clusterMode":false } ]
然后访问对应接口,即出现效果。
完整代码demo:https://gitee.com/whisperofjune/spring-cloud-sentine.git
参考:
https://blog.csdn.net/weixin_44187730/article/details/109121401
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D