阿里 sentinel —— cluster 模块浅析

本文详细介绍了阿里Sentinel的cluster模块,重点探讨了全局限流的两种策略——阈值均摊和全局阈值,并解析了集群模式的配置,包括独立Server和嵌入Server模式。Sentinel-cluster主要负责在微服务环境中实现多实例的全局限流,通过client向server请求token来统一管理限流策略。

  • 阿里 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());
    

注: server 监听的 namespace 可以和 client 的 namespace 分开,只要保证对应的 flowId 一样就行。这样就可以避

### Sentinel - Cluster Server 部署教程 #### 1. 环境准备 确保已经安装好 Java 运行环境(JDK 1.8 及以上版本),可以通过以下命令检查 Java 版本: ```bash java -version ``` #### 2. 下载 Sentinel Cluster ServerSentinel 的官方 GitHub 仓库(https://github.com/alibaba/Sentinel/releases)下载最新的 Sentinel Cluster Server JAR 包。 #### 3. 配置参数 可以通过命令行参数或者配置文件来配置 Sentinel Cluster Server。常见的配置参数如下: - `csp.sentinel.dashboard.server`:指定 Sentinel 控制台地址。 - `server.port`:指定 Cluster Server 服务端口。 示例启动命令: ```bash java -Dcsp.sentinel.dashboard.server=127.0.0.1:8080 -Dserver.port=8719 -jar sentinel-cluster-server.jar ``` #### 4. 启动服务 在终端中执行上述启动命令,启动 Sentinel Cluster Server。启动成功后,可以在日志中看到服务启动的相关信息。 ### Sentinel - Cluster Client 部署教程 #### 1. 环境准备 同样需要安装好 Java 运行环境(JDK 1.8 及以上版本)。 #### 2. 添加依赖 如果是 Maven 项目,在 `pom.xml` 中添加 Sentinel Cluster Client 依赖: ```xml <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-cluster-client-default</artifactId> <version>x.x.x</version> <!-- 替换为实际版本号 --> </dependency> ``` #### 3. 配置参数 在应用的配置文件(如 `application.properties` 或 `application.yml`)中配置 Cluster Client 相关参数: - `csp.sentinel.cluster.server.host`:指定 Cluster Server 的地址。 - `csp.sentinel.cluster.server.port`:指定 Cluster Server 的端口。 示例 `application.properties` 配置: ```properties csp.sentinel.cluster.server.host=127.0.0.1 csp.sentinel.cluster.server.port=8719 ``` #### 4. 初始化 Cluster Client 在应用启动时,初始化 Sentinel Cluster Client。示例代码如下: ```java import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientAssignConfig; import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfigManager; public class SentinelClusterClientInitializer { public static void init() { ClusterClientAssignConfig assignConfig = new ClusterClientAssignConfig(); assignConfig.setServerHost("127.0.0.1"); assignConfig.setServerPort(8719); ClusterClientConfigManager.applyNewAssignConfig(assignConfig); } } ``` 在应用启动类中调用 `SentinelClusterClientInitializer.init()` 方法。 #### 5. 启动应用 启动应用程序,Cluster Client 会自动连接到 Cluster Server
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值