深入剖析阿里sentinel源码,看这篇就够了

本文深入剖析阿里Sentinel的源码,涵盖流控降级监控、规则动态更新、自定义链路构建等方面。通过实例分析,解释了Sentinel如何通过Socket进行规则通知,如何检查流量规则以及熔断降级的判断机制。此外,还讨论了Sentinel的初始化过程、注解实现熔断降级以及不同流控模式的适用场景,为理解和使用Sentinel提供了深入见解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1. 引言

  • 昨天已经把sentinel成功部署到线上环境,可参考我上篇博文,该走的坑也都走了一遍,已经可以初步使用它的限流和降级功能,根据我目前的实践,限流和降级规则似乎不能一同起效,还不知道原因,下面继续探索

1.2. 源码

1.2.1. 流控降级监控等的构建

  • 首先客户端而言,我关注的是我写的代码SphU.entry,这明显是很关键的方法,下图的内容就是这里构建的
  • -Sentinel工作主流程就包含在上面一个方法里,通过链式调用的方式,经过了建立树状结构,保存统计簇点,异常日志记录,实时数据统计,负载保护,权限认证,流量控制,熔断降级等Slot

深入剖析阿里sentinel源码,看这篇就够了

 

  • 进入链式方法的入口为CtSph类,try方法大括号内
Entry e = new CtEntry(resourceWrapper, chain, context);
 try {
 chain.entry(context, resourceWrapper, null, count, prioritized, args);
 } catch (BlockException e1) {
 e.exit(count, args);
 throw e1;
 } catch (Throwable e1) {
 // This should not happen, unless there are errors existing in Sentinel internal.
 RecordLog.info("Sentinel unexpected exception", e1);
 }

1.2.2. 修改控制台规则是如何通知客户端的?

  • 看sentinel-transport-simple-http包中的HttpEventTask类,它开启了一个线程,转么用来做为socket连接,控制台通过socket请求通知客户端,从而更新客户端规则,更改规则核心代码如下
// Find the matching command handler.
 CommandHandler<?> commandHandler = SimpleHttpCommandCenter.getHandler(commandName);
 if (commandHandler != null) {
 CommandResponse<?> response = commandHandler.handle(request);
 handleResponse(response, printWriter, outputStream);
 } else {
 // No matching command handler.
 badRequest(printWriter, "Unknown command `" + commandName + '`');
 }

通过命令模式,commandName为setRules时,更新规则

1.2.3. 既然它建立连接用的socket,为什么不用netty呢?

  • 带着这个疑问,我本想在issues里找下,突然发现它的源码中有个sentinel-transport-netty-http这个包和sentinel-transport-simple-http处于同级,官方的例子用的simple-http,但明显它也准备了netty-http,于是我替换成了netty-http,运行后效果和原先一样,至于效率上有没有提升,我就不清楚了^_^

1.2.4. 流量规则如何检查?

  • 该规则检查类为FlowRuleChecker,在core核心包中,核心检查方法如下
 private static boolean passLocalCheck(FlowRule rule, Context context, DefaultNode node, int acquireCount,
 boolean prioriti
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值