【微服务笔记21】微服务组件之Sentinel服务熔断、服务降级、流量控制介绍

这篇具有很好参考价值的文章主要介绍了【微服务笔记21】微服务组件之Sentinel服务熔断、服务降级、流量控制介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章,主要介绍微服务组件之Sentinel服务熔断、服务降级、流量控制。

目录

一、Sentinel组件

1.1、Sentinel介绍

1.2、Sentinel环境搭建

(1)引入依赖

(2)资源和规则

1.3、使用SphU定义资源

(1)定义资源

(2)定义规则

1.4、使用SphO定义资源

(1)定义资源

(2)定义规则

1.5、使用@SentinelResource注解定义资源

(1)定义资源

(2)定义规则

1.6、熔断降级规则

(1)案例代码

(2)五种降级规则


一、Sentinel组件

1.1、Sentinel介绍

Sentinel是Spring Cloud Alibaba提供的一个专门用于服务容错、服务熔断、服务限流的微服务组件,它和hystrix组件的作用是类似的,但是Sentinel提供的功能比hystrix更加强大,Sentinel分为两部分,一部分是Sentinel核心库,另外一部分是Dashboard控制台,Dashboard控制台可以查看监控的信息,接口的调用情况等。

sphu sentinel,【微服务笔记】,微服务,sentinel,Sentinel服务容错,服务熔断降级,流量控制

有两种使用Sentinel组件的方式,分别是:

  • 第一种:引入Sentinel核心库依赖,然后通过Java代码的方式编写流控规则。
  • 第二种:通过Dashboard控制台直接添加流控规则。

1.2、Sentinel环境搭建

Sentinel可以和很多的框架进行整合,并且也可以单独的使用,例如:和SpringCloud整合、和SpringBoot整合、Dubbo整合等,这里我就和SpringCloud进行整合。

(1)引入依赖

<!-- 引入 web 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 sentinel 依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

引入sentinel依赖之后,基本的环境就搭建好了,接下来就是使用Sentinel进行流量控制等代码的编写。

(2)资源和规则

在Sentinel中有两种概念需要了解下,分别是:资源和规则。

资源就是指项目中的一个请求资源,可以将一段代码、一个方法看作是资源,Sentinel就是以【资源】的形式进行流控设置,定义资源之后,还需要给这个资源设置相对应的流控规则,规则也就是说,这个资源什么情况下,需要发生熔断、降级、限流等等操作呢,这些操作就是规则。

  • 一般情况下,我们都使用方法名、URL、微服务名称作为资源名称来描述某个资源。
  • 流量控制、熔断降级、系统保护、来源访问控制、热点参数等等规则。

Sentinel提供了多种资源的定义方式,可以通过【@SentinelResource】注解定义资源,也可以通过Java代码的方式手动的定义资源。下面分别介绍一下,几种定义资源和规则的方式。

1.3、使用SphU定义资源

SphU是Sentinel提供的一个类,SphU是采用【try...catch】异常的方式来实现流控配置,当发生流控的时候,就会抛出一个BlockException异常。

(1)定义资源

@GetMapping("/sphU")
public String demo01() {
    Entry entry = null;
    try {
        // 1、开启流控
        entry = SphU.entry("sphU_demo01");
        System.out.println("这里就是执行具体业务逻辑");
    } catch (BlockException e) {
        e.printStackTrace();
        // 记录流控异常日志
        Tracer.traceEntry(e, entry);
        // 2、当发生流控的时候,就会进入这个异常块里面
        return "Sentinel发生流控,请稍后重试!";
    } finally {
        if (entry != null) {
            // 3、退出流控
            entry.exit();
        }
    }
    return "接口调用成功";
}

(2)定义规则

/**
 * 注入流控规则
 */
@PostConstruct
private void initFlowRule() {
    List<FlowRule> ruleList = new ArrayList<>();

    // 创建资源对应的流控规则
    FlowRule flowRule = new FlowRule();
    // 设置当前这个规则属于哪个资源的
    // 注意:不要用错方法,是调用【serResource()】方法,而不是【serRefResource()】,方法用错后,sentinel流控不生效
    flowRule.setResource("sphU_demo01");
    // 设置流控规则类型,这采用 QPS 方式
    flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // 设置 QPS 的限制数量
    flowRule.setCount(1);

    ruleList.add(flowRule);

    // 将流控规则添加到Sentinel里面
    FlowRuleManager.loadRules(ruleList);
}

启动工程,然后浏览器访问【/api/sentinel/sphU】接口,连续多次刷新页面,此时就会出现流控情况,从而抛出异常。

sphu sentinel,【微服务笔记】,微服务,sentinel,Sentinel服务容错,服务熔断降级,流量控制

1.4、使用SphO定义资源

SphO也是Sentinel提供的一个类,它是采用【if...else】的方式来实现流控,当触发流控的时候,对应方法会返一个boolean类型,false表示发生了流控,我们就可以根据方法的返回值,进行代码的处理。

(1)定义资源

@GetMapping("/sphO")
public String demo02() {
    boolean entry = SphO.entry("sphO_demo02");
    if (entry) {
        try {
            System.out.println("执行具体业务逻辑...");
            // 没有发生流控,正常执行业务逻辑代码
            return "接口调用成功";
        } finally {
            // 关闭流控
            SphO.exit();
        }
    } else {
        // 发生流控
        return "Sentinel发生流控,请稍后重试!";
    }
}

(2)定义规则

/**
 * 注入流控规则
 */
@PostConstruct
public void initFlowRule() {
    List<FlowRule> ruleList = new ArrayList<>();
	
    // 创建资源对应的流控规则
    FlowRule flowRule = new FlowRule();
    flowRule.setResource("sphO_demo02");
    // 设置当前这个规则属于哪个资源的
    // 设置流控规则类型,这采用 QPS 方式
    flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // 设置 QPS 的限制数量
    flowRule.setCount(1);

    ruleList.add(flowRule);

    // 将流控规则添加到Sentinel里面
    FlowRuleManager.loadRules(ruleList);
}

1.5、使用@SentinelResource注解定义资源

@SentinelResource注解,用于定义资源,这个注解中有下面这些属性:

  • value:定义资源名称。
  • blockHandler:定义流控降级之后调用的方法。
    • 方法必须定义在同一个类中。
    • 方法必须是public的。
    • 方法返回值必须和原方法的返回值一致。
    • 方法参数必须相同,但是最后一个参数可以添加一个异常类参数。
  • blockHandlerClass:作用和blockHandler一致,只是单独写到一个类里面了。
  • fallback:当对应方法抛出异常时候,会调用这个降级方法。

(1)定义资源

package com.gitcode.demo.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @version 1.0.0
 * @Date: 2023/4/25 17:07
 * @Copyright (C) ZhuYouBin
 * @Description:
 */
@RestController
@RequestMapping("/api/sentinel/demo")
public class SentinelDemo {

    @SentinelResource(value = "sentinel_demo", blockHandler = "blockHandlerMethod", fallback = "fallbackMethod")
    @GetMapping("/resource")
    public String demo02() {
        System.out.println("执行具体业务逻辑...");
        return "接口调用成功";
    }

    public String blockHandlerMethod() {
        System.out.println("Sentinel发生流控,请稍后重试!");
        return "Sentinel发生流控,请稍后重试!";
    }

    public String fallbackMethod(Throwable ex) {
        System.out.println("Sentinel发生异常,请稍后重试!" + ex.getMessage());
        return "Sentinel发生异常,请稍后重试!" + ex.getMessage();
    }

}

(2)定义规则

/**
 * 注入流控规则
 */
@PostConstruct
public void initFlowRule() {
    List<FlowRule> ruleList = new ArrayList<>();

    // 创建资源对应的流控规则
    FlowRule flowRule3 = new FlowRule();
    // 设置当前这个规则属于哪个资源的
    flowRule3.setResource("sentinel_demo");
    // 设置流控规则类型,这采用 QPS 方式
    flowRule3.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // 设置 QPS 的限制数量
    flowRule3.setCount(1);

    ruleList.add(flowRule);

    // 将流控规则添加到Sentinel里面
    FlowRuleManager.loadRules(ruleList);
}

1.6、熔断降级规则

通过Java代码的方式设置降级规则,降级规则采用【DegradeRule】类表示,通过这个类设置一些规则,然后将其保存到【DegradeRuleManager】类中的缓存里面即可。

(1)案例代码

/**
 * 服务降级规则配置
 */
public void initDegradeRule() {
    List<DegradeRule> degradeRuleList = new ArrayList<>();
    
    // 设置降级规则
    DegradeRule rule = new DegradeRule();
    rule.setResource("资源名称");
    // 指定触发降级的规则类型,有五种
    rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
    // 设置发生异常时候数量
    rule.setCount(2);
    // 设置窗口时间
    rule.setTimeWindow(10);
    // 设置最小请求数量
    rule.setMinRequestAmount(2);

    degradeRuleList.add(rule);
    
    // 加载到Sentinel里面
    DegradeRuleManager.loadRules(degradeRuleList);
}

(2)五种降级规则

  • DEGRADE_GRADE_EXCEPTION_COUNT:在指定时间内发生的异常次数降级。
  • DEGRADE_GRADE_EXCEPTION_RATIO:在指定时间内发生的异常比率降级。
  • DEGRADE_DEFAULT_MIN_REQUEST_AMOUNT:根据最小请求数量来实现降级。
  • DEGRADE_GRADE_RT:根据响应比进行降级。
  • DEGRADE_DEFAULT_SLOW_REQUEST_AMOUNT:最慢请求数量降级。

常用的就只有三个,分别是:异常数量、异常比率、响应比。

综上,这篇文章结束了,主要介绍微服务组件之Sentinel服务熔断、服务降级、流量控制。文章来源地址https://www.toymoban.com/news/detail-854884.html

到了这里,关于【微服务笔记21】微服务组件之Sentinel服务熔断、服务降级、流量控制介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Cloud Alibaba】Sentinel 服务熔断与流量控制

    目录 前言 一、Sentinel 入门 1.1 什么是 Sentinel ? 1.2 微服务集成 Sentinel  1.3 安装Sentinel控制台 二、Jmeter 压力测试工具 2.1 Jmeter 介绍  2.2 Jmeter 安装 2.3 接口测试 三、Sentinel 使用 3.1 限流规则 3.1.1 warm up(预热模式) 3.1.2 排队等待 3.1.3 关联 3.1.4 链路 3.2 熔断规则 3.3 服务降级     

    2024年02月01日
    浏览(50)
  • 【Spring Cloud】Sentinel流量限流和熔断降级的讲解

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一起

    2024年01月23日
    浏览(32)
  • 【微服务笔记10】微服务组件之Hystrix实现服务降级和服务熔断

    这篇文章,主要介绍微服务组件之Hystrix实现服务降级和服务熔断。 目录 一、服务降级 1.1、什么是服务降级 1.2、实现服务降级 (1)引入依赖 (2)编写Service层代码 (3)编写Controller层代码 (4)运行测试 (5)fallbackMethod属性 二、服务熔断 2.1、什么是服务熔断 2.2、实现服务

    2023年04月11日
    浏览(63)
  • 流量控制与熔断利器:Sentinel介绍

    这是《百图解码支付系统设计与实现》专栏系列文章中的第(19)篇,也是流量控制系列的第(6)篇。点击上方关注,深入了解支付系统的方方面面。 本篇聊聊流量控制与熔断利器Sentinel,背后的原理,适用的场景及存在的不足。不涉及具体的配置,具体配置请参考官方文档

    2024年01月21日
    浏览(29)
  • 聊一聊服务治理三板斧:限流、熔断、降级和go-sentinel的实现

    我们知道,对于一个项目之初,我们不可能上来就按几千的并发去配置,为什么?两个方面,第一个是成本高。第二个是维护难度大。即便是天猫淘宝这种,也是采用的动态扩容的方式来应对双十一。那么一个项目如何应对突然的高并发,我们有哪些常用的措施和处理呢?我

    2024年01月19日
    浏览(33)
  • 【微服务】Feign 整合 Sentinel,深入探索 Sentinel 的隔离和熔断降级规则,以及授权规则和自定义异常返回结果

    在前文中,介绍了 Sentinel 的流控模式和流控效果,然而限流只是一种预防措施,虽然可以尽量避免因为并发问题而引起的服务故障,但服务仍然可能因其他因素而发生故障。为了将这些故障控制在一定范围内,以避免雪崩效应的发生,我们需要依赖线程隔离(舱壁模式)和熔

    2024年02月08日
    浏览(23)
  • Sentinel 降级、限流、熔断

    在现代分布式系统中,如何有效地保护系统免受突发流量和故障的影响,是每个开发人员和架构师都需要思考的重要问题。在这样的背景下,Sentinel作为一个强大的系统保护和控制组件,为我们提供了降级、限流、熔断等多种策略,帮助我们更好地保障系统的稳定性和可用性

    2024年01月24日
    浏览(30)
  • 【Springcloud】Sentinel熔断和降级

    服务的稳定是公司可持续发展的重要基石,随着业务量的快速发展,一些平时正常运行的服务,会出现各种突发状况,而且在分布式系统中,每个服务本身又存在很多不可控的因素,比如线程池处理缓慢,导致请求超时,资源不足,导致请求被拒绝,又甚至直接服务不可用、

    2024年02月09日
    浏览(33)
  • springcloud alibaba sentinel熔断降级

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从 流量控制、熔断降级、系统负载保护 等多个维度保护服务的稳定性。 sentinel相当于hystrix的升级版,加入了web界面,能够实时在线的改变流量策略。 Sentinel 分为两个部分: 核心库(J

    2024年01月23日
    浏览(34)
  • Sentinel的线程隔离和熔断降级

    上一节整理了Sentinel的限流,限流可以降低微服务的负载,避免因为高并发而故障,进而传递给其他相关服务而引发服务雪崩。以上仅为避免服务故障,而当某个服务真正故障时,如何处理才能防止服务雪崩? ⇒ Sentinel支持隔离和降级两种方案 采用线程隔离,即舱壁模式:

    2024年02月17日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包