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

举报
赵KK日常技术记录 发表于 2023/06/24 19:59:55 2023/06/24
【摘要】 Sentinel是阿里巴巴开源的一款分布式系统的流量控制框架,它基于AOP和注解,提供了流量控制、熔断降级、系统负载保护等功能,可以有效地保护系统的稳定性和可用性。本文将从源码角度分析Sentinel的实现原理和代码结构,并提供相关的代码示例。添加描述一、Sentinel的基本原理Sentinel的基本原理是通过拦截器和切面的方式对请求进行拦截和处理,实现流量控制、熔断降级等功能。具体来说,...
Sentinel是阿里巴巴开源的一款分布式系统的流量控制框架,它基于AOP和注解,提供了流量控制、熔断降级、系统负载保护等功能,可以有效地保护系统的稳定性和可用性。本文将从源码角度分析Sentinel的实现原理和代码结构,并提供相关的代码示例。


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

添加描述
  1. 创建Entry:当一个请求进入系统时,通过SphU工具类创建一个Entry对象,该对象包含了请求的上下文信息和流量控制策略。
  2. 限流处理:在SlotChain中找到相应的流量控制拦截器,根据规则对请求进行限流处理,如果请求超过了限流阈值,则执行BlockHandler处理器。
  3. 熔断降级:在SlotChain中找到相应的熔断降级拦截器,根据规则对请求进行熔断降级处理,如果请求超过了熔断阈值,则执行Fallback处理器。
  4. 执行业务逻辑:如果请求通过了限流和熔断降级的处理,则执行相应的业务逻辑。
  5. 记录请求状态:在Tracer中记录请求的上下文信息和状态,用于后续的分析和统计。
二、Sentinel的代码结构
Sentinel的代码结构比较清晰,主要包括以下几个模块:
  1. sentinel-core:核心模块,包含了Entry、Resource、Rule、SlotChain、ProcessorSlot、SphU等类和接口。

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

添加描述
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>

添加描述
  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个月内不可修改。