微服务:微服务保护

news2024/11/15 12:02:35

💥 该系列属于【SpringBoot基础】专栏,如您需查看其他SpringBoot相关文章,请您点击左边的连接

目录

一、引言

1. 什么是雪崩问题

2. 雪崩问题产生的原因

3. 解决思路

二、微服务保护

1. 服务保护方案

(1)请求限流

(2)线程隔离

(3)服务熔断

2. Sentinel

(1)介绍和安装

(2)微服务整合

引入sentinel依赖

配置控制台

访问cart-service的任意端点

3. 请求限流

4. 线程隔离

5. Fallback

(1)配置文件

(2)配置FeignClient的Fallback

6. 服务熔断


一、引言

1. 什么是雪崩问题

微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是级联失败问题,或者叫雪崩问题。

 

2. 雪崩问题产生的原因

  • 微服务相互调用,服务提供者出现故障或阻塞。
  • 服务调用者没有做好异常处理,导致自身故障。
  • 调用链中的所有服务级联失败,导致整个集群故障。

3. 解决思路

  • 尽量避免服务出现故障或阻塞,保证代码的健壮性,保证网络畅通,能应对较高的并发请求;

二、微服务保护

1. 服务保护方案

(1)请求限流

服务故障最重要原因,就是并发太高!解决了这个问题,就能避免大部分故障。当然,接口的并发不是一直很高,而是突发的。因此请求限流,就是限制或控制接口访问的并发流量,避免服务因流量激增而出现故障。

请求限流往往会有一个限流器,数量高低起伏的并发请求曲线,经过限流器就变的非常平稳。这就像是水电站的大坝,起到蓄水的作用。

(2)线程隔离

为了避免某个接口故障或压力过大导致整个服务不可用,我们可以限定每个接口可以使用的资源范围,也就是将其"隔离"起来。

(3)服务熔断

线程隔离虽然避免了雪崩问题,但故障服务(商品服务)依然会拖慢购物车服务(服务调用方)的接口响应速度。

所以,我们要做两件事情:

  • 编写服务降级逻辑:就是服务调用失败后的处理逻辑,根据业务场景,可以抛出异常,也可以返回友好提示或默认数据。

  • 异常统计和熔断:统计服务提供方的异常比例,当比例过高表明该接口会影响到其它服务,应该拒绝调用该接口,而是直接走降级逻辑。

2. Sentinel

Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。

(1)介绍和安装

下载地址:Releases · alibaba/Sentinel (github.com)

将jar包放在任意非中文、不包含特殊字符的目录下,重命名为sentinel-dashboard.jar

例如放在桌面Desktop下,然后运行如下命令启动控制台:

java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

 通过http://localhost:8090访问:

需要输入账号和密码,默认都是:sentinel

登录后,即可看到控制台,默认会监控sentinel-dashboard服务本身:

(2)微服务整合

cart-service模块中整合sentinel,连接sentinel-dashboard控制台,步骤如下:

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

配置控制台

修改application.yaml文件,添加下面内容:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090
      http-method-specify: true #开启请求方式前缀

我们的SpringMVC接口是按照Restful风格设计,因此购物车的查询、删除、修改等接口全部都是/carts路径,所以我们可以选择打开Sentinel的请求方式前缀,把请求方式 + 请求路径作为簇点资源名。把spring.cloud.sentinel.http-method-specify设置为true

重启,刷新前端购物车页面

访问cart-service的任意端点

访问查询购物车接口,sentinel的客户端就会将服务访问的信息提交到sentinel-dashboard控制台。并展示出统计信息:

3. 请求限流

对某个接口的请求数进行限制

在簇点链路后面点击流控按钮,即可对其做限流配置:

这样就把查询购物车列表这个簇点资源的流量限制在了每秒6个,也就是最大QPS为6.

利用Jemeter做限流测试,我们每秒发出10个请求:

最终监控结果如下:

可以看出GET:/carts这个接口的通过QPS稳定在6附近,而拒绝的QPS在4附近,符合我们的预期。

4. 线程隔离

每个微服务如果给某个业务(例如查询购物车)过多的线程,那么会导致其他业务(例如业务1)也失灵,这是因为微服务的资源耗尽了,因此必须对各个业务的最大使用线程做一个限制。

模拟商品服务查询很慢:

    @ApiOperation("根据id查询商品")
    @GetMapping("{id}")
    public ItemDTO queryItemById(@PathVariable("id") Long id) throws InterruptedException {
        Thread.sleep(500); //耗时500ms
        return BeanUtils.copyBean(itemService.getById(id), ItemDTO.class);
    }

修改cart-service模块的application.yml文件,开启Feign的sentinel功能:

feign:
  sentinel:
    enabled: true # 开启feign对sentinel的支持

默认情况下SpringBoot项目的tomcat最大线程数是200,允许的最大连接是8492,单机测试很难打满。所以我们需要配置一下cart-service模块的application.yml文件,修改tomcat连接:

server:
  port: 8082
  tomcat:
    threads:
      max: 50 # 允许的最大线程数
    accept-count: 50 # 最大排队等待数量
    max-connections: 100 # 允许的最大连接

接下来,点击查询商品的FeignClient对应的簇点资源后面的流控按钮:

在弹出的表单中填写下面内容: 

这里勾选的是并发线程数限制,也就是说这个查询功能最多使用5个线程,而不是5QPS。如果查询商品的接口每秒处理2个请求,则5个线程的实际QPS在10左右。

我们利用Jemeter测试,每秒发送100个请求:

开启并发查询购物车信息的同时,手动增加和删除购物车商品仍然非常快,因此线程隔离使得不会影响到其它接口。

5. Fallback

fallback可以作为一种后备处理方案,当并发量过大导致请求失败时,可采取fallback的方法

(1)配置文件

在cart-service中添加,将FeignClient作为Sentinel的簇点资源:

feign:
  sentinel:
    enabled: true # 开启feign对sentinel的支持

(2)配置FeignClient的Fallback

代码:

@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("查询商品失败");
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                log.error("扣减商品库存失败");
                throw new RuntimeException(cause);
            }
        };
    }
}

ItemClientFallback注册为一个Bean

hm-api模块中的ItemClient接口中使用ItemClientFallbackFactory

测试:

当queryItemByIds和deductStock因为并发量过大调用接口失败时,返回一个备选方案,前端收到的均为200状态码,不过查询商品返回的可能是空集合。

6. 服务熔断

查询商品响应时间过高,从而导致查询购物车的响应时间也变的很长。对于商品服务这种不太健康的接口,我们应该停止调用,避免影响到当前服务。也就是将商品查询接口熔断。当商品服务接口恢复正常后,再允许调用。这其实就是断路器的工作模式了。

断路器的工作状态切换有一个状态机来控制:

状态机包括三个状态:

  • closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态

  • open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态持续一段时间后会进入half-open状态

  • half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。

    • 请求成功:则切换到closed状态

    • 请求失败:则切换到open状态

可以在控制台通过点击簇点后的熔断按钮来配置熔断策略:

在弹出的表格中这样填写:

 

这种是按照慢调用比例来做熔断,上述配置的含义是:

  • RT超过200毫秒的请求调用就是慢调用

  • 统计最近1000ms内的最少5次请求,如果慢调用比例不低于0.5,则触发熔断

  • 熔断持续时长20s

 

 

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

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

相关文章

03 serv00搭建WordPress

第一步 下载 serv00 官方教程 按官方教程下载 WordPress 压缩包&#xff0c;解压&#xff0c;将 WordPress 项目文件夹重命名为 public_html&#xff08;先删除原来的 public_html&#xff09; ‍ 第二步 安装 完成以上步骤后访问你的网站&#xff0c;开始安装 WordPress …

ESXi中设置网卡为混杂模式

为了测试系统网络问题&#xff0c;将ESXi中设置网卡设为混杂模式&#xff0c;如图 设置方法为进入编辑状态&#xff0c;然后将混杂模式选中&#xff1a; CBSD关于网络的一段描述 About bhyve networking By default, virtual machines use the tap interface, which CBSD aut…

WiFi的IP和电脑IP一样吗

在当今数字化时代&#xff0c;互联网已成为我们生活、学习和工作不可或缺的一部分。而网络连接的核心要素之一&#xff0c;就是IP地址。无论是通过WiFi接入网络的设备&#xff0c;还是直接连接至路由器的电脑&#xff0c;它们都拥有各自的IP地址。然而&#xff0c;这两个IP地址…

SQL 布尔盲注 (injection 第六关)

简介 SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络攻击方式&#xff0c;通过向SQL查询中插入恶意的SQL代码&#xff0c;攻击者可以操控数据库&#xff0c;SQL注入是一种代码注入攻击&#xff0c;其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&am…

大华 DSS 数字监控系统 group_saveGroup SQL 注入漏洞复现

0x01 产品简介 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。 0x02 漏洞概述 大华 DSS 数字监控系统 group_saveGroup 接口存在SQL 注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞…

计算机毕业设计pyspark+django+scrapy租房推荐系统 租房大屏可视化 租房爬虫 hadoop 58同城租房爬虫 房源推荐系统

用到的技术: 1. python 2. django后端框架 3. django-simpleui&#xff0c;Django后台 4. vue前端 5. element-plus&#xff0c;vue的前端组件库 6. echarts前端可视化库 7. scrapy爬虫框架 基于大数据的租房信息推荐系统包括以下功能&#xff1a…

一、什么是 mvvm? MVC、MVP、MVVM三种模式的区别与详解

简介 MVC、MVP、MVVM都是常见的软件架构模式。 MVC&#xff08;Model-View-Controller&#xff09;架构模式中&#xff0c;将应用程序分为三个主要部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&…

VBA技术资料MF185:图片导入Word添加不同格式说明文字

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Nuclei文件上传小Tips

前言 Nuclei对于文件上传类型Poc编写小Tips 平台 ProjectDiscovery Cloud Platform: https://cloud.projectdiscovery.io/ JsonPath: https://jsonpath.com/ Json解析&#xff1a; 在线json解析平台即可 案例 某康resourceOperations upload接口存在前台上传 具体接口&…

海康VisionMaster使用学习笔记9-畸变标定和畸变校正的使用

畸变标定和畸变校正 1. 功能和分类 2. 畸变标定 添加图像源 加载带有畸变的标定板图像 标定时标定板图像需尽量占满视野. 添加畸变标定 用于生成畸变标定文件 1. 运行参数畸变类型: 此时标定板图像同时包含径向和透视,因此选择径向透视畸变.标定板类型:棋盘格标定板校正中…

三、LogicFlow 基础配置介绍及实现一个基础 Demo

目录 前置LogicFlow 介绍LogicFlow基础配置引入方式核心包基础概念实例&#xff08;配置项&#xff09;节点边&#xff08;节点与节点之间的连线&#xff09;背景网格主题事件 插件包 实现基础Demo最后 前置 这一篇主要是对 LogicFlow 的一些功能及配置相关的介绍&#xff08;…

C++竞赛初阶L1-13-第五单元-循环嵌套(29~30课)535: T456454 数字统计

题目内容 请统计某个给定范围 [L,R] 的所有整数中&#xff0c;数字 2 出现的次数。 比如给定范围 [2,22]&#xff0c;数字 2 在数 2 中出现了 1 次&#xff0c;在数 12 中出现 1 次&#xff0c;在数 20 中出现 1 次&#xff0c;在数 21 中出现 1 次&#xff0c;在数 22 中出现…

人工智能赋能的认知营销:定制开发AI智能名片商城小程序的未来展望

摘要&#xff1a;随着人工智能技术的飞速发展&#xff0c;其在商业领域的应用日益广泛且深入&#xff0c;特别是在认知营销这一前沿领域。本文旨在探讨人工智能如何通过定制开发AI智能名片商城小程序&#xff0c;为认知营销注入新的活力与可能性。通过深入分析人工智能在数据处…

Security OAuth2简单修改授权码方式

问题 用户先通过密码模式获取令牌&#xff08;前端携带用户名和密码&#xff0c;在网关添加客户端id和客户端密码参数&#xff0c;认证服务通过密码模式发放令牌&#xff09;&#xff0c;此后使用该令牌访问服务。 现在&#xff0c;需要该用户授权给第三方客户端访问这个用户…

k8s 进阶实战笔记 | Ingress-traefik(一)

文章目录 traefik认知基本概述基础特性其他ingress对比核心概念和能力 安装部署创建CRD资源RBAC资源创建配置文件部署traefik预期效果 traefik认知 基本概述 ● 官网&#xff1a;https://traefik.cn ● 现代HTTP反向代理、负载均衡工具 ● 它支持多种后台 (Docker, Swarm, Ku…

ElasticSearch IK分词器的MySQL热部署字典(Docker)

1.下载插件源码 找到自己对应ES版本的下载 Releases infinilabs/analysis-ik GitHub 2.添加mysql驱动依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version><…

thinkphp5实现弹出框(下拉框选项动态赋值)

效果图 原理 先执行接口获取动态数据&#xff0c;然后在 layer.open的success回调函数中动态添加html代码片段&#xff0c;通过如下方法&#xff0c;将动态生成的代码插入指定的div中&#xff0c;实现动态赋值的效果。 // 动态获取的数据 var data ......;// 弹出框配置 lay…

Win10关闭弹出提示-‘密码已过期需要更换’

运行—>lusrmgr.msc—>本地用户和组—>用户—>右侧要设置的用户名—>属性—>勾选‘密码永不过期’

laravel使用SSH 隧道连接远程数据库

1、创建SSH隧道 // An highlighted blockssh -i ./id_rsa -N -L 3306:localhost:3306 -p 8848 root192.161.1.1对上述代码的 解释。 命令是一个SSH隧道命令&#xff0c;用于将本地端口3306转发到远程服务器上的3306端口。以下是命令的详细解释&#xff1a;ssh: 调用SSH客户端…

AI工作流:低代码时代的革新者,重塑手机问答类应用生态

在这个数字化迅猛发展的时代&#xff0c;低代码技术正以惊人的速度改变着我们的生活方式。作为低代码人群的先锋&#xff0c;AI工作流技术正在以前所未有的方式&#xff0c;赋予非技术人群实现梦想的能力 &#x1f525;能用AI-低代码传送门&#xff1a;https://www.nyai.chat …