微服务——服务保护Sentinel

雪崩问题

在单体项目里面,如果某一个模块出问题会导致整个项目都有问题。

在微服务项目里面,单独一个服务出问题理论上是不会影响别的服务的。 但是如果有别的业务需要调用这一个模块的话还是会有问题。  

问题产生原因和解决思路

最初那只是一个小小的故障。后来随着调用的服务越来越多,然后等待时消耗完了系统资源,然后就集体蹦了。

解决方案

高并发引发的问题可以通过限流解决.

请求限流用于避免服务故障。

线程隔离用于避免故障扩散.限制了线程数之后这个服务就不会因为调用别的服务导致自身资源消耗殆尽。

 为了防止线程资源一直被占用,这里还要做一个服务熔断,让出线程给别的服务。

发生熔断时直接走提前编写的fallback逻辑。这个就是服务降级。舍弃一部分保证整个微服务群的健康。

技术实现

Sentinel

初识sentinel

可以在控制台去配置限流规则,熔断规则等等。

Sentinel 的使用可以分为两个部分:

  • 核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。在项目中引入依赖即可实现服务限流、隔离、熔断等功能。

  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

 利用给好的jar包,在命令行用如下命令启动

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

访问http://localhost:8090页面,就可以看到sentinel的控制台了:

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

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

 

微服务整合

访问一次之后,就可以顺利被监控了。 

docker部署

拉取镜像

docker pull docker.io/bladex/sentinel-dashboard

创建容器

docker run --name sentinel -d -p 8858:8858 -d 镜像id

然后剩下的就是改改ip+端口,都是和上面一样的使用方法。

这个东西应该就是让微服务自己把自己的状况快照发送到sentinel,然后由sentinel根据定义的规则决定是否限流熔断等等。不是由sentinel主动发起监控,不然云服务器里面的sentinel怎么可能监控的到我本地的运行项目。

tmd,搞错了。这个玩意没办法从云端监控我的本地项目,只有第一次是本地项目主动发起的。剩下的都是要由sentinel发起监控.

请求限流

快速入门

可以看见,设置每秒一条之后,多出的请求会被sentinel拦截。 

添加一个每秒10的阈值之后使用jmeter进行50条线程2s内跑完的任务进行压力测试。

结果无误,2s内只有20条请求正常响应,剩下的全都被异常处理了。

流控模式

关联 

关联模式:这个模式是在某两个业务差不多同时发生时,通过限流其中一个业务的方式为另一个业务让行。 

 然后给query加流控规则,当update1s超过5个请求时对query限流。

jmeter测试,1000个线程100s执行完,也就是每秒10个请求.  可以的看见query被限流了。

链路

sentinel默认只会监控controller的资源,所以要用到sentinel的注解。

 链路模式中,是对不同来源的两个链路做监控。但是sentinel默认会给进入SpringMVC的所有请求设置同一个root资源,会导致链路模式失效。

 重新配置之后可以看见,service层的资源也被监控了。为其中一个goods设置流控。

流控效果

warm up

使用jmeter进行200个线程20s的压测,初始时成功的只有3个,说明初始阈值就是3,20s里后面每一秒内能通过的线程数也是组件上升。

排队等待

 

使用jemter进行300个线程20s执行完的压测,qps是15.可以看见,后面大多数请求的响应时间都是接近5s了。这里起到了一个流量整形的作用。

热点参限流

 只有那些通过@SentinelResource注解配置的资源才有效。

 所以要现在controller的资源上面添加注解。

重启后可以看见hot的簇点链路。

 在左侧的热点规则那里进行配置才会有高级选项.然后如下配置

使用jmeter发起3个500线程100s的请求,分别对应三种参数,qps为5.

然后结果如下,jmeter中101的是每秒2个成功,102是每秒4个,103是全部。

隔离和降级

FeginClient整合Sentinel

例如在查询订单的时候,会发起远程调用去查询用户信息。这里就可以编写调用失败后的降级逻辑。

 这里启动时会有一个循环依赖的错误。

这里要在order-service服务里面自动注入UserClient时加上@Lazy注解。

或者是在启动类里添加@ComponentScan来扫描feign的包.两个方法都可以

    @Autowired@Lazyprivate UserClient userClient;

这里运行时也还是会有循环依赖的报错.要将父工程里面的springcloud版本号改成SR8。这次才是真正解决问题.加上@Lazy只是延迟问题发生的时机。

这次在service层的hot下终于可以看见利用feign发起远程调用的接口了。

 

线程隔离(舱壁模式)

低扇出就是这个服务需要调用的服务较少。

线程池的做法是会开启独立线程的,而信号量的做法则不会。

 

在jmeter中开启10个线程要求0s内完成。理论上是由8个线程会被拒绝的.

但是因为前面做了降级处理,会返回一个空对象而不是报错所以在控制台才可以看见报错的日志信息。不多不少,正好8个. 

 

熔断降级

下面是sentinel断路器的三个状态和状态之间的切换。需要配置的两个重要参数有,熔断持续时间和熔断的阈值。

慢调用  

 

发生熔断之后成功阻塞了这个接口。 

异常比例、异常数
 

 

授权规则

 

测试,然后尝试直接访问order-service时就会报错.

然后通过gateway网关访问就可以正常访问

自定义异常结果

修改返回的限流异常为授权拦截.

通过实现下面的接口将所有不同类型的异常分别处理。

 

@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {String msg = "未知异常";int status = 429;if (e instanceof FlowException) {msg = "请求被限流了";} else if (e instanceof ParamFlowException) {msg = "请求被热点参数限流";} else if (e instanceof DegradeException) {msg = "请求被降级了";} else if (e instanceof AuthorityException) {msg = "没有权限访问";status = 401;}response.setContentType("application/json;charset=utf-8");response.setStatus(status);response.getWriter().println("{\"msg\": " + msg + ", \"status\": " + status + "}");}
}

规则持久化

sentinel把规则保存在内存里,重启就会自动丢失。

规则管理模式

实现push模式

一、修改order-service服务

1.引入依赖

在order-service中引入sentinel监听nacos的依赖:

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2.配置nacos地址

在order-service中的application.yml文件配置nacos地址及监听的配置信息:

spring:cloud:sentinel:datasource:flow:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-flow-rulesgroupId: SENTINEL_GROUPrule-type: flow # 还可以是:degrade、authority、param-flow

flow是持久化的,defrade是降级的

二、修改sentinel-dashboard源码

SentinelDashboard默认不支持nacos的持久化,需要修改源码。

tmd,看着教程巨几把麻烦,以后用服务器厂商提供的应该也不用我来搞这些,就不做了,以后有需求再来看吧.

可以看见最后实现效果如下,在指定页面添加的规则就会自动持久化到nacos.

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

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

相关文章

ChatGPT 应用开发(一)ChatGPT OpenAI API 免代理调用方式(通过 Cloudflare 的 AI Gateway)

前言 开发 ChatGPT 应用&#xff0c;我觉得最前置的点就是能使用 ChatGPT API 接口。首先我自己要能成功访问&#xff0c;这没问题&#xff0c;会魔法就可以本地调用。 那用户如何调用到我的应用 API 呢&#xff0c;我的理解是通过用户能访问到的中转服务器向 OpenAI 发起访问…

成都工业学院Web技术基础(WEB)实验四:CSS3布局应用

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

Echarts 环形图配置 环形半径(radius) 修改文本位置(label) 南丁格尔图(roseType)

数据 const data [{ name: 华为, value: 404 },{ name: 小米, value: 800 }, { name: 红米, value: 540 }, { name: 苹果, value: 157 }]设置南丁格尔图 roseType: area设置标签位置 label: {show: true,position: center // center 中间展示 outside 外侧展示 inside 内侧…

C语言动态内存经典笔试题分析

C语言动态内存经典笔试题分析 文章目录 C语言动态内存经典笔试题分析1. 题目一2. 题目二3. 题目三4. 题目四 1. 题目一 void GetMemory(char *p){p (char *)malloc(100);} void Test(void){char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str)…

Qt设置类似于qq登录页面

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QWindow> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton>QT_BEGIN_NAMESPACE namespace Ui { class…

数据分析基础之《numpy(2)—ndarray属性》

一、ndarray的属性 1、属性方法 属性名字属性解释ndarray.shape数组维度的元组&#xff08;形状&#xff09;ndarray.ndim数组维数ndarray.size数组中的元素数量ndarray.itemsize一个数组元素的长度&#xff08;字节&#xff09;ndarray.dtype数组元素的类型使用方法 数组名.…

大数据技术8:StarRocks极速全场景MPP数据库

前言&#xff1a;StarRocks原名DorisDB&#xff0c;是新一代极速全场景MPP数据库。StarRocks 是 Apache Doris 的 Fork 版本。StarRocks 连接的多种源。一是通过这个 CDC 或者说通过这个 ETL 的方式去灌到这个 StarRocks 里面&#xff1b;二是还可以去直接的和这些老的 kafka 或…

03-详解Nacos注册中心的配置步骤和功能

Nacos注册中心 服务注册到Nacos Nacos是SpringCloudAlibaba的组件也遵循SpringCloud中定义的服务注册和服务发现规范,因此使用Nacos与使用Eureka对于微服务来说并没有太大区别 主要差异就是依赖不同,服务地址不同 第一步: 在父工程cloud-demo模块的pom.xml文件中引入Spring…

nlkt中BigramAssocMeasures.pmi()方法的传参和使用

这个问题找遍全网没看到详细的介绍&#xff0c;最后用读代码数学公式的方法才理解怎么用。 BigramAssocMeasures.pmi 作用&#xff1a;计算x和y的互信息&#xff08;互信息是什么我就不科普啦&#xff09; 这里有个误区刚开始我以为是计算两个词之间的依赖程度&#xff0c;但…

flstudio21.3.2304高级版水果编曲音乐软件

flstudio高级版是一款适用于广泛领域的音频编辑软件。它支持多通道混音器和VST插件&#xff0c;包括数百种乐器和效果插件。它还为您提供了一个乐谱编辑器&#xff0c;需要对不同乐器的节奏进行必要的编辑。Flstudio具有许多内置电子合成声音&#xff0c;可提供更广泛的电子声音…

【Spring教程25】Spring框架实战:从零开始学习SpringMVC 之 SpringMVC入门案例总结与SpringMVC工作流程分析

目录 1.入门案例总结2. 入门案例工作流程分析2.1 启动服务器初始化过程2.2 单次请求过程 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装Mave…

Spring 面向切面编程(AOP)

一、aop介绍 &#xff08;一&#xff09;前言 一般的后端开发流程是纵向开发&#xff0c;就是controller&#xff08;控制层&#xff09;->service&#xff08;业务层&#xff09;->mapper&#xff08;数据持久层&#xff09;&#xff0c;Spring采用动态代理技术可以在…

Wireshark添加自定义协议解析

最终效果如下&#xff1a; 参考文档&#xff1a;https://mika-s.github.io/topics/ 此参考文档中7个例子教我们如何编写lua脚本去识别我们自定义的协议 安装Wireshark https://www.wireshark.org/上下载安装包安装即可。我的安装路径是D:\Install\Wireshark&#xff0c;在W…

Leetcode—389.找不同【简单】

2023每日刷题&#xff08;五十五&#xff09; Leetcode—389.找不同 实现代码 char findTheDifference(char* s, char* t) {int len strlen(s);int len2 len 1;int a[26] {0};int b[26] {0};if(len 0) {return t[0];}for(int i 0; i < len; i) {int idx s[i] - a;…

HTML的img常见应用属性

1、src&#xff1a;指定图像的URL&#xff0c;即图像的路径。 2、alt&#xff1a;指定图像的替代文本&#xff0c;当图像无法显示时&#xff0c;会显示替代文本。 3、width&#xff1a;指定图像的宽度&#xff0c;可以使用像素值或百分比。 4、height&#xff1a;指定图像的…

【设计模式--创建型--建造者模式】

建造者模式 建造者模式概述结构结果优缺点使用场景 将上述案例改为链式调用结果 建造者模式 概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构建&#xff08;由Builder来负责&#xff09;和装配&#xff08;由Direct…

办公word-从不是第一页添加页码

总结 实际需要注意的是&#xff0c;分隔符、分节符和分页符并不是一个含义 分隔符包含其他两个&#xff1b;分页符&#xff1a;是增加一页&#xff1b;分节符&#xff1a;指将文档分为几部分。 从不是第一页插入页码1步骤 1&#xff0c;插入默认页码 自己可以测试时通过**…

win11 powershell conda 激活环境后不显示环境名称

win11 powershell conda 激活环境后不显示环境名称 问题现象解决方法 问题现象 安装 Anaconda 后在 powershell 中激活环境后&#xff0c;命令行前面不显示环境名称 解决方法 在 powershell 中执行 conda init 重新打开 poweshell 出现以下问题&#xff0c;请参考 win11 p…

HarmonyOS鸿蒙应用开发——HTTP网络访问与封装

文章目录 基本使用封装参考 基本使用 鸿蒙应用发起HTTP请求的基本使用&#xff0c;如下&#xff1a; 导入http模块创建httpRequest对象发起http请求&#xff0c;并处理响应结果 第一、导入http模块&#xff1a; import http from ohos.net.http第二、创建httpRequest对象&a…

二分查找|滑动窗口|前缀和|LeetCode209: 长度最小的子数组

长度最短的子数组 作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 滑动窗口 题目 给定一个含有 n 个正整数的数组和一个正整数 target…