前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sentinel 源码解析文章以及代码示例

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

原创
作者头像
疯狂的KK
发布2023-03-23 12:32:39
1.4K0
发布2023-03-23 12:32:39
举报
文章被收录于专栏:Java项目实战

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

代码语言:txt
复制
├── CollectionUtils
代码语言:txt
复制
├── ConfigUtils
代码语言:txt
复制
├── FunctionUtils
代码语言:txt
复制
├── IpUtils
代码语言:txt
复制
├── ReflectUtil
代码语言:txt
复制
├── StringUtils
代码语言:txt
复制
├── ThreadUtil
代码语言:txt
复制
├── TimeUtil
代码语言:txt
复制
└── UuidUtils

三、Sentinel的代码示例

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

  1. 添加依赖

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

代码语言:txt
复制
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.2</version>
</dependency>
  1. 创建FlowRule

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

代码语言:txt
复制
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. 执行方法

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

代码语言:txt
复制
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的实现原理和代码结构,并提供了相关的代码示例,希望对读者有所帮助。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档