本篇将从最常用的Http限流出发,分别从单机流控与集群流控两部分来为大家讲解sentinel限流的使用,源码分析部分请参考Sentinel系列的后续文章。
1.单机限流
1.1 启动一个 springboot 项目
1.1.1 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>//sentinel可以修改限流规则的持久化位置,这里使用了zk来持久保存限流规则,配置规则请跳至本篇 2.1配置动态规则源 查看
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-zookeeper</artifactId>
<version>1.5.2</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
1.1.2 写配置
server:
port: 8081
spring:
application:
name: hello
cloud:
sentinel:
transport:
# 与控制台通讯的端口,默认是8719,不可用会一直+1,知道找到一个可用的
port: 8719
# 控制台的地址
dashboard: localhost:8080
# 让 Sentinel 客户端(orderApi)知道去 zookeeper 中拿配置规则
sentinel:
zookeeper:
address: 127.0.0.1:2181
path: /sentinel_rule_config
1.1.3 新建一个controller
@Controller
@ResponseBody
public class HelloWorld {
@GetMapping("hello")
public String hello(){
return "Hello World!";
}
}
1.2 启动dashboard控制台
1.2.1 在github上拉取 dashboard 源码
1.2.2 启动控制台
sentinel是一个springboot项目,默认的端口是8080,我们可以直接启动:\
账号:sentinel
密码:sentinel
控制台页面:
此时我们的 springboot 会向 dashboard 发送心跳请求并且接收 dashboard 的获取信息请求将机器信息发送给 dashboard 展示,因为我们在这里就可以看到关于每一个客户端的限流相关信息,这里的监控图片是我已经加入限流策略所生成的实时监测图:
1.2.3 添加限流策略
我们在增加规则时要填写目标资源、来源、限流阈值等信息,然后点击新增按钮即可。限流规则默认是保存在本地内存中,这样会导致项目重启后规则消失,我们可以使用 zk 或者 nacos 实现规则持久化存储,这个持久化配置我们待会儿再配。此时我们就可以压测这个请求了,我们可以在实时监控上看到限流详情:
至此我们的单机限流规则就配置好了,下面将描述集群流控的配置。
2 集群限流
2.1 配置动态规则源
在集群流控的场景下,我们推荐使用动态规则源来动态地管理规则。这里我使用了 zk 作为储存规则的中间件。如下图所示:
2.1.1 部署 zk
过程不叙述,大家自行部署。
2.1.2 配置dashboard
sentinel官方已经为我们完成了zk的集成,我们只需改改配置什么的就好:
- 将集成zk的代码拉至dashboard模块的rule目录下。并把rule下原来的FlowRuleApiProvider和FlowRuleApiPublisher给注释掉。
- 打开 FlowControllerV2.java,如果你设置的 FlowRuleZookeeperProvider 和 publisher 两个 bean 有名字,可以在 autowired 时指定为你设置的名字,或者用 @Resource。
- 修改 sidebar.html,将原来的 flowV1 改为如图。
- 修改 dashboard 的 pom 文件,把 scope 注释掉
- 修改客户端的 pom 文件,添加zk依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-zookeeper</artifactId>
<version>1.5.2</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
- 在客户端修改获取规则的地方为从 zookeeper 获取规则
@Component
public class SentinelConfigZookeeper {
@Value("${spring.application.name}")
private String appName;
/**
* 这个 Bean 构造好了之后,马上就取 zookeeper 中读配置规则
*/
@PostConstruct
public void loadRules() {
final String remoteAddress = "127.0.0.1:2181";
final String path = "/sentinel_rule_config/" + appName;
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(remoteAddress, path,
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
}
这样动态规则源就配置ok了。
重新启动dashboard项目,重启客户端。这样dashboard就已经和zookeeper关联起来了,dashboard的操作就由原来的操作客户端的api,变成了操作zookeeper。你所有在dashboard界面上做的配置,都会存储到zookeeper中,并实时推送到客户端。客户端重启后,dashboard不受影响。这样就完成了多实例共享流控规则。
2.2 配置 Token Client 和 Token Server
2.2.1 什么是 Token Client 和 Token Server
- Token Client:集群流控客户端,用于向所属 Token Server 通信请求 token。集群限流服务端会返回给客户端结果,决定是否限流。
- Token Server:即集群流控服务端,处理来自 Token Client 的请求,根据配置的集群规则判断是否应该发放 token(是否允许通过)。
2.2.2 配置限流引入依赖
这里我们结合server和client实现一个嵌入式模式。在pom中同时引入上面的两个依赖。
在单机限流的springboot项目的pom文件中加入client和server的依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-cluster-server-default</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-cluster-client-default</artifactId>
<version>1.8.0</version>
</dependency>
2.2.3 启动测试demo集群
修改VM options配置,启动三个不同端口的测试demo实例即可。
2.2.4 控制台分配 Token Server
当上面的步骤都完成后,我们就可以在 Sentinel 控制台的“集群流控” Token Server 列表页面管理分配 token server 了。假设我们启动了三个应用实例,我们选择一个实例为 token server,其它两个为 token client:
2.2.5 控制台配置规则,观察效果
配置规则
实时监控
注:有关token-server与token-client的使用需根据实际使用情况来改进源码。另外token-server目前存在单点问题,需要个人实现master选举。