Sentinel 源码解析文章以及代码示例

举报
赵KK日常技术记录 发表于 2023/06/29 23:10:44 2023/06/29
【摘要】 Sentinel是阿里巴巴开源的一款分布式系统的流量控制框架,它基于AOP和注解,提供了流量控制、熔断降级、系统负载保护等功能,可以有效地保护系统的稳定性和可用性。本文将从源码角度分析Sentinel的实现原理和代码结构,并提供相关的代码示例。![请在此添加图片描述](https://developer.qcloudimg.com/http-save/yehe-admin/2402c55cb...
Sentinel是阿里巴巴开源的一款分布式系统的流量控制框架,它基于AOP和注解,提供了流量控制、熔断降级、系统负载保护等功能,可以有效地保护系统的稳定性和可用性。本文将从源码角度分析Sentinel的实现原理和代码结构,并提供相关的代码示例。

![请在此添加图片描述](https://developer.qcloudimg.com/http-save/yehe-admin/2402c55cb7c9fc9caef5e8363de93073.png)

一、Sentinel的基本原理

Sentinel的基本原理是通过拦截器和切面的方式对请求进行拦截和处理,实现流量控制、熔断降级等功能。具体来说,Sentinel主要包括以下几个核心组件:

1. Entry:表示一个请求的入口,它包含了请求的上下文信息和流量控制策略,用于限制请求的流量。
2. Resource:表示一个请求的资源,它可以是一个URL、一个方法、一个服务等等,用于标识请求的类型和范围。
3. Rule:表示一个流量控制规则,包含了资源、流量控制模式、阈值等信息,用于限制请求的流量。
4. SlotChain:表示一个拦截器链,用于对请求进行拦截和处理,包含了各种拦截器和处理器。
5. ProcessorSlot:表示一个拦截器或处理器,用于对请求进行处理和转发,可以实现流量控制、熔断降级等功能。
6. SphU:表示一个入口工具类,用于创建Entry对象和进行流量控制。
7. Tracer:表示一个请求追踪器,用于记录请求的上下文信息和状态。

Sentinel的流程如下:

![请在此添加图片描述](https://developer.qcloudimg.com/http-save/yehe-admin/bcbbfd087f056a898d746265ef374d98.png)

1. 创建Entry:当一个请求进入系统时,通过SphU工具类创建一个Entry对象,该对象包含了请求的上下文信息和流量控制策略。
2. 限流处理:在SlotChain中找到相应的流量控制拦截器,根据规则对请求进行限流处理,如果请求超过了限流阈值,则执行BlockHandler处理器。
3. 熔断降级:在SlotChain中找到相应的熔断降级拦截器,根据规则对请求进行熔断降级处理,如果请求超过了熔断阈值,则执行Fallback处理器。
4. 执行业务逻辑:如果请求通过了限流和熔断降级的处理,则执行相应的业务逻辑。
5. 记录请求状态:在Tracer中记录请求的上下文信息和状态,用于后续的分析和统计。

二、Sentinel的代码结构

Sentinel的代码结构比较清晰,主要包括以下几个模块:

1. sentinel-core:核心模块,包含了Entry、Resource、Rule、SlotChain、ProcessorSlot、SphU等类和接口。

![请在此添加图片描述](https://developer.qcloudimg.com/http-save/yehe-admin/5d5084bf8cf88e71ff9f040af5253bb5.png)

1. sentinel-extension:扩展模块,包含了各种拦截器、处理器、BlockHandler、Fallback等类和接口。
2. sentinel-transport:传输模块,用于实现不同的传输协议,包含了HTTP、Dubbo、gRPC等传输协议的实现。
3. sentinel-dashboard:监控模块,用于实现流量监控和管理,包含了Web界面和REST API接口。

Sentinel的核心代码结构如下:

![请在此添加图片描述](https://developer.qcloudimg.com/http-save/yehe-admin/d2130e2cb838c77f98136d98b7ad9534.png)

sentinel-core

├── entry

│   ├── Entry

│   ├── EntryType

│   ├── Node

│   ├── NodeBuilder

│   ├── ResourceWrapper

│   └── StatisticNode

├── flow

│   ├── FlowRule

│   ├── FlowRuleChecker

│   ├── FlowRuleManager

│   ├── FlowRuleProperty

│   ├── FlowRulePropertyListener

│   ├── FlowRuleProvider

│   ├── FlowRulePublisher

│   ├── FlowRuleZookeeperProvider

│   └── Slot

├── init

│   ├── DefaultSlotChainBuilder

│   ├── SlotChainBuilder

│   └── SlotChainBuilderProvider

├── slot

│   ├── ProcessorSlot

│   ├── SlotChain

│   ├── SlotChainBuilder

│   └── SlotChainBuilderProvider

├── tracing

│   ├── EntryType

│   ├── TraceContext

│   ├── TraceEntry

│   ├── TraceIdGenerator

│   ├── TraceManager

│   ├── Tracer

│   ├── TracerCallback

│   ├── TracerContext

│   ├── TracerSlot

│   └── TracingStatus

├── utils

│   ├── TimeUtil

│   ├── UniqueIdGenerator

│   └── UuidUtil

├── SphU

├── Constants

├── SentinelConfig

├── SentinelContextHolder

├── SentinelProperty

├── SentinelPropertyListener

├── SentinelPropertyRegistry

└── SlotChainProvider

sentinel-extension

├── adapter

│   ├── AbstractCommandHandler

│   ├── CommandConstants

│   ├── CommandHandler

│   ├── CommandHandlerProvider

│   ├── DubboAdapterGlobalConfig

│   ├── DubboConfig

│   ├── DubboUtils

│   ├── EntryWrapper

│   ├── HttpAdapterGlobalConfig

│   ├── HttpCommandHandler

│   ├── HttpInvocation

│   ├── HttpInvocationContext

│   ├── HttpInvocationHandler

│   ├── HttpParamParser

│   ├── HttpResourceWrapper

│   ├── JaxrsResourceWrapper

│   ├── RestTemplateCommandHandler

│   ├── SentinelRpcFilter

│   ├── SentinelRpcProviderFilter

│   ├── SentinelRpcServiceInterceptor

│   ├── SentinelWebFluxFilter

│   ├── SentinelWebFluxProviderFilter

│   ├── SentinelWebFilter

│   ├── SentinelWebProviderFilter

│   ├── SpringMvcAdapterGlobalConfig

│   ├── SpringMvcUtils

│   ├── SpringWebFluxUtils

│   ├── WsResourceWrapper

│   ├── WsSessionContext

│   ├── WsSessionHolder

│   ├── WsSessionStat

│   ├── WsSessionStatCallback

│   └── WsStreamWrapper

├── command

│   ├── AddFlowCommand

│   ├── ClearFlowCommand

│   ├── CommandHandler

│   ├── CommandHandlerProvider

│   ├── CommandRequest

│   ├── CommandResponse

│   ├── CommandUpdateGroup

│   ├── CommandUpdateParamFlowRules

│   ├── CommandUpdateResult

│   ├── CommandUpdateStatInterval

│   ├── CommandUpdateSystemRules

│   ├── CommandUpdateVersion

│   ├── CommandUtils

│   ├── FetchMachineRulesCommand

│   ├── FetchParamFlowRulesCommand

│   ├── FetchRuleCommand

│   ├── FetchSystemRulesCommand

│   ├── RemoveFlowCommand

│   ├── RemoveRuleCommand

│   └── RuleCheckRequest

├── config

│   ├── AbstractConfig

│   ├── AbstractReadableDataSource

│   ├── AbstractWritableDataSource

│   ├── ApolloDataSource

│   ├── ClusterClientConfig

│   ├── ConsulDataSource

│   ├── DataSourceProperties

│   ├── EtcdConfig

│   ├── EtcdDataSource

│   ├── FileRefreshableDataSource

│   ├── FileRefreshableDataSourceProperties

│   ├── FileRefreshableDataSourceRegistry

│   ├── FileRefreshableRuleDataSource

│   ├── HttpDataSource

│   ├── HttpSimpleClient

│   ├── HttpSimpleClientProvider

│   ├── JdbcDataSource

│   ├── NacosDataSource

│   ├── ReadableDataSource

│   ├── ReadableDataSourceRegistry

│   ├── SimpleProperty

│   ├── SimplePropertyListener

│   ├── SimplePropertyRegistry

│   ├── SystemRuleDataSource

│   ├── WritableDataSource

│   └── WritableDataSourceRegistry

├── flow

│   ├── AbstractFlowSlot

│   ├── ClusterBuilderSlot

│   ├── ClusterBuilderSlotChainBuilder

│   ├── ClusterClientConfig

│   ├── ClusterConstants

│   ├── ClusterStateManager

│   ├── Constants

│   ├── ControlBehavior

│   ├── DefaultClusterBuilderSlotChainBuilder

│   ├── DefaultFlowRuleChecker

│   ├── FlowException

│   ├── FlowSlot

│   ├── FlowSlotChainBuilder

│   ├── FlowSlotChainProvider

│   ├── FlowSlotContext

│   ├── FlowSlotUtil

│   ├── FlowStatistic

│   ├── FlowStatisticNode

│   ├── FlowStatisticSlot

│   ├── FlowRule

│   ├── FlowRuleChecker

│   ├── FlowRuleManager

│   ├── FlowRuleProperty

│   ├── FlowRulePropertyListener

│   ├── FlowRuleProvider

│   ├── FlowRulePublisher

│   ├── FlowRuleZookeeperProvider

│   ├── Grade

│   ├── HotParamFlowRuleManager

│   ├── HotParamFlowRuleProperty

│   ├── HotParamFlowRulePropertyListener

│   ├── HotParamFlowRulePublisher

│   ├── HotParamFlowRuleZookeeperProvider

│   ├── ParamFlowRule

│   ├── ParamFlowRuleChecker

│   ├── ParamFlowRuleManager

│   ├── ParamFlowRuleProperty

│   ├── ParamFlowRulePropertyListener

│   ├── ParamFlowRulePublisher

│   ├── ParamFlowRuleZookeeperProvider

│   ├── Slot

│   ├── ThresholdProperty

│   ├── WarmUpProperty

│   ├── WarmUpRule

│   ├── WarmUpRuleManager

│   └── WarmUpRulePropertyListener

├── logger

│   ├── ConsoleLogConfigurator

│   ├── LogBase

│   ├── LoggerFactory

│   ├── SentinelLogger

│   └── SentinelLoggerImpl

├── slot

│   ├── AbstractLinkedProcessorSlot

│   ├── AuthoritySlot

│   ├── AuthoritySlotChainBuilder

│   ├── AuthoritySlotChainProvider

│   ├── DegradeExceptionHandler

│   ├── DegradeExceptionSlot

│   ├── DegradeRule

│   ├── DegradeRuleChecker

│   ├── DegradeRuleManager

│   ├── DegradeRuleProperty

│   ├── DegradeRulePropertyListener

│   ├── DegradeRuleProvider

│   ├── DegradeRulePublisher

│   ├── DegradeRuleZookeeperProvider

│   ├── ExceptionProcessorSlot

│   ├── Slot

│   ├── SlotChain

│   ├── SlotChainBuilder

│   ├── SlotChainBuilderProvider

│   ├── SlotChainProvider

│   ├── StatisticSlot

│   ├── SystemSlot

│   └── SystemSlotChainBuilder

├── stat

│   ├── AbstractStat

│   ├── ClusterClientStat

│   ├── ClusterClientStatCallback

│   ├── ClusterClientStatCallbackRegistry

│   ├── ClusterClientStatException

│   ├── ClusterClientStatExceptionListener

│   ├── ClusterClientStatExceptionPublisher

│   ├── ClusterClientStatExceptionPublisherAutoConfiguration

│   ├── Constants

│   ├── HotSpotParamStat

│   ├── HotSpotParamStatCallback

│   ├── HotSpotParamStatCallbackRegistry

│   ├── HotSpotParamStatException

│   ├── HotSpotParamStatExceptionListener

│   ├── HotSpotParamStatExceptionPublisher

│   ├── HotSpotParamStatExceptionPublisherAutoConfiguration

│   ├── HotSpotParamStatPublisher

│   ├── HotSpotParamStatPublisherAutoConfiguration

│   ├── MetricCallback

│   ├── MetricEvent

│   ├── MetricWriter

│   ├── MetricWriterAutoConfiguration

│   ├── MetricWriterHolder

│   ├── StatCallback

│   ├── StatCallbackRegistry

│   ├── StatException

│   ├── StatExceptionListener

│   ├── StatExceptionPublisher

│   ├── StatExceptionPublisherAutoConfiguration

│   ├── StatFilter

│   ├── StatFilterAutoConfiguration

│   ├── StatPublisher

│   ├── StatPublisherAutoConfiguration

│   ├── StatPublisherHolder

│   ├── StatisticData

│   ├── StatisticFilter

│   ├── StatisticFilterCallback

│   ├── StatisticFilterCallbackRegistry

│   ├── StatisticFilterException

│   ├── StatisticFilterExceptionListener

│   ├── StatisticFilterExceptionPublisher

│   ├── StatisticFilterExceptionPublisherAutoConfiguration

│   ├── StatisticFilterPublisher

│   ├── StatisticFilterPublisherAutoConfiguration

│   ├── StatisticNode

│   ├── StatisticSlot

│   ├── StatisticSlotCallback

│   ├── StatisticSlotCallbackRegistry

│   ├── StatisticSlotException

│   ├── StatisticSlotExceptionListener

│   ├── StatisticSlotExceptionPublisher

│   ├── StatisticSlotExceptionPublisherAutoConfiguration

│   ├── StatisticSlotPublisher

│   ├── StatisticSlotPublisherAutoConfiguration

│   ├── StatisticSummary

│   ├── StatisticSummaryCallback

│   ├── StatisticSummaryCallbackRegistry

│   ├── StatisticSummaryException

│   ├── StatisticSummaryExceptionListener

│   ├── StatisticSummaryExceptionPublisher

│   ├── StatisticSummaryExceptionPublisherAutoConfiguration

│   ├── StatisticSummaryPublisher

│   ├── StatisticSummaryPublisherAutoConfiguration

│   ├── StatisticTask

│   ├── StatisticTaskCallback

│   ├── StatisticTaskCallbackRegistry

│   ├── StatisticTaskException

│   ├── StatisticTaskExceptionListener

│   ├── StatisticTaskExceptionPublisher

│   ├── StatisticTaskExceptionPublisherAutoConfiguration

│   ├── StatisticTaskPublisher

│   ├── StatisticTaskPublisherAutoConfiguration

│   ├── SystemRuleManager

│   └── SystemRulePropertyListener

├── transport

│   ├── AbstractCommandCenter

│   ├── CommandCenter

│   ├── CommandCenterProvider

│   ├── CommandHandler

│   ├── CommandHandlerProvider

│   ├── CommandRequest

│   ├── CommandResponse

│   ├── CommandUpdateGroup

│   ├── CommandUpdateParamFlowRules

│   ├── CommandUpdateResult

│   ├── CommandUpdateStatInterval

│   ├── CommandUpdateSystemRules

│   ├── CommandUpdateVersion

│   ├── CommandUtils

│   ├── HeartbeatSender

│   ├── HeartbeatSenderAutoConfiguration

│   ├── HeartbeatSenderProvider

│   ├── HeartbeatSenderTask

│   ├── HeartbeatSenderTaskCallback

│   ├── HeartbeatSenderTaskCallbackRegistry

│   ├── HeartbeatSenderTaskException

│   ├── HeartbeatSenderTaskExceptionListener

│   ├── HeartbeatSenderTaskExceptionPublisher

│   ├── HeartbeatSenderTaskExceptionPublisherAutoConfiguration

│   ├── HeartbeatSenderTaskPublisher

│   ├── HeartbeatSenderTaskPublisherAutoConfiguration

│   ├── InMemoryCommandCenter

│   ├── InMemoryCommandCenterProvider

│   ├── SentinelApiClient

│   ├── SentinelApiClientProvider

│   ├── SentinelConfig

│   ├── SentinelConfigChangedEvent

│   ├── SentinelConfigProvider

│   ├── SentinelConfigUpdateCallback

│   ├── SentinelConfigUpdateCallbackRegistry

│   ├── SentinelConfigUpdateException

│   ├── SentinelConfigUpdateExceptionListener

│   ├── SentinelConfigUpdateExceptionPublisher

│   ├── SentinelConfigUpdateExceptionPublisherAutoConfiguration

│   ├── SentinelConfigUpdatePublisher

│   ├── SentinelConfigUpdatePublisherAutoConfiguration

│   ├── SentinelConfigWatcher

│   ├── SentinelConfigWatcherAutoConfiguration

│   ├── SentinelConfigWatcherProvider

│   ├── SentinelTransportConfig

│   ├── TransportConfig

│   ├── ZookeeperConfig

│   ├── ZookeeperRegistry

│   ├── ZookeeperRegistryProvider

│   ├── ZookeeperTransportConfig

│   └── ZookeeperUtils

└── utils

```
├── CollectionUtils
```

```
├── ConfigUtils
```

```
├── FunctionUtils
```

```
├── IpUtils
```

```
├── ReflectUtil
```

```
├── StringUtils
```

```
├── ThreadUtil
```

```
├── TimeUtil
```

```
└── UuidUtils
```

三、Sentinel的代码示例

下面是一个简单的Sentinel示例,用于限制某个方法的QPS:

1. 添加依赖

在pom.xml中添加以下依赖:

```
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.2</version>
</dependency>
```

![请在此添加图片描述](https://developer.qcloudimg.com/http-save/yehe-admin/2c6d1dac56c9b407e2f6d74e4db8ba4c.png)

1. 创建FlowRule

在应用启动时,创建一个FlowRule对象,表示对某个方法进行限流控制:

```
FlowRule rule = new FlowRule();
rule.setResource("com.example.service.UserService#getUserById");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(10);
FlowRuleManager.loadRules(Collections.singletonList(rule));
```

1. 执行方法

在业务逻辑中,调用需要限流的方法:

```
public User getUserById(Long id) {
    Entry entry = null;
    try {
        entry = SphU.entry("com.example.service.UserService#getUserById");
        // 执行方法
        ...
    } catch (BlockException e) {
        // 处理限流
        ...
    } finally {
        if (entry != null) {
            entry.exit();
        }
    }
}
```

以上代码将对`com.example.service.UserService#getUserById`方法进行限流,每秒最多只能处理10个请求。

四、总结

Sentinel是一款功能强大的流量控制框架,它通过拦截器和切面的方式实现流量控制、熔断降级等功能,可以有效地保护系统的稳定性和可用性。本文从源码角度分析了Sentinel的实现原理和代码结构,并提供了相关的代码示例,希望对读者有所帮助。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。