sentinel的使用
架构方式
Sentinel dashboard改造
默认是支持单机,现在需要改造成集群配置方式。
页面controller改造
将test下的nacos文件夹复制到包rule下
启用类:FlowControllerV2
provider注入
1 | @Autowired |
前端页面sidebar替换
app.js
1 | .state('dashboard.flow', { |
配置改造
追加nacos配置
1 | server.port=8091 |
nacos集群部署
- 追加配置
distribution 下的resource配置
1 | db.num=1 |
cluster.conf
1 | 10.59.118.126:8848 |
编译
1
$ mvn -Prelease-nacos -DskipTests clean install -
启动
1 | $NACOS_HOME/bin/startup.sh |
支付平台配置改造
Web项目
引入包:
1 | <dependency> |
- 追加nacos配置
1 | ###限流配置### |
- 追加拦截器
SentinelFilter1
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
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest sRequest = (HttpServletRequest)request;
Entry entry = null;
try {
// 根据请求生成的资源
String target = FilterUtil.filterTarget(sRequest);
if (!target.startsWith("/admin")) {
target = WebCallbackManager.getUrlCleaner().clean(target);
entry = SphU.entry(target, EntryType.IN, 1);
}
// 如果能成功“申请”到资源,则说明未被限流
// 则将请求放行
chain.doFilter(request, response);
} catch (BlockException e) {
// 否则如果捕获了BlockException异常,说明请求被限流了
// 则将请求重定向到一个默认的页面
//System.out.println("触发限流规则");
throw new RuntimeException("触发限流规则");
} catch (IOException e2) {
// 省略部分代码
} finally {
if (entry != null) {
entry.exit();
}
}
}
监听 nacos配置变更
1 | private void initSentinalClusterClientConfig() { |
启动
启动加入:
1 | -Dcsp.sentinel.dashboard.server=10.5.32.97:8091 -Dproject.name=littlehui-17pay |
遇到的坑
sentinel配置的限流规则。来源app字段limitApp指的是请求来源,常用default,如果指定app那么非app来源的请求获取不到rule列表。
sentinel客户端不支持nacos的命名空间配置,所以用的是默认的public空间。
附件
源码
nacos-1.0.0-RC3源码
sentinel-1.6.0源码
文档索引
【流量控制系列1】引言和索引
【流量控制系列2】流量控制的基础方法和算法
【流量控制系列3】Semaphore信号量介绍
【流量控制系列4】Sentinel和Hystrix对比
【流量控制系列5】Sentinel 详细介绍
【流量控制系列6】Sentinel 详细介绍-SlotChain源码解析
【流量控制系列7】Sentinel实践
测试评论