前面的文章创建了简单的Spring Boot应用,使用了Nacos作为配置和服务发现中心,现在再为它添加Sentinel流量监控功能。
以下我们为之前的项目添加 Sentinel功能,由于是Spring Boot以及Cloud,此次我们也是使用Spring Cloud Alibaba的组件spring-cloud-alibaba-sentinal,更多详细信息可以参考官方文档 Spring Cloud Alibaba Sentinel:
配置:
-
pom.xml中添加相关依赖项:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>0.9.0.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.6.3</version> </dependency>
由于spring-cloud-starter-alibaba-sentinel已经为我们引入了使用Sentinel所需大部分依赖项,我们只需要再添加sentinel-core依赖项即可。
- 应用中的配置
#指定dashbord地址
spring.cloud.sentinel.transport.dashboard=localhost:9090
#提前触发Sentinel初始化
spring.cloud.sentinel.eager=true
#指定sentinel数据源
spring.cloud.sentinel.datasource.ds2.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds2.nacos.data-id=sentinel
spring.cloud.sentinel.datasource.ds2.nacos.group-id=quickstart_cloud
spring.cloud.sentinel.datasource.ds2.nacos.data-type=json
spring.cloud.sentinel.datasource.ds2.nacos.rule-type=flow
sentinel支持四种数据源,文件、nacos配置、zookeeper配置和apollo配置,由于我们已经应用nacos作为配置中心,因此也将sentinel的规则数据配置在nacos上面,具体dataid和group根据实际配置,以下使用json格式流量控制规则配置为例:
[
{
"resource": "/hello",
"controlBehavior": 0,
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0
},
{
"resource": "/test",
"controlBehavior": 0,
"count": 0,
"grade": 1,
"limitApp": "default",
"strategy": 0
},
{
"resource": "GET:http://www.taobao.com",
"controlBehavior": 0,
"count": 0,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
配置解析:
- resource: 资源名,即限流规则的作用对象
- grade:流量控制主要有两种统计类型,一种是统计并发线程数,另外一种则是统计 QPS,由grade字段定义, 0 代表根据并发数量来限流,1 代表根据 QPS 来进行流量控制。
- controlBehavior: 当 QPS 超过某个阈值的时候,则采取措施进行流量控制。流量控制包括:直接拒绝(0)、Warm Up(1)、匀速排队(2),默认直接拒绝,3是热身+匀速排队
- count: 限流阈值
- limitApp: 根据调用来源进行流量控制,defaut表示不区分调用者,{some_origin_name},可以指定一个或多个调用方,使用逗号分隔;other表示针对除 {some_origin_name} 以外的其余调用方的流量进行流量控制。例如,资源NodeA配置了一条针对调用者 caller1 的限流规则,同时又配置了一条调用者为 other 的规则,那么任意来自非 caller1 对 NodeA 的调用,都不能超过 other 这条规则定义的阈值。
- 同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default
- strategy:调用关系限流策略,0表示直接生效,1表示设置关联限流,如果关联方流量较大时,当前资源会被限流,2表示设置链路限流,NodeSelectorSlot 中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。这棵树的根节点是一个名字为 machine-root 的虚拟节点,调用链的入口都是这个虚节点的子节点,如果设置了链路限流并指定入口,那么只有指定入口的调用才会记录到限流统计中。
代码
假设Service类有个方法想设置限流,那么可以使用 @SentinelResource(value = "这里填写资源名称")注解进行标识。更多的用法可以参考官方示例。
网友评论