文章目录
- 在 阿里 sentinel —— core 模块浅析 一文中介绍了 sentinel 组件的功能和一些核心概念,项目中只需依赖 sentinel-core 模块便可实现单体应用的限流、熔断等核心功能
- 本文介绍 seninel-cluster 模块,主要介绍它的功能及应用
1 sentinel-cluster 模块的作用
- sentinel-cluster 主要提供微服务中一个应用部署多个实例的全局限流功能(只提供 qps 限流)
- 开启全局限流模式后,client 会向 server 请求 token,限流功能统一有 server 来管理
- server 端提供了两种全局限流策略,每种策略对应一种情景的解决
- 通过 设置 FlowRule.clusterMode = true 对某个资源开启 cluster 模式,默认为 local 模式
2 全局限流中两种策略讨论
- 通过 设置 FlowRule.clusterConfig.thresholdType = 1 对某个资源开启 全局阈值 策略,默认为 阈值均摊 策略
2.1 阈值均摊策略
- cluster 模式下,设置 阈值均摊 策略后,全局 qps 的值为:n * v,n 为实例数,v 为资源对应的 qps 阈值
- 解决的情景:local 模式下,多实例中,请求分布不均导致的全局通过流量低于多实例总体的总值
2.2 全局阈值策略
-
cluster 模式下,设置 全局阈值 策略后,全局的 qps 为定值:v,为资源对应的 qps 阈值
-
解决的情景:local 模式或 cluster 阈值均摊模式下,随着应用实例的增加,全局 qps 也会不断提高,这样可能会导致应用的下游(如数据库)承担不了太多请求
3 cluster 模式配置
- cluster 模式又可按 server 的性质分为 独立 server 模式、嵌入 server 模式
- 独立 server 模式:server 只用来管理 client 端来的 token 请求,可以管理多个应用
- 嵌入 server 模式:server 端是一个应用中多个实例的一个,可以方便的切换 server,但只能管理它对应的应用,耦合性高
3.1 独立 server 模式
1 server 需要监听如下几个配置
-
namespaceSet: 一般每个应用对应一个 namespace,server 需要监听它管理的所有应用
- namespaceSet 初始化的时候,会去注册每个 namespace 对应的 flowRules 和 paramFlowRules 的监听。注册的关键是:ClusterFlowRuleManager.propertySupplier 属性
- 所以,需要在 namespaceSet 监听前,设置 ClusterFlowRuleManager.propertySupplier 属性
//setPropertySupplier 要在 registerNamespaceSetProperty 之前 ClusterFlowRuleManager.setPropertySupplier(namespace -> { ReadableDataSource<String, List<FlowRule>> ds = 配置远端数据源(namespace); return ds.getProperty(); });// 同理 paramFlowRules ReadableDataSource<String, Set<String>> namespaceDs = 配置远端数据源; ClusterServerConfigManager.registerNamespaceSetProperty(namespaceDs.getProperty());
-
ServerTransportConfig
- port:设置 server 端接收 client 端 token 的端口
- idleSeconds:设置服务端定期断开客户端闲置超过 idleSeconds 的连接
- 只有 port 改变时,才会重启服务
ReadableDataSource<String, ServerTransportConfig> transportConfigDs = 配置远端数据源; ClusterServerConfigManager.registerServerTransportProperty(transportConfigDs.getProperty());
-
ServerFlowConfig
- maxAllowedQps:服务端最大 qps,为了保护服务端,默认为 30000
- exceedCount:这个参数乘以 全局阈值,才是正真的全局阈值,默认为 1.0
- maxOccupyRatio:和流量整型模式中的等待请求数有关吧,默认为 1.0
- intervalMs/sampleCount:窗口大小/窗口的桶个数,用于统计,默认为1000/10
ReadableDataSource<String, ServerFlowConfig> ServerFlowConfigs = 配置远端数据源; ClusterServerConfigManager.registerGlobalServerFlowProperty(ServerFlowConfigs.getProperty())