Sentinel
介绍
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
基本概念
资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
熔断降级
什么是熔断降级
除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。这个问题和 Hystrix 里面描述的问题是一样的。
Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。
demo快速入门
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// Set limit QPS to 20.
rule.setCount(20);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
public static void main(String[] args) {
// 配置规则.
initFlowRules();
while (true) {
// 1.5.0 版本开始可以直接利用 try-with-resources 特性
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("hello world");
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("blocked!");
}
}
}
结合项目
目标
-
本次项目用Sentinel目标主要是进行熔断。
-
由于Sentinel的规则是应用在内存中无法持久化,因此可以弃用sentinel自带的dashboard页面,自己开发一个页面进行规则配置;选取数据源一般有两种,分别是配置中心(如nacos)和数据库(mysql)。
-
一般熔断是指针对调用其他服务的时候,进行熔断,如果调用非java服务我们一般使用HttpClient,而Sentinel也适配了HttpClient,我们只要稍微修改,因此目的就是适配HttpClient。
设计
- 由一个服务专门用来写规则数据到数据库,添加增删改查的接口用来配置规则。
- 其他服务在项目启动时,从数据库中读取规则信息加载进内存。
- 那么服务如何感知到规则变化呢,一般是推模式和拉模式,如果用nacos做数据源就采用推模式,即去监听nacos配置中心感知变化;如果采用mysql做数据源就采用拉模式,定时从数据库读取信息,本项目就是采用拉模式。
总结:思路大概就是这样,如果有问题想要问我的或者想看代码的可以联系我。
学习记录,不断沉淀,终究会成为一个优秀的程序员,加油!
您的点赞、关注与收藏是我分享博客的最大赞赏!
博主博客地址: https://blog.youkuaiyun.com/qq_45701514微信:chenzhixu299