目录
分布式流量防护_Sentinel控制台环境安装基于Linux
分布式流量防护_Sentinel控制台环境安装基于Docker
分布式流量防护_Sentinel控制台环境安装基于Linux
获取 Sentinel 控制台
下载https://github.com/alibaba/Sentinel/releases
启动 Sentinel 控制台
linux模式
java -Dserver.port=8878 \
-
Dcsp.sentinel.dashboard.server=192.168.66.100:8878 \
-Dproject.name=sentinel-dashboard \
-jar ./sentinel-dashboard.jar
后台运行: nohup java -server -Xms64m -Xmx256m - Dserver.port=8878 - Dcsp.sentinel.dashboard.server=192.168.66.100:8878- Dproject.name=sentinel-dashboard -jar sentineldashboard-1.8.3.jar >> /opt/sentinel.log 2>&1 &
windows模式
java -jar ./sentinel-dashboard.jar \
--server.port=8858 \
--
csp.sentinel.dashboard.server=192.168.66.101:8858 \
--project.name=sentinel-dashboard
注意: 强烈建议使用JRE8启动Sentinel控制台,高版本JDK可能存在未 知BUG。
测试访问
访问http://192.168.66.101:8858 即可,登录用户名密码都是 sentinel。
分布式流量防护_Sentinel控制台环境安装基于Docker
拉取镜像
docker pull docker.io/bladex/sentinel-dashboard
创建启动容器
docker run --name sentinel --restart=always -d -p 8888:8858 docker.io/bladex/sentinel-dashboard
查看容器
docker ps
测试访问
访问http://192.168.66.101:8858即可,登录用户名密码都是 sentinel。
分布式流量防护_将应用接入Sentinel
创建工程cloud-sentinel-payment8001
POM引入依赖
<dependencies>
<!-- Nacos 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloudstarter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- sentinel依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloudstarter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--借用监控开放端口-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
编写主启动类
@SpringBootApplication
@Slf4j
public class PaymentSentinelMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentSentinelMain8001.class,args);
log.info("************PaymentSentinelMain8001 启动成功 **********");
}
}
编写YML配置文件
server:
port: 8001
spring:
application:
#应用名字
name: cloud-sentinel-payment
cloud:
nacos:
discovery:
# Nacos地址
server-addr: 192.168.66.101:8848
sentinel:
transport:
# Sentinel 控制台地址
dashboard: 192.168.66.101:8858
# sentinel api端⼝,默认8719
port: 8719
编写测试controller
@RestController
public class FlowLimitController {
@GetMapping("testA")
public String testA(){
return "------------testA";
}
}
查看Sentinel控制层
发送请求
发送http://192.168.66.101:8858
分布式流量防护_流量控制概述
监控应用流量的 QPS 或并发线程数,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
流量控制设计理念
流量控制有以下几个角度:
资源的调用关系:例如资源的调用链路,资源和资源之间的关系;
运行指标:例如 QPS、线程池、系统负载等;
控制的效果:例如直接限流、冷启动、排队等。
流控规则
参数:
1、资源名
其实就是我们请求的资源路径
2、针对来源
这个是此流控规则对应那些微服务进行流控管理,一般填写调 用方的微服务名称,多个用","分割
3、阈值类型
一般有2中类型,QPS(每秒的最大请求数2)和线程数(并发 线程数)
4、单机阈值
单机状态下的最大限制值
5、是否集群
根据实际情况选择
流控模式
流控效果
参数:
1、快速失败
默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出 FlowException 。
2、Warm Up
即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。 通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加 到阈值上限,给冷系统一个预热的时间,避免冷系统被压。
3、排队等待
匀速排队方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法 。这种方式主要用于处理间隔性突发的流量。
实时效果反馈
1.Sentienl默认流控模式_____。
A 直接
B 关联
C 链路
D 以上都错误
2. Sentienl默认流控效果____。
A 快速失败
B 冷启动
C 排队等待
D 以上都是错误
分布式流量防护_流控模式之直接模式
当 QPS 超过某个阈值的时候,则采取措施进行流量控制。
注意: 若使用除了直接拒绝之外的流量控制效果,则调用关系限流策略(strategy)会被忽略。
配置QPS流控规则
注意: 表示1秒钟内查询1次就ok,若超过1次,就直接快速失败,报默 认错误。
测试流量控制QPS
发送请求http://localhost:8001/testA
快速发送请求
分布式流量防护_流控模式之关联模式
什么是关联
当关联的资源达到阈值时,就限流自己,当与A关联的资源B达到阈值后,就限流自己。
配置关联规则
预期效果
由于对/testA的限流控制采用QPS 关联 ,所以直接访问不会被限流, 会发现一直刷新 /testB 不会出现限流,如图:
但是访问 /testA 设置来QPS 直接 的策略进行限流,则频繁访问/testB会 出现限流提示:
实时效果反馈
1.下列描述Sentienl流控模式关联模式正确的是_____。
A 我的锅自己背
B 你的锅你自己背
C 你的锅我来背
D 以上都错误
分布式流量防护_流控模式之链路模式
链路流控模式指的是,当从某个接口过来的资源达到限流条件时, 开启限流。它的功能有点类似于针对来源配置项,区别在于:针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。
配置示例:
例如有两条请求链路:
/test1 --> /common
/test2 --> /common
如果只希望统计从/test2进入到/common的请求,则可以这样配置:
实战案例
需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。
实现
添加查询商品方法
在支付服务中,给PaymentService类添加一个queryGoods方法:
public void queryGoods(){
System.err.println("查询商品");
}
查询订单时,查询商品
@GetMapping("/query")
public String queryOrder() {
// 查询商品
orderService.queryGoods();
// 查询订单
System.out.println("查询订单");
return "查询订单成功";
}
新增订单
在支付服务的PaymentController中,修改/order/save端点,模拟新增订单:
@GetMapping("/save")
public String saveOrder() {
// 查询商品
orderService.queryGoods();
// 查询订单
System.err.println("新增订单");
return "新增订单成功";
}
给查询商品添加资源标记
默认情况下,OrderService中的方法是不被Sentinel监控的,需要 我们自己通过注解来标记要监控的方法。 给OrderService的queryGoods方法添加@SentinelResource注解:
@SentinelResource("goods")
public void queryGoods(){
System.err.println("查询商品");
}
簇点链路
链路模式中,是对不同来源的两个链路做监控。但是sentinel默认会给进入SpringMVC的所有请求设置同一个root资源,会导致链路模式失效。我们需要关闭这种对SpringMVC的资源聚合,修改 application.yml文件。
spring:
application:
name: payment-provider-sentinel
cloud:
nacos:
discovery:
# Nacos服务地址
server-addr: 192.168.66.100:8848
sentinel:
transport:
# Sentinel控制台地址
dashboard: 192.168.66.100:8888
# sentnel api端口号 默认 8719
port: 8719
# 关闭context整合
web-context-unify: false
重启服务,访问query和save,可以查看到sentinel的簇点链路规则中,出现了新的资源。
添加流控规则
点击goods资源后面的流控按钮,在弹出的表单中填写下面信息
实时效果反馈
1.下列描述Sentienl流控模式链路模式正确的是_____。
A 针对来源配置项
B 快速失败
C 你的锅我来背
D 以上都错误