sentinel个人总结
官方文档:https://sentinelguard.io/zh-cn/docs/dashboard.html
1.特性
Sentinel 与 Hystrix 的对比
Sentinel | Hystrix | |
---|---|---|
隔离策略 | 基于并发数 | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于响应时间或失败比率 | 基于失败比率 |
实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 即将发布 | 支持 |
调用链路信息 | 支持同步调用 | 不支持 |
限流 | 基于 QPS / 并发数,支持基于调用关系的限流 | 不支持 |
流量整形 | 支持慢启动、匀速器模式 | 不支持 |
系统负载保护 | 支持 | 不支持 |
实时监控 API | 各式各样 | 较为简单 |
控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
2、下载使用
下载sentinel控制台 jar包地址:https://ithub.com/alibaba/Sentinel/releases
通过java -jar启动sentinel ,默认sentinel占用的端口是8080 ,如果有改端口需求则更改对应端口即可。这里改为18080。
在jar包目录下启动命令行运行:
java -Dserver.port=18080 -jar sentinel-dashboard-1.8.0.jar
访问localhost:18080,打开本地控制台。
从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是sentinel。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xW7vtiQM-1628843889144)(sentinel demo文档.assets/1628071038326.png)]
3、基础配置
加入依赖管理和依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springCloud-Alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--sentinel限流-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
</dependencies>
注意自己修改端口等对应的信息,在这里sentinel使用来自定义的18080端口
server:
port: 8080
spring:
application:
name: sentinel-demo
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:18080
eager: true
datasource:
ds1:
file:
file: classpath:flowrule.json
data-type: json
rule-type: flow
ds2:
file:
file: classpath:degraderule.json
data-type: json
rule-type: degrade
启动类
@SpringBootApplication
public class SentinelMainApplication {
public static void main(String[] args) {
SpringApplication.run(SentinelMainApplication.class, args);
}
}
需要流控的Controller类,示例代码
@RestController
public class DemoController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
@GetMapping("/resource")
@SentinelResource(value = "test-resource", blockHandlerClass = {ExceptionUtil.class}, blockHandler = "exHandler")
public String resource() {
return "resource";
}
}
启动启动类
需要注意的是sentinel是懒加载的机制,也意味着需要访问一些上面Controller中的 /hello才会在sentinel后台看到服务
浏览器访问一下 http://localhost:8080//hello
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jmHhkX1-1628843889147)(sentinel demo文档.assets/1628147140825.png)]
然后刷新一下sentinel后台 http://localhost:18080/#/dashboard/home
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dloDbuwH-1628843889148)(sentinel demo文档.assets/1628128462977.png)]
出现了对/hello的监控。
4、项目结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cWy7FtzQ-1628843889151)(sentinel demo文档.assets/1628242834923.png)]
1.DemoController.java:用于测试url限流、关联模式、按资源名称限流
2.ConfigDemoController.java:测试文件方式规则持久化
3.DegradeController:熔断降级测试
4.ParamController.java,SecurityController.java:黑白名单功能测试
5.DemoUrlBlockHandler.java:拦截信息自定义
6.ExceptionUtil.java:用于拦截资源请求的提示方法集合类
7.flowrule.json:存放本地流控规则
8.sentinel-dashboard-1.8.0.jar: sentinel控制台jar包。
5、流量控制
直接模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQWtgVwN-1628843889153)(sentinel demo文档.assets/1628144441765.png)]
新增流量控制规则,对/hello端口进行流量控制,设置每秒最大访问次数2;这里默认直接模式,快速失败,其他模式选择高级选项。
快速访问/hello,查看结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TlYGSSGw-1628843889155)(sentinel demo文档.assets/1628144763772.png)]
系统默认的拦截信息,也可以自定义:
config包下创建DemoUrlBlockHandler.java
@Component
public class DemoUrlBlockHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
httpServletResponse.getWriter().println("flow is limiting");
}
}
关联模式
新增流量控制规则,打开高级选项:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xNWm5LiY-1628843889156)(sentinel demo文档.assets/1628146026738.png)]
Controller包下DemoController 添加:
@GetMapping("/helloA")
public String helloA() {
return "helloA";
}
测试:
使用postman模拟密集访问/helloA接口,设置20个线程,每隔0.3秒访问一次。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cQk90xHM-1628843889157)(sentinel demo文档.assets/1628146750174.png)]
查看关联资源:/hello情况。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DZ40h00-1628843889158)(sentinel demo文档.assets/1628146940863.png)]
说明:当关联资源/helloA的QPS阈值超过1时,就限制访问/hello。
链路模式
1、进入簇点链路下,查看/hello的资源入口是 sentinel_spring_web_context ;
2、添加流控,配置链路入口资源为sentinel_web_servlet_context ;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1wySdvzA-1628843889159)(sentinel demo文档.assets/1628148057148.png)]
3、当频繁访问接口/hello时,发现报错flow is limiting,表示被限流了。
按资源名称限流
@SentinelResource注解:用于定义资源,并提供了AspectJ的扩展用于自动定义资源、处理BlockException等 ;
DemoController中加入以下代码:
@GetMapping("/resource")
@SentinelResource(value = "test-resource", blockHandlerClass = {ExceptionUtil.class}, blockHandler = "exHandler")
public String resource() {
return "resource";
}
定义资源名称:test-resource
按资源名称添加流控规则:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2LL5edzW-1628843889160)(sentinel demo文档.assets/1628156027540.png)]
快速访问/resource:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZhkvQlyY-1628843889161)(sentinel demo文档.assets/1628156111731.png)]
6、规则持久化
一旦我们重启应用,Sentinel规则将消失,生产环境需要将配置规则进行持久化 。
这里使用本地文件持久化规则。
1.添加yml配置:
datasource:
ds1:
file:
file: classpath:flowrule.json
data-type: json
rule-type: flow
2.resource下新建同名json保存规则:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5wYhF4F-1628843889162)(sentinel demo文档.assets/1628215679503.png)]
3.写入规则:
[
{
"resource": "file-resource",
"controlBehavior": 0,
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0
},
{
"resource": "test-resource",
"controlBehavior": 0,
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
- resource:资源名,即限流规则的作用对象
- count: 限流阈值
- grade: 限流阈值类型(QPS 或并发线程数)
- limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
- strategy: 调用关系限流策略
- controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
4.启动服务。打开控制台。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jUt0xmV3-1628843889163)(sentinel demo文档.assets/1628215759988.png)]
7、熔断降级
新建DegradeController,产生异常进行测试。
public class DegradeController {
int i=0;
@GetMapping("/testD")
public String message1() {
i++;
// 异常比例为0.333
if (i % 3 == 0) {
throw new RuntimeException("模拟异常");
}
return "degrade is testing";
}
新建降级规则:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-95ObZqvl-1628843889163)(sentinel demo文档.assets/1628237532280.png)]
当异常比例大于0.25,每秒请求大于等于1;降级规则生效,熔断时长10秒,10秒后恢复正常。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NzCl9c70-1628843889164)(sentinel demo文档.assets/1628237689067.png)]
与Hystrix的熔断对比:
Hystrix常用的线程池隔离会造成线程上下切换的overhead比较大;Hystrix使用的信号量隔离对某个资源调用的并发数进行控制,效果不错,但是无法对慢调用进行自动降级;
Sentinel通过并发线程数的流量控制提供信号量隔离的功能;此外,Sentinel支持的熔断降级维度更多,可对多种指标进行流控、熔断,且提供了实时监控和控制面板,功能更为强大。
}
新建降级规则:
[外链图片转存中...(img-95ObZqvl-1628843889163)]
当异常比例大于0.25,每秒请求大于等于1;降级规则生效,熔断时长10秒,10秒后恢复正常。
[外链图片转存中...(img-NzCl9c70-1628843889164)]
**与Hystrix的熔断对比:**
Hystrix常用的线程池隔离会造成线程上下切换的overhead比较大;Hystrix使用的信号量隔离对某个资源调用的并发数进行控制,效果不错,但是无法对慢调用进行自动降级;
Sentinel通过并发线程数的流量控制提供信号量隔离的功能;此外,Sentinel支持的熔断降级维度更多,可对多种指标进行流控、熔断,且提供了实时监控和控制面板,功能更为强大。