06 Alibaba微服务组件Sentinel (1)

news2024/9/23 9:35:02

1、分布式系统遇到的问题

服务的可用性问题

在这里插入图片描述

服务的可用性场景

在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务, 如图所示:

如果其中的下单服务不可用, 就会出现线程池里所有线程都因等待响应而被阻塞, 从而造成整个服务链路不可用, 进而导致整个系统的服务雪崩.
如图所示:

在这里插入图片描述

服务雪崩效应: 因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程,就叫服务雪崩效应
导致服务不可用的原因:

在这里插入图片描述

在服务提供者不可用的时候,会出现大量重试的情况:用户重试、代码逻辑重试,这些重试最终导致:进一步加大请求流量。所以归根结底导致雪崩效应的最根本原因是:大量请求线程同步等待造成的资源耗尽。当服务调用者使用同步调用时, 会产生大量的等待线程占用系统资源。一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了。

2、解决方案

稳定性、恢复性

常见的容错机制

  • 超时机制

在不做任何处理的情况下,服务提供者不可用会导致消费者请求线程强制等待,而造成系统资源耗尽。加入超时机制,一旦超时,就释放资源。由于释放资源速度较快,一定程度上可以抑制资源耗尽的问题。

  • 服务限流

在这里插入图片描述

  • 隔离

原理:用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,则会进行降级处理,用户的请求不会被阻塞,至少可以看到一个执行结果(例如返回友好的提示信息),而不是无休止的等待或者看到系统崩溃。

a) 线程隔离
隔离前:

在这里插入图片描述
在这里插入图片描述

隔离后:
在这里插入图片描述

b) 信号隔离

    信号隔离也可以用于限制并发访问,防止阻塞扩散, 与线程隔离最大不同在于执行依赖代码的线程依然是请求线程(该线程需要通过信号申请, 如果客户端是可信的且可以快速返回,可以使用信号隔离替换线程隔离,降低开销。信号量的大小可以动态调整, 线程池大小不可以。
  • 服务熔断

远程服务不稳定或网络抖动时暂时关闭,就叫服务熔断。

现实世界的断路器大家肯定都很了解,断路器实时监控电路的情况,如果发现电路电流异常,就会跳闸,从而防止电路被烧毁。

软件世界的断路器可以这样理解:实时监测应用,如果发现在一定时间内失败次数/失败率达到一定阈值,就“跳闸”,断路器打开——此时,请求直接返回,而不去调用原本调用的逻辑。跳闸一段时间后(例如10秒),断路器会进入半开状态,这是一个瞬间态,此时允许一次请求调用该调的逻辑,如果成功,则断路器关闭,应用正常调用;如果调用依然不成功,断路器继续回到打开状态,过段时间再进入半开状态尝试——通过”跳闸“,应用可以保护自己,而且避免浪费资源;而通过半开的设计,可实现应用的“自我修复“。

所以,同样的道理,当依赖的服务有大量超时时,在让新的请求去访问根本没有意义,只会无畏的消耗现有资源。比如我们设置了超时时间为1s,如果短时间内有大量请求在1s内都得不到响应,就意味着这个服务出现了异常,此时就没有必要再让其他的请求去访问这个依赖了,这个时候就应该使用断路器避免资源浪费。

在这里插入图片描述

服务降级

有服务熔断,必然要有服务降级。

所谓降级,就是当某个服务熔断之后,服务将不再被调用,此时客户端可以自己准备一个本地的fallback(回退)回调,返回一个缺省值。 例如:(备用接口/缓存/mock数据) 。这样做,虽然服务水平下降,但好歹可用,比直接挂掉要强,当然这也要看适合的业务场景。

在这里插入图片描述
在这里插入图片描述

3、Sentinel:分布式系统的流量防卫兵

3.1 Sentinel是什么

在这里插入图片描述

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。

源码地址
官方文档

Sentinel具有以下特征:

  • 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
  • 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。

阿里云提供了 企业级的 Sentinel 服务,应用高可用服务 AHAS

在这里插入图片描述

3.2 Sentinel和Hystrix对比

https://github.com/alibaba/Sentinel/wiki/Sentinel-%E4%B8%8E-Hystrix-%E7%9A%84%E5%AF%B9%E6%AF%94

在这里插入图片描述

4、Sentinel快速开始

https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8

在官方文档中,定义的Sentinel进行资源保护的几个步骤:
1、定义资源
2、定义规则
3、检验规则是否生效

Entry entry = null;
// 务必保证 finally 会被执行
try {
  // 资源名可使用任意有业务语义的字符串  开启资源的保护
  entry = SphU.entry("自定义资源名");
  // 被保护的业务逻辑    method
  // do something...
} catch (BlockException ex) {
  // 资源访问阻止,被限流或被降级   Sentinel定义异常  流控规则,降级规则,热点参数规则。。。。   服务降级(降级规则)
  // 进行相应的处理操作
} catch (Exception ex) {
  // 若需要配置降级规则,需要通过这种方式记录业务异常    RuntimeException     服务降级   mock  feign:fallback 
  Tracer.traceEntry(ex, entry);
} finally {
  // 务必保证 exit,务必保证每个 entry 与 exit 配对
  if (entry != null) {
    entry.exit();
  }

Sentinel资源保护的方式

API实现

a. 引入依赖

<dependency>
     <groupId>com.alibaba.csp</groupId>
     <artifactId>sentinel-core</artifactId>
     <version>1.8.0</version>
</dependency>

b. 编写测试逻辑

@RestController
@Slf4j
public class HelloController {

    private static final String RESOURCE_NAME = "hello";

    @RequestMapping(value = "/hello")
    public String hello() {

        Entry entry = null;
        try {
            // 资源名可使用任意有业务语义的字符串,比如方法名、接口名或其它可唯一标识的字符串。
            entry = SphU.entry(RESOURCE_NAME);
            // 被保护的业务逻辑
            String str = "hello world";
            log.info("====="+str);
            return str;
        } catch (BlockException e1) {
            // 资源访问阻止,被限流或被降级
            //进行相应的处理操作
            log.info("block!");
        } catch (Exception ex) {
            // 若需要配置降级规则,需要通过这种方式记录业务异常
            Tracer.traceEntry(ex, entry);
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
        return null;
    }

    /**
     * 定义流控规则
     */
    @PostConstruct
    private static void initFlowRules(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        //设置受保护的资源
        rule.setResource(RESOURCE_NAME);
        // 设置流控规则 QPS
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 设置受保护的资源阈值
        // Set limit QPS to 20.
        rule.setCount(1);
        rules.add(rule);
        // 加载配置好的规则
        FlowRuleManager.loadRules(rules);
    }
}

测试效果:

在这里插入图片描述

缺点:

  • 业务侵入性很强,需要在controller中写入非业务代码.
  • 配置不灵活 若需要添加新的受保护资源 需要手动添加 init方法来添加流控规则

@SentinelResource注解实现

@SentinelResource 注解用来标识资源是否被限流、降级。
blockHandler: 定义当资源内部发生了BlockException应该进入的方法(捕获的是Sentinel定义的异常)
fallback: 定义的是资源内部发生了Throwable应该进入的方法
exceptionsToIgnore:配置fallback可以忽略的异常
源码入口:com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect

a. 引入依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.8.0</version>
</dependency>

b. 配置切面支持

@Configuration
public class SentinelAspectConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

c. UserController中编写测试逻辑,添加@SentinelResource,并配置blockHandler和fallback

@RequestMapping(value = "/findOrderByUserId/{id}")
@SentinelResource(value = "findOrderByUserId",
                  fallback = "fallback",fallbackClass = ExceptionUtil.class,
                  blockHandler = "handleException",blockHandlerClass = ExceptionUtil.class
                 )
public R  findOrderByUserId(@PathVariable("id") Integer id) {
    //ribbon实现
    String url = "http://mall-order/order/findOrderByUserId/"+id;
    R result = restTemplate.getForObject(url,R.class);

    if(id==4){
        throw new IllegalArgumentException("非法参数异常");
    }

    return result;
}

d. 编写ExceptionUtil,注意如果指定了class,方法必须是static方法

public class ExceptionUtil {

    public static R fallback(Integer id,Throwable e){
        return R.error(-2,"===被异常降级啦===");
    }

    public static R handleException(Integer id, BlockException e){
        return R.error(-2,"===被限流啦===");
    }
}

e. 流控规则设置可以通过Sentinel dashboard配置

客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.8.0</version>
</dependency>

5、启动Sentinel控制台

下载控制台 jar 包并在本地启动:可以参见 此处文档
在这里插入图片描述

 #启动控制台命令
java -jar sentinel-dashboard-1.8.0.jar

用户可以通过如下参数进行配置:
-Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel;
-Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel;
-Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;
java -Dserver.port=8858 -Dsentinel.dashboard.auth.username=xushu -Dsentinel.dashboard.auth.password=123456 -jar sentinel-dashboard-1.8.0.jar

为了方便快捷启动可以在桌面创建.bat文件

java -Dserver.port=8858 -Dsentinel.dashboard.auth.username=xushu -Dsentinel.dashboard.auth.password=123456  -jar D:\server\sentinel-dashboard-1.8.0.jar
pause

访问http://localhost:8080/#/login ,默认用户名密码: sentinel/sentinel

在这里插入图片描述

Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包,所以要确保客户端有访问量;

在这里插入图片描述

6、Spring Cloud Alibaba整合Sentinel

a. 引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

b. 添加yml配置,为微服务设置sentinel控制台地址
添加Sentinel后,需要暴露/actuator/sentinel端点,而Springboot默认是没有暴露该端点的,所以需要设置,测试http://localhost:8800/actuator/sentinel

server:
  port: 8800

spring:
  application:
    name: mall-user-sentinel-demo
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

    sentinel:
      transport:
        # 添加sentinel的控制台地址
        dashboard: 127.0.0.1:8080
        # 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
        # port: 8719
 

c.在sentinel控制台中设置流控规则

  • 资源名: 接口的API
  • 针对来源: 默认是default,当多个微服务都调用这个资源时,可以配置微服务名来对指定的微服务设置阈值
  • 阈值类型: 分为QPS和线程数 假设阈值为10
  • QPS类型: 只得是每秒访问接口的次数>10就进行限流
  • 线程数: 为接受请求该资源分配的线程数>10就进行限流

在这里插入图片描述

测试: 因为QPS是1,所以1秒内多次访问会出现如下情形:

在这里插入图片描述
访问http://localhost:8800/actuator/sentinel, 可以查看flowRules

在这里插入图片描述

微服务和Sentinel Dashboard通信原理

Sentinel控制台与微服务端之间,实现了一套服务发现机制,集成了Sentinel的微服务都会将元数据传递给Sentinel控制台,架构图如下所示:

在这里插入图片描述
ps: 流控针对privoder 熔断降级 针对consumer

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

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

相关文章

深度解锁 CRUD 应用开发平台

全文 2400 字 阅读时间约 8 分钟 本文首发于码匠技术博客 目录 使用 CRUD 应用开发平台的好处 CRUD 应用开发平台的主要功能 如何使用 CRUD 应用开发平台&#xff1f; 如何自定义 CRUD 应用开发平台&#xff1f; 使用码匠开发的 CRUD 应用程序类型 关于码匠 CRUD 应用是具…

tomcat多实例优化及zabbix监控群集

tomcat简介Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目&#xff0c;由Apache,Sun和其他一些公司及个人共同开发而成。Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和…

LeetCode——2315. 统计星号

一、题目 给你一个字符串 s &#xff0c;每两个连续竖线 ‘|’ 为 一对 。换言之&#xff0c;第一个和第二个 ‘|’ 为一对&#xff0c;第三个和第四个 ‘|’ 为一对&#xff0c;以此类推。 请你返回不在 竖线对之间&#xff0c;s 中 ‘*’ 的数目。 注意&#xff0c;每个竖…

python flask 操作 Redis,包含详细代码

使用 Flask 操作 Redis 可以通过安装 Redis 的 Python 库并在 Flask 中使用它来实现。 正式学习前&#xff0c;需要先确定 Redis 已安装并可正常运行 运行 redis-server.exe redis.windows.conf 启动 Redis 服务器 运行 redis-cli.exe ping 检查 Redis 服务器是否运行正常 运行…

IP地址扫描程序/扫描工具

随着许多组织采用自带设备 &#xff08;BYOD&#xff09; 等策略&#xff0c;IT 网络变得越来越复杂。随着越来越多的设备连接到网络&#xff0c;IP 地址扫描势在必行&#xff0c;以确保设备在连接到网络时不会遇到问题。IP 地址扫描器是 OpUtils 中的一个模块&#xff0c;是一…

Windows包管理工具winget

文章目录简介实操简介 在Win10或者Win11中默认安装了winget工具&#xff0c;可以直接在命令行中输入命令&#xff0c;如果有反应&#xff0c;说明已经安装。 >winget -v v1.4.10173输入winget可以查看命令列表 命令说明show显示包的相关信息install安装给定的程序包unins…

几何对象基本元素与表现

点与向量 点 (point) 表示空间中的位置&#xff0c;它有空间中的坐标&#xff0c;例如在三维空间中&#xff0c;点有 (x, y, z) 坐标。 向量 (vector) 是有方向的量&#xff0c;它可以表示在空间中的移动。向量可以通过两个点的差计算&#xff0c;它连接起始点和终止点。 结…

第3章:基于媒体查询生成PDF

图:pdfHTML C3F01 检查示例HTML文件 图3.1显示了一个HTML页面,介绍 South by South West,这是德克萨斯州奥斯汀的一项年度活动。该页面分布在三个浏览器窗口中;请参阅 sxsw.html 和 sxsw.css 以获取用于创建此页面的html和css代码。这个HTML页面的布局灵感来自 w3schools…

vite 运行项目报错 ‘axios/index.js‘ does not provide anexport named ‘default‘

报错信息 报错信息&#xff1a;The requested module ‘/node_modules/axios/index.js?v2866e624’ does not provide an export named ‘default’ 现象 使用 vite 打包工具开发时出现&#xff0c;生产环境正常 原因 原因在于 Vite 是完全依靠 ESM 原生能力的&#xff0c…

jspssm学生宿舍预订报修管理系统

目录 摘 要 1 Abstract 2 1 绪论 3 1.1 课题背景 4 1.2 课题研究现状 5 1.3 初步设计方法与实施方案 6 1.4 本文研究内容 7 2 系统开发环境 8 2.1 Java语言 9 2.2 JSP技术 9 2.3 B/S架构 9 2.4 Eclipse环境配置 9 2.5 MySQL数据库 9 3 …

springBean的作用域

前言&#xff1a;最近在进行springBean的作用域学习&#xff0c;并且学习了对应的例子。这里进行一下总结 一&#xff1a;Bean的作用域基础概念 如果想学习SpringBean的生命周期&#xff0c;那么就必须要学习Bean的作用域。因为不同的作用域的bean的生命周期不同 1:singleto…

基于VS2019的ceres solver配置

一、ceres solver介绍Ceres Solver 是一个开源的C库&#xff0c;用于建模和解决大型、复杂的优化问题。它可以用来解决有边界约束的非线性最小二乘法问题和一般无约束的优化问题。官网&#xff1a;http://www.ceres-solver.org/案例网址&#xff1a;http://www.ceres-solver.or…

【数据结构】各排序方法比较

文章目录一、时间性能二、空间性能三、排序方法的稳定性能四、关于排序方法的时间复杂度的下限一、时间性能 按照平均时间性能来分&#xff0c;有三类排序方法&#xff1a; 时间复杂度为 O(nlogn)的方法有&#xff1a; 快速排序、堆排序、归并排序&#xff0c;其中以快速排序最…

Cesium 常见错误集

解决cesium widgets.css is not exported from package 在版本1.9以上版本后,按照官方文档引入css 时 会报错:cesium widgets.css is not exported from package 解决方案: 1.node_modules里找到cesium的package.json文件,在exports里增加导出widgets.css [rml_read_mo…

华为HCIE学习之open stack开篇(笔记)

文章目录一、云计算和虚拟化的区别二、Openstack的作用三、Openstack部署方式四、Openstack内的一些概念1、租户2、镜像3、规格4、网络一、云计算和虚拟化的区别 云计算是一种服务模式&#xff0c;而虚拟化是一种具体的技术。 二、Openstack的作用 Openstack是一个云操作系统…

小程序开发(五)

上拉触底进行节流处理在data中定义isloading发起请求时完成时回调事件响应式判断自定义编译模式&#xff1a;》编译自动跳转生命周期&#xff1a;onlaunch 初始化完成 只执行一次onShow&#xff1a;切换到前台onHide&#xff1a;切换到后台app.js :onReady :渲染完成才可以修改…

优秀的代码最终选择if else,还是switch case

今天我们不讨论哪个写法读起来更优秀&#xff0c;不讨论对于性能而言哪个更完美&#xff0c;也不讨论哪种情况下对于判断语句是常量还是变量的选择&#xff0c;而是单纯从最简单的角度来看一下&#xff0c;为什么很多优秀的项目优秀的代码&#xff0c;最终选择了if else语句&am…

惠普Probook450G7电脑开机总是卡死蓝屏怎么重装系统?

惠普Probook450G7电脑开机总是卡死蓝屏怎么重装系统&#xff1f;有用户在使用惠普Probook450G7电脑的时候&#xff0c;电脑一开机的时候总是会卡死无法操作&#xff0c;然后就变成蓝屏了。那么遇到这个问题怎么去进行系统的重新安装呢&#xff1f;一起来看看重装系统的具体操作…

中国电子学会2021年06月份青少年软件编程Python等级考试试卷一级真题(含答案)

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 下列程序运行的结果是&#xff1f;&am…

python 环境安装

时隔 将近一年了&#xff0c; 我又重新追寻我的理想了。 趁着2023年刚到&#xff0c;先写一点 python 打个基础。 还是老样子&#xff0c;学到及输出&#xff0c;所以继续写文章。 本文章主要介绍 python 的环境搭建 和 输出 HelloWorld 用于测试搭试好的环境。 本专栏主要…