Sentinel 全系列之一 —— Sentinel 流控的配置和使用

  本篇将从最常用的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 源码

地址:github.com/alibaba/Sen…

1.2.2 启动控制台

  sentinel是一个springboot项目,默认的端口是8080,我们可以直接启动:\

账号:sentinel
密码:sentinel

image.png

  控制台页面:

  此时我们的 springboot 会向 dashboard 发送心跳请求并且接收 dashboard 的获取信息请求将机器信息发送给 dashboard 展示,因为我们在这里就可以看到关于每一个客户端的限流相关信息,这里的监控图片是我已经加入限流策略所生成的实时监测图:

image.png

1.2.3 添加限流策略

image.png

  我们在增加规则时要填写目标资源、来源、限流阈值等信息,然后点击新增按钮即可。限流规则默认是保存在本地内存中,这样会导致项目重启后规则消失,我们可以使用 zk 或者 nacos 实现规则持久化存储,这个持久化配置我们待会儿再配。此时我们就可以压测这个请求了,我们可以在实时监控上看到限流详情:

image.png   至此我们的单机限流规则就配置好了,下面将描述集群流控的配置。


2 集群限流

2.1 配置动态规则源

  在集群流控的场景下,我们推荐使用动态规则源来动态地管理规则。这里我使用了 zk 作为储存规则的中间件。如下图所示: image.png

2.1.1 部署 zk

  过程不叙述,大家自行部署。 image.png

2.1.2 配置dashboard

  sentinel官方已经为我们完成了zk的集成,我们只需改改配置什么的就好:

  1. 将集成zk的代码拉至dashboard模块的rule目录下。并把rule下原来的FlowRuleApiProvider和FlowRuleApiPublisher给注释掉。

image.png

image.png

  1. 打开 FlowControllerV2.java,如果你设置的 FlowRuleZookeeperProvider 和 publisher 两个 bean 有名字,可以在 autowired 时指定为你设置的名字,或者用 @Resource。

image.png

  1. 修改 sidebar.html,将原来的 flowV1 改为如图。

image.png

  1. 修改 dashboard 的 pom 文件,把 scope 注释掉

image.png

  1. 修改客户端的 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>
  1. 在客户端修改获取规则的地方为从 zookeeper 获取规则

image.png

@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:

image.png

2.2.5 控制台配置规则,观察效果

image.png 配置规则

image.png 实时监控

注:有关token-server与token-client的使用需根据实际使用情况来改进源码。另外token-server目前存在单点问题,需要个人实现master选举。