目录
一、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