Sentinel 源码解析文章以及代码示例
【摘要】 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)