Sentinel结合微服务进行熔断

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!");
	}
    }
}

结合项目

目标

  1. 本次项目用Sentinel目标主要是进行熔断。

  2. 由于Sentinel的规则是应用在内存中无法持久化,因此可以弃用sentinel自带的dashboard页面,自己开发一个页面进行规则配置;选取数据源一般有两种,分别是配置中心(如nacos)和数据库(mysql)。

  3. 一般熔断是指针对调用其他服务的时候,进行熔断,如果调用非java服务我们一般使用HttpClient,而Sentinel也适配了HttpClient,我们只要稍微修改,因此目的就是适配HttpClient。

设计

  1. 由一个服务专门用来写规则数据到数据库,添加增删改查的接口用来配置规则。
  2. 其他服务在项目启动时,从数据库中读取规则信息加载进内存。
  3. 那么服务如何感知到规则变化呢,一般是推模式拉模式,如果用nacos做数据源就采用推模式,即去监听nacos配置中心感知变化;如果采用mysql做数据源就采用拉模式,定时从数据库读取信息,本项目就是采用拉模式。

总结:思路大概就是这样,如果有问题想要问我的或者想看代码的可以联系我。

学习记录,不断沉淀,终究会成为一个优秀的程序员,加油!
您的点赞、关注与收藏是我分享博客的最大赞赏!
博主博客地址: https://blog.csdn.net/qq_45701514

微信:chenzhixu299

你可能感兴趣的:(工具,微服务组件,中间件,java,云原生,sentinel)