Sentinel限流框架的使用

源码解读 Sentinel源码分析

cuishuangtodo

限流功能


中文读作:sin ti nao



技术选型:Sentinel vs Hystrix



【Sentinel(一)】Sentinel介绍与使用


Demo地址

Sentinel默认的日志输出文件位置为:/{username}/logs/csp/

日志格式为:

时间戳 | 该秒发生的第一个资源 | 资源名称,拦截的原因,接口调用来源,| 被拦截资源的调用者,被拦截的数量


启动Sentinel控制台


https://github.com/alibaba/Sentinel/releases下载最新版本的dashboard

切换到该目录下

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard-1.8.4.jar


mvn clean package

用时较长

访问http://localhost:8080/

用户名密码默认都是sentinel

更多可参考 可视化限流管理,Sentinel 控制台启动和接入

也可以在启动时指定:

java -Dsentinel.dashboard.auth.username=cuishuang -Dsentinel.dashboard.auth.password=12345678 -Dserver.servlet.session.timeout=120 -jar sentinel-dashboard-1.8.4.jar &

(刚进来控制台是空白的,需要和第一步中的Spring Boot项目绑定

配置 JVM 启动参数:-Dproject.name=sentinel-demo -Dcsp.sentinel.dashboard.server=127.0.0.1:8080 -Dcsp.sentinel.api.port=8719)

(需要使用Java 1.8版本, 参考切换Java版本)


官方文档: Sentinel: 分布式系统的流量防卫兵

Sentinel 实战-控制台篇


添加流控规则



接口查询规则

运行下面命令,则会返回现有生效的规则:

curl http://localhost:8719/getRules?type=<XXXX>

其中,type有以下取值:

  • flow 以 JSON 格式返回现有的限流规则;
  • degrade 则返回现有生效的降级规则列表;
  • system 则返回系统保护规则。

如:curl http://localhost:8719/getRules\?type\=flow


接口更改规则

curl http://localhost:8719/setRules?type=<XXXX>&data=<DATA>

其中,type 可以输入 flow、degrade 等方式来制定更改的规则种类,data 则是对应的 JSON 格式的规则。

更多可参考 Sentinel 实战-控制台篇


Go版本


Go版本的没有Dashboard

issues/421

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 tree -L 1
.
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── api
├── core
├── dump.rdb
├── example
├── exporter
├── ext
├── go.mod
├── go.sum
├── logging
├── pkg
├── tests
└── util

api:对外暴露的接口
core:核心实现
example:使用例子
exporter:Prometheus的exporter
ext:扩展接口,主要是动态规则配置中心扩展接口
logging:日志模块
pkg:第三方插件的实现,比如各个组件适用 Sentinel 的 adapter,以及 Sentinel 对接各种第三方配置中心的扩展实现
tests:测试类代码,包括单元测试、benchmark
util:工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main

import (
"fmt"
sentinel "github.com/alibaba/sentinel-golang/api"
"github.com/alibaba/sentinel-golang/core/base"
"github.com/alibaba/sentinel-golang/core/flow"
"sync"
)

func main() {

if err := sentinel.InitDefault(); err != nil {
fmt.Println("初始化失败")
panic(err.Error())
}

// 资源名
resource := "getRoomInfoHistory"

// 加载流控规则,写死
_, err := flow.LoadRules([]*flow.Rule{
{
Resource: resource,
// Threshold + StatIntervalInMs 可组合出多长时间限制通过多少请求,这里相当于限制为 10 qps;
// 即1000ms内,最多允许10个请求
Threshold: 10,
StatIntervalInMs: 1000,
// 后面两个参数暂时不用关注
TokenCalculateStrategy: flow.Direct,
ControlBehavior: flow.Reject,
},
})

if err != nil {
fmt.Println("加载流控规则失败")
panic(err.Error())
}

// 进行测试:

currency := 100

var wg sync.WaitGroup

wg.Add(currency)
for i := 0; i < currency; i++ {

go func() {
e, b := sentinel.Entry(resource, sentinel.WithResourceType(base.ResourceType(base.Inbound)))
if b != nil {
// 被流控
fmt.Printf("被流控: %s \n", b.BlockMsg())
} else {
// 通过
fmt.Println("放行: pass...")
// 通过后必须调用Exit
e.Exit()

}
wg.Done()
}()

}

wg.Wait()
fmt.Println("请求结束")

}

Sentinel-Go 源码系列(一)|开篇

https://blog.csdn.net/u010853261/article/details/108787189

https://www.jianshu.com/p/c369603a00d6

Sentinel-Go 是基于 LeapArray 实现的滑动窗口算法

https://www.jianshu.com/p/e563e796ad67

https://blog.csdn.net/jike11231/article/details/123019283

Sentinel Go -API 使用指南



微服务怎么限流?算法+框架+实战!