微服务——服务保护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
    @Lazy
    private UserClient userClient;

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

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

 

线程隔离(舱壁模式)

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

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

 

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

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

 

熔断降级

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

慢调用  

 

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

异常比例、异常数
 

 

授权规则

 

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

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

自定义异常结果

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

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

 

@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {
    @Override
    public 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-rules
            groupId: SENTINEL_GROUP
            rule-type: flow # 还可以是:degrade、authority、param-flow

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

二、修改sentinel-dashboard源码

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu创建apt-mirror本地仓库

首先创建apt-mirror的服务端&#xff0c;也就是存储所有apt-get下载的文件和依赖。大约需要300G&#xff0c;预留400G左右空间就可以开始了。 安装ubuntu省略&#xff0c;用的是ubuntu202204 ubuntu挂载硬盘&#xff08;不需要的可以跳过&#xff09;: #下载挂载工具 sudo apt…

数据库——存储过程及游标

智能2112杨阳 一、目的与要求&#xff1a; 1、掌握存储过程的工作原理、定义及操作方法 2、掌握函数的工作原理、定义及操作方法 3、掌握游标的工作原理、定义及操作方法 二、内容&#xff1a; 1. 创建存储过程&#xff0c;用来自动统计给定订单号的订单总金额 源码&…

SpringBoot - 事件机制使用详解(ApplicationEvent、ApplicationListener)

SpringBoot - 事件机制使用详解&#xff08;ApplicationEvent、ApplicationListener&#xff09; Spring 事件机制使用观察者模式来传递事件和消息。我们可以使用 ApplicationEvent 类来发布事件&#xff0c;然后使用 ApplicationListener 接口来监听事件。当事件发生时&#…

使用ThreadLocal.withIniti避免初始化为null问题

问题描述 我们在使用threadLocal的时&#xff0c;使用ThreadLocal.withInitial去初始化而不是使用new ThradLocal去初始化&#xff0c;这是为什么呢&#xff1f; 问题例子 比如说&#xff0c;假设我们想要在每个线程中维护一个独立的计数器 import java.util.concurrent.at…

Node.js创建一个简单的WebSocket接口,实现通信交互

Node.js创建一个简单的WebSocket接口&#xff0c;实现通信交互 一、为什么使用WebSocket&#xff1f; WebSocket&#xff0c;最大特点就是&#xff0c;服务器可以主动向客户端推送信息&#xff0c;客户端也可以主动向服务器发送信息&#xff0c;是真正的双向平等对话&#xf…

C++从bing采集各行业的企业官网信息

作为一名合格的销售&#xff0c;除了自己的人脉&#xff0c;还应该有新鲜的客户加入并发掘。不管哪行哪业&#xff0c;知彼知己&#xff0c;方才能做到百战百胜。今天我就用我们的专业技能&#xff0c;让销售获取更多同行业的公开企业信息&#xff0c;让业绩顺风顺水。 通常在C…

【代码随想录算法训练营-第六天】【哈希表】242,349,202,1

242.有效的字母异位词 第一遍 思考 比较简单&#xff0c;用数组就能实现了 class Solution {public boolean isAnagram(String s, String t) {int[] checkListi new int[256];int[] checkListj new int[256];for (int i 0; i < s.length(); i) {char checkChar s.ch…

修改Docker0和容器的地址

修改Docker0和容器的地址 1. 需求 默认服务器安装完Docker-ce后会给docker0分配172.17.0.1/16地址. 公司新接入一个网段正好与172.17.0.1/16冲突,此时访问这台服务器的容器时就会发生网络不可达. 2. 解决方法 修改/etc/docker/daemon.json 加入一个自定义网段 vim /etc/d…

基于单片机的智能小车 (论文+源码)

1. 系统设计 此次可编程智能小车系统的设计系统&#xff0c;结合STM32单片机&#xff0c;蓝牙模块&#xff0c;循迹模块&#xff0c;电机驱动模块来共同完成本次设计&#xff0c;实现小车的循迹避障功能和手机遥控功能&#xff0c;其整体框架如图2.1所示。其中&#xff0c;采用…

剧本杀小程序成为创业者新选择,剧本杀小程序开发

剧本杀作为现下年轻人最喜欢的新兴行业&#xff0c;发展前景非常乐观&#xff0c;即使剧本杀目前处于创新发展阶段&#xff0c;但剧本杀行业依然在快速发展中。 根据业内数据&#xff0c;预计2025年剧本杀市场规模能达到四百多亿元。市场规模的扩大自然也吸引来了不少的创业者…

利用机器学习实现客户细分的实战

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下机器学习实战中的案例&#xff1a;创建客户细分&#xff0c;在此过程中也会补充很多重要的知识点&#xff0c;欢迎大家一起前来探讨学习~ 一、导入数据 在此项目中&#xff0c;我们使用 UCI 机器学习代码库…

1+X大数据平台运维职业技能等级证书中级

该部分是选择题部分&#xff0c;实操题在主页的另一篇文章 考试名称&#xff1a;“1X”大数据平台运维职业技能等级证书&#xff08;中级&#xff09; 1X 大数据平台运维中级测试题一、单选题 以下哪种情况容易引发 HDFS 负载不均问题&#xff1f;&#xff08; C&#xff09…

定制软件开发的 5 个挑战

对于大公司来说&#xff0c;定制软件开发就像是眼中钉。无论您是要创建内部使用的工具、自动化手动流程还是推出新产品&#xff0c;从头开始构建它历来都是昂贵且危险的。花钱购买领先的现成解决方案之一&#xff0c;却不得不花费更多的时间和金钱对其进行定制来完成工作&#…

绿萝送温暖,扫雪助出行

今冬的大雪如约而至&#xff0c;给居民的出行带来诸多不便&#xff0c;为保障居民安全出行&#xff0c;绿萝志愿服务队第一时间召集志愿者参与扫雪铲冰工作。2023年12月13日&#xff0c;志愿者在房山城关街道青年北路园林所门口、星城生活区等地进行了志愿扫雪活动。 大雪把街道…

SQL自学通之函数 :对数据的进一步处理

目录 一、目标 二、汇总函数 COUNT SUM AVG MAX MIN VARIANCE STDDEV 三、日期/时间函数 ADD_MONTHS LAST_DAY MONTHS_BETWEEN NEW_TIME NEXT_DAY SYSDATE 四、数学函数 ABS CEIL 和FLOOR COS、 COSH 、SIN 、SINH、 TAN、 TANH EXP LN and LOG MOD POW…

为pixhawk4添加外置adis16470传感器

编译驱动 make px4_fmu-v5_default boardconfig在MavLink控制台 adis16470 start -S可以看到IMU3

图像特征提取-角点

角点特征 大多数人都玩过拼图游戏。首先拿到完整图像的碎片&#xff0c;然后把这些碎片以正确的方式排列起来从而重建这幅图像。如果把拼图游戏的原理写成计算机程序&#xff0c;那计算机就也会玩拼图游戏了。 在拼图时&#xff0c;我们要寻找一些唯一的特征&#xff0c;这些…

MCU平台下一种简单的文件系统设计构想

本文介绍MCU平台下一种简单的文件系统设计构想。 在使用MCU的项目中&#xff0c;经常会涉及到一些数据的存储&#xff0c;受限于硬件&#xff0c;又不太可能直接上文件系统&#xff08;如FAT文件系统&#xff09;&#xff0c;直接指定存储地址&#xff0c;数据长度对数据进行读…

HDPE硅芯管强度高,抗压抗张和抗冲击强,外层不需其它套管

HDPE硅芯管是一种高性能的管道材料&#xff0c;具有强度高、抗压抗张和抗冲击强的特点。这种管道材料采用高密度聚乙烯&#xff08;HDPE&#xff09;作为基础材料&#xff0c;并添加了硅质增强剂&#xff0c;使得管道具有优异的力学性能和耐久性。 HDPE硅芯管的强度高&#xf…

大数据CloudSim应用实践

CloudSimExampleA.java 1准备 1.1操作系统 本实验在Windows 7 或Windows 10系统运行均可。 1.2软件 cloudsim-3.0.3.zip&#xff1b; commons-math3-3.2-bin.zip&#xff1b; jdk-8u152-windows-x64.exe&#xff1b; eclipse-jee-neon-3-win32-x86_64 所需资料链接&#xff1…