一个名叫Sentinel-Rules-SDK的组件,使得Sentinel的流控&熔断规则的配置更加方便
原文链接:一个名叫Sentinel-Rules-SDK的组件,使得Sentinel的流控&熔断规则的配置更加方便
1 Sentinel 是什么?
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
2 Sentinel 具有以下特征:
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
好了,其他的就不多做介绍了,大家可以看官网:https://github.com/alibaba/Sentinel/wiki/介绍
3 如何接入 Sentinel
之前我写过一篇文章讲Dubbo如何引入Sentinel做熔断限流,而其中为资源配置限流规则和熔断规则有两种方式:
- 硬代码初始化:我们可以利用 static 静态代码块来初始化,但是如果项目每次要为资源修改规则,就要修改项目代码,然后重新打包部署
- 利用控制台来配置:因为硬代码的不方便,所以一般我们会利用控制台来为资源配置流控和熔断规则。这个只能在项目启动后获取到所有资源,然后一个一个配置,但是这时候如果大流量打过来,就很容易导致系统崩溃。
所以暂时最好的实践就是:硬代码+控制台
在项目启动时,可以利用硬代码先将资源初始化好,接着控制台可以随时调整根据线上的运行情况调整规则。
4 Sentinel-Rules-SDK
但是,在我看来,我还是比较喜欢将初始化规则维护在配置文件中,由配置中心统一管理Sentinel的流控规则和熔断规则。
因为有了上面的实践和思考,所以自己研发了一款简单易用的组件,将资源的流控&熔断规则放在配置文件中。
- 在项目启动时,SDK会读取配置文件中的配置,然后进行 Sentinel 规则的初始化;
- 如果团队还用了 Sentinel 提供的控制台,当带 Sentinel 规则的接口被调用时,就会将所有的限流规则和熔断规则上传到 Sentinel 控制台中;
- 接下来,我们可以在控制台上看实时监控反馈的情况,根据需要来调整流控规则和熔断规则,控制台调整后的规则会同步到项目的内存中。
4.1 使用介绍
引入依赖:
<dependency>
<groupId>com.github.howinfun</groupId>
<artifactId>sentinel-rules-sdk</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
自己在本地拉代码,然后deploy,最后引入依赖
规则配置:
属性基本和Sentinel 提供的 FlowRule 和 DegradeRule 一一对应上,满足基本功能点。
详情看下面例子:
# 开启组件功能
sentinel.rules.enabled=true
# 流控&熔断规则配置
sentinel.rules.flowRuleList[0].resource=sayHello
sentinel.rules.flowRuleList[0].grade=1
sentinel.rules.flowRuleList[0].count=1
sentinel.rules.degradeRuleList[0].resource=sayHello
sentinel.rules.degradeRuleList[0].grade=2
sentinel.rules.degradeRuleList[0].count=1
sentinel.rules.degradeRuleList[0].timeWindow=1
sentinel.rules.degradeRuleList[0].minRequestAmount=1
sentinel.rules.degradeRuleList[0].statIntervalMs=10000
sentinel.rules.flowRuleList[1].resource=sayHi
sentinel.rules.flowRuleList[1].grade=1
sentinel.rules.flowRuleList[1].count=1
sentinel.rules.degradeRuleList[1].resource=sayHi
sentinel.rules.degradeRuleList[1].grade=2
sentinel.rules.degradeRuleList[1].count=1
sentinel.rules.degradeRuleList[1].timeWindow=1
sentinel.rules.degradeRuleList[1].minRequestAmount=1
sentinel.rules.degradeRuleList[1].statIntervalMs=10000
使用介绍已经结束,就是这么简单,毕竟原理其实就是拿到配置的内容,然后进行初始化。下面看看功能是如何实现的。
4.2 实现介绍
核心类有两个:SentinelRulesProperties 和 SentinelRulesGenerateConfig
看名称我们就知道这两个类的功能点了。第一个是属性类,负责读取配置文件中的规则。第二个是配置类,负责初始化流控规则和熔断规则。
SentinelRulesProperties:
SentinelRulesProperties 非常简单,只是利用 @ConfigurationProperties 注解来完成配置规则的注入。
当然了,我们要记得找个地方利用 @EnableConfigurationProperties 将这个属性类加上,不然读取不了配置文件中的规则内容。
/**
* Sentinel规则配置
* @author winfun
* @date 2021/3/4 4:26 下午
**/
@Data
@ConfigurationProperties(prefix = "sentinel.rules")
public class SentinelRulesProperties {
private Boolean enabled;
private List<SentinelFlowRule> flowRuleList;
private List<SentinelDegradeRule> degradeRuleList;
}
SentinelRulesGenerateConfig:
SentinelRulesGenerateConfig 配置类也很简单,主要是利用 Spring 提供的监听器,监听ContextRefreshedEvent事件,即Spring容器初始化完毕,接着利用 ApplicationContext 来获取上面的属性类,然后读取流控规则和熔断规则,最后进行初始化。
/**
* Sentinel规则自动生成配置类
* @author winfun
* @date 2021/3/4 4:29 下午
**/
@Configuration
@ConditionalOnProperty(prefix = "sentinel.rules", name = "enabled", havingValue = "true")
@EnableConfigurationProperties({SentinelRulesProperties.class})
public class SentinelRulesGenerateConfig implements ApplicationListener<ContextRefreshedEvent>, ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
SentinelRulesProperties sentinelRulesProperties =
this.applicationContext.getBean(SentinelRulesProperties.class);
List<SentinelFlowRule> flowRuleList = sentinelRulesProperties.getFlowRuleList();
List<SentinelDegradeRule> degradeRuleList = sentinelRulesProperties.getDegradeRuleList();
final List<FlowRule> flowRules = new ArrayList<>();
final List<DegradeRule> degradeRules = new ArrayList<>();
// 处理流控规则
flowRuleList.forEach(sentinelFlowRule -> {
FlowRule flowRule = new FlowRule();
BeanUtils.copyProperties(sentinelFlowRule,flowRule);
flowRules.add(flowRule);
});
// 处理熔断规则
degradeRuleList.forEach(sentinelDegradeRule -> {
DegradeRule degradeRule = new DegradeRule();
BeanUtils.copyProperties(sentinelDegradeRule,degradeRule);
degradeRules.add(degradeRule);
});
FlowRuleManager.loadRules(flowRules);
DegradeRuleManager.loadRules(degradeRules);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
如果大家对这个组件还感兴趣的话,可以到Github上看看:https://github.com/Howinfun/study-in-work-and-life/tree/master/sentinel-rules-sdk
一个名叫Sentinel-Rules-SDK的组件,使得Sentinel的流控&熔断规则的配置更加方便的更多相关文章
- Sentinel Slot扩展实践-流控熔断预警实现
前言 前几天公司生产环境一个服务由于流量上升触发了 Sentinel 的流控机制,然后用户反馈访问慢,定位发现是 task 定时任务导致,后面 task 优化之后发布,流量恢复正常. 这是一个再正常不 ...
- Sentinel Dashboard(基于1.8.1)流控规则持久化到Nacos——涉及部分Sentinel Dashboard源码改造
前言 之前虽然也一直在使用sentinel实现限流熔断功能,但却没有好好整理之前看的源码与资料,今天有时间将之前自己整理过的资料写成一篇博文,或者是是一篇关于Sentinel(基于目前最近版本1.8, ...
- Sentinel 发布里程碑版本,添加集群流控功能
自去年10月底发布GA版本后,Sentinel在近期发布了另一个里程碑版本v1.4(最新的版本号是v1.4.1),加入了开发者关注的集群流控功能. 集群流控简介 为什么要使用集群流控呢?假设我们希望给 ...
- 2流高手速成记(之八):基于Sentinel实现微服务体系下的限流与熔断
我们接上回 上一篇中,我们进行了简要的微服务实现,也体会到了SpringCloudAlibaba的强大和神奇之处 我们仅改动了两个注释,其他全篇代码不变,原来的独立服务就被我们分为了provider和 ...
- SpringCloud Gateway高阶之Sentinel限流、熔断
前言 为什么需要服务熔断和降级?微服务是当前业界的一大趋势,原理就是将单一职责的功能模块独立化为子服务,降低服务间的耦合,服务间互相调用.但是这样也会出现一些问题: 上图中大量微服务互相调用,存在大量 ...
- 5-4 Sentinel 限流_流控与降级
Sentinel 介绍 什么是Sentinel Sentinel也是Spring Cloud Alibaba的组件 Sentinel英文翻译"哨兵\门卫" 随着微服务的流行,服务和 ...
- Dubbo使用Sentinel来对服务进行降级与限流
一.Sentinel 是什么 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定 ...
- 开发者说:Sentinel 流控功能在 SpringMVC/SpringBoot 上的实践
从用户的视角来感受一个开源项目的成长,是我们推出「开发者说」专栏的初衷,即在开发者进行开源项目选型时,提供更为立体的项目信息.专栏所有内容均来自作者原创/投稿,本文是「开发者说」的第6篇,作者 Jas ...
- Alibaba Sentinel 限流与熔断初探(技巧篇)
目录 1.Sentinel 是什么 ?主要能解决什么问题? 2.限流与熔断的使用场景 3.Sentinel 源码结构 4.在 IntelliJ IDEA 中运行 Sentine Demo 温馨提示:源 ...
随机推荐
- 计量经济学导论10:ARIMA模型
目录 ${\rm ARIMA}$ 模型 滞后算子 ${\rm MA}(q)$ 模型 ${\rm MA}(1)$ 模型 ${\rm MA}(q)$ 模型 ${\rm AR}(p)$ 模型 ${\rm A ...
- npm fetch All In One
npm fetch All In One fetch for TypeScript { "compilerOptions": { "lib": ["D ...
- overwrite & override
overwrite & override explanation https://stackoverflow.com/questions/8651562/overwrite-or-overri ...
- html5 useful skills blogs
html5 useful skills blogs preload & prefetch https://www.30secondsofcode.org/snippet/ary blogs h ...
- NGK生态所即将启程!助力NGK公链建立全方位区块链生态系统!
据NGK官方消息,NGK生态所将暂定于2月15日正式上线.据了解,这是全球首个基于公链打造的生态所,也是NGK生态重要的应用之一. 此前,NGK灵石团队CTO通过多方媒体透露,NGK生态所采用去中心化 ...
- 「NGK每日快讯」11.20日NGK公链第17期官方快讯!
- re模块之简单计算器的实现
本节大纲: 表达式的输入及检查.格式化 怎么样进行匹配最里面的括号以及操作数的匹配 如何实现表达式的四则运算 完整代码展示 在我们学习re模块之后,通常的练习就是利用所学相关知识来写一个计算器 那么, ...
- display: inline、block、inline-block、flex和inline-flex
inline 共享一行 不能修改width.height属性,大小由内容撑开 padding属性 top.right.bottom.left设置都有效:margin属性只有left.right设置有效 ...
- 简单梳理下 Vue3 的新特性
在 Vue3 测试版刚刚发布的时候,我就学习了下 Composition API,但没想到正式版时隔一年多才出来,看了一下发现还是增加了不少新特性的,在这里我就将它们一一梳理一遍. 本文章只详细阐述 ...
- 还原Oracle数据库dmp文件(Win系统)
准备工作: 1.核对数据字符集: 一般Oracle在安装的时候默认是选择ZHS16GBK,如有改动,使用 select userenv('language') from dual;语句查看使用的字 ...