Sentinel(六)之集群流控

转载自  集群流控

介绍

为什么要使用集群流控呢?假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50,但机器数可能很多(比如有 100 台)。这时候我们很自然地就想到,找一个 server 来专门来统计总的调用量,其它的实例都与这台 server 通信来判断是否可以调用。这就是最基础的集群流控的方式。

另外集群流控还可以解决流量不均匀导致总体限流效果不佳的问题。假设集群中有 10 台机器,我们给每台机器设置单机限流阈值为 10 QPS,理想情况下整个集群的限流阈值就为 100 QPS。不过实际情况下流量到每台机器可能会不均匀,会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机维度去限制的话会无法精确地限制总体流量。而集群流控可以精确地控制整个集群的调用总量,结合单机限流兜底,可以更好地发挥流量控制的效果。

集群流控中共有两种身份:

  • Token Client:集群流控客户端,用于向所属 Token Server 通信请求 token。集群限流服务端会返回给客户端结果,决定是否限流。
  • Token Server:即集群流控服务端,处理来自 Token Client 的请求,根据配置的集群规则判断是否应该发放 token(是否允许通过)。

模块结构

Sentinel 1.4.0 开始引入了集群流控模块,主要包含以下几部分:

  • sentinel-cluster-common-default: 公共模块,包含公共接口和实体
  • sentinel-cluster-client-default: 默认集群流控 client 模块,使用 Netty 进行通信,提供接口方便序列化协议扩展
  • sentinel-cluster-server-default: 默认集群流控 server 模块,使用 Netty 进行通信,提供接口方便序列化协议扩展;同时提供扩展接口对接规则判断的具体实现(TokenService),默认实现是复用 sentinel-core 的相关逻辑

集群流控规则

规则

FlowRule 添加了两个字段用于集群限流相关配置:

private boolean clusterMode; // 标识是否为集群限流配置
private ClusterFlowConfig clusterConfig; // 集群限流相关配置项

其中 用一个专门的 ClusterFlowConfig 代表集群限流相关配置项,以与现有规则配置项分开:

// (必需)全局唯一的规则 ID,由集群限流管控端分配.
private Long flowId;// 阈值模式,默认(0)为单机均摊,1 为全局阈值.
private int thresholdType = ClusterRuleConstant.FLOW_THRESHOLD_AVG_LOCAL;private int strategy = ClusterRuleConstant.FLOW_CLUSTER_STRATEGY_NORMAL;// 在 client 连接失败或通信失败时,是否退化到本地的限流模式
private boolean fallbackToLocalWhenFail = true;
  • flowId 代表全局唯一的规则 ID,Sentinel 集群限流服务端通过此 ID 来区分各个规则,因此务必保持全局唯一。一般 flowId 由统一的管控端进行分配,或写入至 DB 时生成。
  • thresholdType 代表集群限流阈值模式。其中单机均摊模式下配置的阈值等同于单机能够承受的限额,token server 会根据客户端对应的 namespace(默认为 project.name 定义的应用名)下的连接数来计算总的阈值(比如独立模式下有 3 个 client 连接到了 token server,然后配的单机均摊阈值为 10,则计算出的集群总量就为 30);而全局模式下配置的阈值等同于整个集群的总阈值

ParamFlowRule 热点参数限流相关的集群配置与 FlowRule 相似。

集群规则配置方式

在集群流控的场景下,我们推荐使用动态规则源来动态地管理规则。

对于客户端,我们可以按照原有的方式来向 FlowRuleManager 和 ParamFlowRuleManager 注册动态规则源,例如:

ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId, parser);
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

对于集群流控 token server,由于集群限流服务端有作用域(namespace)的概念,因此我们需要注册一个自动根据 namespace 生成动态规则源的 PropertySupplier:

// Supplier 类型:接受 namespace,返回生成的动态规则源,类型为 SentinelProperty<List<FlowRule>>
// ClusterFlowRuleManager 针对集群限流规则,ClusterParamFlowRuleManager 针对集群热点规则,配置方式类似
ClusterFlowRuleManager.setPropertySupplier(namespace -> {return new SomeDataSource(namespace).getProperty();
});

然后每当集群限流服务端 namespace set 产生变更时,Sentinel 会自动针对新加入的 namespace 生成动态规则源并进行自动监听,并删除旧的不需要的规则源。

集群限流客户端

要想使用集群限流功能,必须引入集群限流 client 相关依赖:

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-cluster-client-default</artifactId><version>1.8.0</version>
</dependency>

用户可以通过 API 将当前模式置为客户端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

或者通过 ClusterStateManager API 手动指定模式:

// 指定当前身份为 Token Client
ClusterStateManager.applyState(ClusterStateManager.CLUSTER_CLIENT);

其中 mode 为 0 代表 client(ClusterStateManager.CLUSTER_CLIENT),1 代表 server。设置成功后,若已有客户端的配置,集群限流客户端将会开启并连接远程的 token server。我们可以在 ~/logs/csp/sentinel-record.log 日志中查看连接的相关日志。

若集群限流客户端未进行配置,则用户需要对客户端进行基本的配置,比如指定集群限流 token server。我们提供了 API 进行配置:

http://<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的配置项:

  • serverHost: token server host
  • serverPort: token server 端口
  • requestTimeout: 请求的超时时间(默认为 20 ms)

当然也可以通过动态配置源进行配置。集群限流 token client 共有两种配置:

  • 客户端分配配置(ClusterClientAssignConfig),包括要连接的对端 token server 地址等相关信息。我们可以通过 ClusterClientConfigManager 的 registerServerAssignProperty 方法注册动态配置源。分配配置通常通过统一的分配表解析而来,可以参考 embedded 模式 demo。
  • 客户端通信配置(ClusterClientConfig),包括通信的超时时长等配置。我们可以通过 ClusterClientConfigManager 的 registerClientConfigProperty 方法注册动态配置源。

配置源注册的相关逻辑可以置于 InitFunc 实现类中,并通过 SPI 注册,在 Sentinel 初始化时即可自动进行配置源加载监听。

若用户未引入集群限流 client 相关依赖,或者 client 未开启/连接失败/通信失败,则对于开启了集群模式的规则:

  • 集群热点限流默认直接通过
  • 普通集群限流会退化到 local 模式的限流,即在本地按照单机阈值执行限流检查

当 token client 与 server 之间的连接意外断开时,token client 会不断进行重试,每次重试的间隔时间以 n * 2000 ms 的形式递增。

集群限流服务端

要想使用集群限流服务端,必须引入集群限流 server 相关依赖:

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-cluster-server-default</artifactId><version>1.8.0</version>
</dependency>

启动方式

Sentinel 集群限流服务端有两种启动方式:

  • 独立模式(Alone),即作为独立的 token server 进程启动,独立部署,隔离性好,但是需要额外的部署操作。独立模式适合作为 Global Rate Limiter 给集群提供流控服务。

image

  • 嵌入模式(Embedded),即作为内置的 token server 与服务在同一进程中启动。在此模式下,集群中各个实例都是对等的,token server 和 client 可以随时进行转变,因此无需单独部署,灵活性比较好。但是隔离性不佳,需要限制 token server 的总 QPS,防止影响应用本身。嵌入模式适合某个应用集群内部的流控。

image

我们提供了 HTTP API 用于在 embedded 模式下转换集群流控身份:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 为 0 代表 client,1 代表 server,-1 代表关闭。注意应用端需要引入集群限流客户端或服务端的相应依赖。

在独立模式下,我们可以直接创建对应的 ClusterTokenServer 实例并在 main 函数中通过 start 方法启动 Token Server。

规则配置

见前面 规则配置 相关内容。

属性配置

我们推荐给集群限流服务端注册动态配置源来动态地进行配置。配置类型有以下几种:

  • namespace set: 集群限流服务端的作用域(命名空间),用于指定该 token server 可以服务哪些应用或分组,嵌入模式下可以设置为自己的应用名。集群限流 client 在连接到 token server 后会上报自己的命名空间(默认为 project.name 配置的应用名),token server 会根据上报的命名空间名称统计连接数。
  • transport config: 集群限流服务端通信相关配置,如 server port
  • flow config: 集群限流服务端限流相关配置,如滑动窗口统计时长、格子数目、最大允许总 QPS等

我们可以通过 ClusterServerConfigManager 的各个 registerXxxProperty 方法来注册相关的配置源。

从 1.4.1 版本开始,Sentinel 支持给 token server 配置最大允许的总 QPS(maxAllowedQps),用于对 Token Server 的资源使用进行限制,防止在嵌入模式下影响应用本身。

Token Server 分配配置

image

示例

sentinel-demo-cluster 提供了嵌入模式和独立模式的示例:

  • sentinel-demo-cluster-server-alone:独立模式 Demo
  • sentinel-demo-cluster-embedded:嵌入模式 Demo,以 Web 应用为示例,可以启动多个实例分别作为 Token Server 和 Token Client。数据源的相关配置可以参考 DemoClusterInitFunc。

注意:若在本地启动多个 Demo 示例,需要加上 -Dcsp.sentinel.log.use.pid=true 参数,否则控制台显示监控会不准确。

集群限流控制台

使用集群限流功能需要对 Sentinel 控制台进行相关的改造,推送规则时直接推送至配置中心,接入端引入 push 模式的动态数据源。可以参考 Sentinel 控制台(集群流控管理文档)。

同时云上版本 AHAS Sentinel 提供开箱即用的全自动托管集群流控能力,无需手动指定/分配 token server 以及管理连接状态,同时支持分钟小时级别流控、大流量低延时场景流控场景,同时支持 Istio/Envoy 场景的 Mesh 流控能力。

其它

若在生产环境使用集群限流,管控端还需要关注以下的问题:

  • Token Server 自动管理、调度(分配/选举 Token Server)
  • Token Server 高可用,在某个 server 不可用时自动 failover 到其它机器

集群流控日志

  • ${log_dir}/sentinel-cluster-client.log:Token Client 日志,会记录请求失败的信息

扩展接口设计

整体扩展架构

overview-arch

通用扩展接口

以下通用接口位于 sentinel-core 中:

  • TokenService: 集群限流功能接口,server / client 均可复用
  • ClusterTokenClient: 集群限流功能客户端
  • ClusterTokenServer: 集群限流服务端接口
  • EmbeddedClusterTokenServer: 集群限流服务端接口(embedded 模式)

以下通用接口位于 sentinel-cluster-common-default:

  • EntityWriter
  • EntityDecoder

Client 扩展接口

集群流控 Client 端通信相关扩展接口:

  • ClusterTransportClient:集群限流通信客户端
  • RequestEntityWriter
  • ResponseEntityDecoder

Server 扩展接口

集群流控 Server 端通信相关扩展接口:

  • ResponseEntityWriter
  • RequestEntityDecoder

集群流控 Server 端请求处理扩展接口:

  • RequestProcessor: 请求处理接口 (request -> response)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P4597-序列sequence【堆】

正题 题目链接:https://www.luogu.org/problemnew/show/P4597 题目大意 一个长度为nnn的序列&#xff0c;每次可以将一个数111或−1-1−1。要求 变成一个非降序列出现的数之前都在原序列 解题思路 我们考虑一下贪心&#xff0c;由于变成一个非降序列&#xff0c;所以肯定越…

Mybatis-Plus基本

Data AllArgsConstructor//全参构造 NoArgsConstructor//无参构造 Accessors(chain true)//链表模式 TableName("User")//映射数据表名 public class User implements Serializable {//序列化传输保证数据完整TableId(type IdType.UUID)//设定主键自增private Inte…

Sentinel(七)之网关限流

转载自 网关限流 Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块&#xff0c;此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑&#xff1a; GatewayFlowRule&…

P1941-飞扬的小鸟【dp】

正题 题目链接:https://www.luogu.org/problemnew/show/P1941 题目大意 n∗mn*mn∗m的场地&#xff0c;一只鸟&#xff0c;在iii格点击一次升XiX_iXi​格(可以点击多次)&#xff0c;不点击掉YiY_iYi​格。不能落地&#xff0c;最高mmm格&#xff0c;然后不能撞到地图上的一些管…

C# 7编程模式与实践

C# 7是一个重大更新&#xff0c;其中提供了很多有意思的新功能。虽然已有大量的文章介绍这些功能可以做什么&#xff0c;但是鲜有文章介绍应如何使用这些功能。本文将过一遍《.NET设计规范&#xff1a;.NET约定惯用法与模式》&#xff08;译者注&#xff1a;英文书名为“Framew…

过来瞅瞅学学

当需要对Date时间类型进行加减int类型分钟运算 Date date new Date();//Sun Mar 06 14:12:14 CST 2022int hour 25;int minutes 70;int second 3;SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(simpleDat…

Sentinel(八)之熔断降级

转载自 熔断降级 概述 除了流量控制以外&#xff0c;对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块&#xff0c;可能是另外的一个远程服务、数据库&#xff0c;或者第三方 API 等。例如&#xff0c;支付的时候&#xff0c…

P4719-[模板]动态DP【矩阵乘法,树链剖分,线段树】

正题 题目链接:https://www.luogu.org/problemnew/show/P4719\texttt{https://www.luogu.org/problemnew/show/P4719}https://www.luogu.org/problemnew/show/P4719 题目大意 每次修改一个点权&#xff0c;求最大权独立集。 解题思路 首先考虑普通dpdpdp&#xff0c;设fi,0/…

.net的retrofit--WebApiClient底层篇

前言本篇文章的内容是WebApiClient底层说明&#xff0c;也是WebApiClient系列接近尾声的一篇文章&#xff0c;如果你没有阅读过之前的的相关文章&#xff0c;可能会觉得本文章的内容断层库简介WebApiClient是开源在github上的一个httpClient客户端库&#xff0c;内部基于HttpCl…

悲观锁和乐观锁

悲观锁 悲观&#xff0c;则会假设情况总是最坏的&#xff0c;即共同维护的数据总会被其他线程修改&#xff0c;所以每次取数据的时候都会上锁&#xff0c;避免其他人修改。 synchronized 关键字的实现也是悲观锁。 悲观锁的缺点 在多线程竞争下&#xff0c;加锁、释放锁会导致…

Sentinel(九)之热点参数限流

转载自 热点参数限流 Overview 何为热点&#xff1f;热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据&#xff0c;并对其访问进行限制。比如&#xff1a; 商品 ID 为参数&#xff0c;统计一段时间内最常购买的商品 ID 并进行限制用户 …

jzoj3318-[BOI2013]Brunhilda的生日【数论】

正题 题目大意 序列aaa有mmm个质数。然后询问一个数nnn&#xff0c;每次可以使nn−n%ainn-n\%a_{i}nn−n%ai​ 求最少操作次数。 解题思路 首先我们设fif_ifi​表示由iii变为0的最少次数&#xff0c;然后有动态转移fimin{fi−i%aj}1f_imin\{f_{i-i\%a_j}\}1fi​min{fi−i%aj​…

【直播 】ASP.NET Core解密底层设计逻辑

.NET社区新闻&#xff0c;深度好文&#xff0c;欢迎访问公众号文章汇总 http://www.csharpkit.com

Sentinel(十)之系统自适应限流

转载自 系统自适应限流 Sentinel 系统自适应限流从整体维度对应用入口流量进行控制&#xff0c;结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标&#xff0c;通过自适应的流控策略&#xff0c;让系统的入口流量和系统的负载达到一个平…

jzoj3319-[BOI2013]雪地踪迹【bfs】

正题 题目大意 一个n∗mn*mn∗m的雪地&#xff0c;有两种动物RRR和FFF会在雪地上留下RRR和FFF的脚印(只可以走到相邻格子&#xff0c;从(1,1)(1,1)(1,1)进入(n,m)(n,m)(n,m)出来&#xff0c;且会覆盖掉原先的脚印)。 求至少有多少只动物经过 解题思路 首先我们知道(1,1)(1,1…

如何ASP.NET Core Razor中处理Ajax请求

在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过。今天闲来无事,准备用Rozor做个项目熟练下,结果写第一个页面就卡住了。。折腾半天才搞好,下面给大家分享下解决方案。先来给大家简单介绍下RazorRazor Pages是ASP.NET Core的一项新功能&am…

Sentinel(十一)之黑白名单控制

转载自 黑白名单控制 很多时候&#xff0c;我们需要根据调用来源来判断该次请求是否允许放行&#xff0c;这时候可以使用 Sentinel 的来源访问控制&#xff08;黑白名单控制&#xff09;的功能。来源访问控制根据资源的请求来源&#xff08;origin&#xff09;限制资源是否通…

Loj2687,jzoj3320-文本编辑器【线头dp】

正题 题目链接:https://loj.ac/problem/2687 题目大意 三个操作: hhh光标向前移动一格xxx删除光标处字母fcf\ cf c移动到下一个字符ccc(算两次操作) 然后fff操作不能对字符eee使用&#xff0c;然后求最少操作次数删除所有的eee。 解题思路 线头dpdpdp。 设fi,jf_{i,j}fi,j​…

小白带你入坑xamarin系列之环境搭建和准备

序言&#xff1a;移动端的跨平台百花齐放&#xff0c;各种技术方案和方法都是层出不穷。目前xamarin确实是一套成熟可靠&#xff0c;完全值得信赖的开发框架。尤其是对传统做WPF ASP.NET的开发团队来说要节约成本开始移动端开发。这个是很好的一个选项。开始之前回答2个问题。1…

P3402-[模板]可持久化并查集【主席树】

正题 题目链接:https://www.luogu.org/problemnew/show/P3402 题目大意 合并x,yx,yx,y所在的两个集合回到操作kkk之后询问x,yx,yx,y是否在同一个集合 解题思路 正常的并查集&#xff0c;不使用路径压缩&#xff0c;但是使用按秩合并&#xff0c;将深度小的合并到深度大的上面…