大白话实战Sentinel

Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Sentinel的控制台,在可视化界面进行配置,我们把这些保护策略可以称为规则,配置的这些保护规则也可以存储到Zookeeper、Nacos等等具有配置中心功能的中间件中,而且Sentinel还配置了多种微服务架构,比如SpringCloud、Dubbo等,如下图所示:
在这里插入图片描述
我们可以看一下Sentinel的工作原理,加上分布式系统中有很多微服务,每个微服务中都有很多资源需要我们进行保护,什么是资源呢,其实万物皆可为资源,它可以是一个HTTP请求,也可以是一个远程调用,或者是一段业务逻辑代码,也可以是访问数据库的一些方法,每个应用都有非常多的资源,我们只需要引入Sentinel客户端,这些客户端就可以连上Sentinel的控制台,在Sentinel控制台里面可以对每一种资源的规则进行定义,比如限流规则,熔断降级规则,黑白名单等等,当然这些规则一般由运维人员进行定义,定义的这些规则可以存储到Nacos、Zookeeper等这些配置中心,当然存在内存也没问题,只不过重启就失效了,而且如果这些规则发生了变更,Sentinel控制台还可以实时把这些规则推送给每个微服务,这样我们每次访问资源的时候,Sentinel客户端就会来检测每种资源的规则,然后判断是不是违背这些规则,如果没有违背则放行,如果违背就拒绝服务,通过这种手段来保护系统的稳定性,架构原理图如下:
在这里插入图片描述
在这个图里面和我们编码相关的就两个,一个是资源,一个是规则。

而使用Sentinel想要定义一个资源也非常简单:
在这里插入图片描述
定义好了资源,就需要在Sentinel的控制台来定义保护这些资源的规则,Sentinel提供了上面的规则,第一种流量控制,就是我们常说的限流,比如请求量一大,如果我们把所有请求都接收过来在后台进行处理,有可能导致这个微服务所在的机器资源耗尽,所以可以对请求进行限流,比如每秒只允许通过100个请求,超出的请求全部拒绝掉,这样的话,即使上万并发,后台也只处理100个,不至于后台崩了。第二种规则叫熔断降级,这就是防服务雪崩的,而且在OpenFeign的时候也演示了一旦远程调用失败去走兜底数据。第三种规则叫系统保护,可以根据当前机器是CPU负载、内存使用率,看到CPU太忙了,可以限制请求流量进入。第四种规则叫来源访问控制,只允许哪些上游来访问下游资源。第五种规则叫定义热点参数,这个后面细说。

总之一句话,想要使用Sentinel,你要想清楚要保护哪些资源,这些资源怎么找到,是通过自动适配发现的还是通过编程定义的还是声明式的。有了这些资源后,再定义各种保护规则,当这两个定义好后,Sentinel就可以进行工作了。

它的工作原理是,用户去来访问一个资源,比如访问一个HTTP请求,假设就是创建订单,而这些资源我们给它定义了一个规则,每次访问的时候Sentinel就会检查这些规则,假设我们定义一个流量控制规则,每秒只能通过一个请求,对于这个规则的检查就会出现两种情况,是否违法了这些规则,如果没有违法这次请求就放行,如果违反了这些规则,Sentinel就会抛出异常,对于这个异常我们就要进行针对性的处理,这就要看我们有没有编写兜底处理的方法,如果没有就抛出错误,如果编写了兜底处理,比如OpenFeign的fallback兜底回调,就会返回兜底数据。详细流程如下图:
在这里插入图片描述

通过这个原理图我们知道,在Sentinel的使用中我们关注三点,第一点怎么定义一个资源,第二点定义资源的保护规则,第三点一旦违反了规则,怎么处理异常。

整合-基础场景

先做第一步,启动一个Sentinel Dashboard控制台,方便我们在控制台定义控制资源的一些规则,在官网下载sentinel-dashboard-1.8.8.jar ,然后启动 sentinel-dashboard:
在这里插入图片描述
启动后访问:
在这里插入图片描述

默认账号和密码都是sentinel。
在这里插入图片描述
因为还没有任何微服务接入sentinel,所以在控制台里面没有显示任何数据,接入后就会有所有的微服务列表。

第二步,给微服务整个sentinel场景,并配置链接上sentinel控制台,那这个应用的所有资源,通过注解或代码埋点的这些资源,都可以在控制台定义它们的规则。

我们之前在学习OpenFeign的时候,由于已经整合了sentinel,只不过当时sentinel依赖只放到了order里面,由于每个微服务都需要被保护起来,所以我们直接在services里面统一引入sentinel依赖。引入好依赖,这样每个微服务都需要配置连接上sentinel控制台,我们在order配置文件中配置连接sentinel的地址:
由于sentinel默认用的是懒加载机制,整合之后,只有我们访问了请求,控制台才能显示出应用的信息,所以为了方便起见,可以让它提前加载,在sentinel配置中把eager设置为true,就可以项目一启动,自动连上sentinel控制台:

spring:
  cloud:
    openfeign:
      client:
        config:
          default:
            logger-level: full
            connect-timeout: 1000
            read-timeout: 2000
          service-product:
            logger-level: full
            connect-timeout: 3000
            read-timeout: 5000
    sentinel:
      transport:
        dashboard: localhost:8080
      eager: true
#            response-interceptor:
#              com.example.order.interceptor.XTokenRequestInterceptor
#            retryer: feign.retryer.Default

feign:
  sentinel:
    enabled: true

每个服务都配置好即可。

然后我们启动订单和商品两个微服务。首先看它们能不能连上sentinel控制台,将自己的应用信息正确显示,启动后刷新控制台:
在这里插入图片描述
这样在这个控制台里面就可以配置很多的规则,但是这些规则都是对资源配置的,那什么是资源呢?我们一起来看看它的默认行为,它把系统所有web接口都认为的资源,包括openfeign的远程调用也认为的一个资源,或者我们用注解和编程的方式都可以定义资源,那么接下来就以创建订单为例,由于创建订单是一个web请求,所以谁来发送web请求,会走创建订单服务,创建订单服务里面又会远程调用查询商品,假设认为创建订单这个方法是一个资源,我将来想保护它,对它进行一些流控等一些设置,那么可以用最简单的方式,使用一个注解叫@SentinelResource(value = “createOrder”)
在这里插入图片描述
重新启动订单服务,然后发送一个创建订单的请求:
在这里插入图片描述

在sentinel控制台有个簇点链路就会看到这个调用过程:
在这里插入图片描述
首先我们发送了一个create请求,它认为create是一个资源,create里面又调用了createOrder,它认为这个也是一个资源,这个资源是我们通过注解定义的,而create请求是sentinel自动勘测的一个web接口,而在createOrder里面又调用了商品的接口,也是可以被控制的资源。只要有了这些资源,我们可以对任意资源进行控制各种规则,我们先来测试流控:
在这里插入图片描述
点击新增后就可以在流控规则中看到了:

在这里插入图片描述

我们先测试一下,如果刷慢一点,每秒访问一个,发现都正常:

在这里插入图片描述

如果我刷新快一点,就返回一个默认错误:
在这里插入图片描述

异常处理-web接口

从上面可以看到sentinel每秒只会放行1个请求,放行的请求才会执行目标方法的创建订单,而被阻塞的请求,目标方法是不会被执行的,这样就不会占用系统资源,即使高并发的请求,只有少量的目标方法执行,那就不会导致服务雪崩的问题,但是现在还有一个问题,如果一旦请求被限制后,返回的是默认sentinel错误提示页,而我们一般大型的系统都是前后分离的,后台微服务要给前端返回json数据,这就牵扯到sentinel的异常处理机制,在sentinel里面异常处理是一个比较复杂的流程,
在这里插入图片描述

如果我们想要改掉默认的web页面显示的异常信息,就要自定义一个BlockExceptionHandler,我们先来解决web接口的异常处理方式。我们自己写一个BlockExceptionHandler,只要把它放到容器中就可以生效:
在这里插入图片描述

我们先在model模块中自定义一个通用的返回对象R:

package com.example.common;

import lombok.Data;

@Data
public class R {
   
    private Integer code;
    private String msg;
    private Object data;

    public static R ok() {
   
        R r = new R();
        r.setCode(200);
        return r;
    }

    public static R ok(String msg, Object data) {
   
        R r = new R();
        r.setCode(200);
        r.setMsg(msg);
        r.setData(data);
        return r;
    }

    public static R error() {
   
        R r = new R();
        r.setCode(500);
        return r;
    }


    public static R error(Integer code, String msg) {
   
        R r = new R();
        r.setCode(

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

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

相关文章

【C语言】C语言 哈夫曼编码传输(源码+数据文件)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 C语言 哈夫曼编码传输(源码数据文件&am…

用命令模式设计一个JSBridge用于JavaScript与Android交互通信

用命令模式设计一个JSBridge用于JavaScript与Android交互通信 在开发APP的过程中,通常会遇到Android需要与H5页面互相传递数据的情况,而Android与H5交互的容器就是WebView。 因此要想设计一个高可用的 J S B r i d g e JSBridge JSBridge,不…

3月营销日历:开启春日盛宴,绽放生活魅力

关键营销节点∶惊蛰、女生节、妇女节、 植树节、315消费者权益日、春分 营销关键词 养生、女生魅力、感恩女性、环保、品质 01.重点关注品类 春季服饰:如轻薄外套、春装等,适合惊蛰后的市场需求; 美妆护肤:妇女节期间&#xf…

GPT-SoVITS更新V3 win整合包

GPT-SoVITS 是由社区开发者联合打造的开源语音生成框架,其创新性地融合了GPT语言模型与SoVITS(Singing Voice Inference and Timbre Synthesis)语音合成技术,实现了仅需5秒语音样本即可生成高保真目标音色的突破。该项目凭借其开箱…

AI芯片:科技变革的核心驱动力

近年来,人工智能(AI)的飞速发展对众多行业产生了深远影响,芯片领域也不例外。AI在芯片设计、制造及应用等方面带来了革新性的改变,成为推动芯片行业发展的关键力量。 AI助力芯片设计效率飞升 传统芯片设计极为复杂&am…

【phpstudy】关于实现两个不同版本的mysql并存。

1.首先是先安装好两个版本的mysql mysql5.7用默认的就行 2.更改mysql8.0的配置,如图 3.找到mysql8.0的路径,看着个里面就可以知道了 4.进入后,可以把data里面的数据情况,就是把data文件夹里的东西删除(我是先备份好了一…

Coze扣子新功能详解

今晚(2025-01-24)扣子再次进行更新 主要更新内容: 搭建小程序和 H5 用户界面时,支持使用音频组件播放音频内容 数据库操作体验提升 界面优化:对数据库详情界面进行了重新设计,并将工作流运行数据库的测试数据位置从原工作流底…

Pytorch深度学习教程_3_初识pytorch

欢迎来到《PyTorch深度学习教程》系列的第三篇!在前面的两篇中,我们已经介绍了Python及numpy的基本使用。今天,我们将深入探索PyTorch的核心功能,帮助你更好地理解和使用这个强大的深度学习框架。 欢迎订阅专栏: 深度…

第4章 信息系统架构(二)

4.2 系统架构 信息系统架构是一种体系结构,它反映了一个组织信息系统的各个组成部分之间的关系,以及信息系统与相关业务、信息系统与相关技术之间的关系。 4.2.1 架构定义 对于大规模的复杂系统来说,对总体的系统结构设计比起对计算算法和…

剑指 Offer II 024. 反转链表

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20024.%20%E5%8F%8D%E8%BD%AC%E9%93%BE%E8%A1%A8/README.md 剑指 Offer II 024. 反转链表 题目描述 给定单链表的头节点 head ,请反转链表&#xff…

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表 链表是一种线性数据结构,由一系列按特定顺序排列的节点组成,这些节点通过指针相互连接。每个节点包含两部分:元素和指向下一个节点的指针。其中,最简单的形式是单向链表,每个节点含有一个信息域和一个指针域&…

Java开发实习面试笔试题(含答案)

在广州一家中大公司面试(BOSS标注是1000-9999人,薪资2-3k),招聘上写着Java开发,基本没有标注前端要求,但是到场知道是前后端分离人不分离。开始先让你做笔试(12道问答4道SQL题)&…

Docker:3、在VSCode上安装并运行python程序或JavaScript程序

1.VSCode上安装并运行python程序&#xff1a; 1.1.安装Docker插件 1.2.新建自动化脚本DockerFile FROM python:3.-slim-buster WORKDIR /app COPY .. RUN pip3 install -r requirements.txt CMD ["python3", "app.py"]COPY <本地路径><目标…

MOS管炸了,PWM“死区”时间得了解一下

从字面上来看“死区”的意思就是&#xff1a;如果处于这个区&#xff0c;那就会出现“损坏”的现象&#xff0c;直白点&#xff0c;就是“禁区”&#xff01; 实际应用中&#xff0c;比如大功率设备的电机&#xff0c;还有变频器等驱动电路&#xff0c;多部分都是采用MOS管和IG…

idea-代码补全快捷键

文章目录 前言idea-代码补全快捷键1. 基本补全2. 类型匹配补全3. 后缀补全4. 代码补全 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;…

保姆级教程:利用Ollama与Open-WebUI本地部署 DeedSeek-R1大模型

1. 安装Ollama 根据自己的系统下载Ollama&#xff0c;我的是Linux&#xff0c;所以我使用如下命令进行下载安装&#xff1a; curl -fsSL https://ollama.com/install.sh | sh2. 安装Open-WebUI 使用 Docker 的方式部署 open-webui &#xff0c;使用gpu的话按照如下命令进行 …

win10 系统 自定义Ollama安装路径 及模型下载位置

win10 系统 自定义Ollama安装路径 及模型下载位置 由于Ollama的exe安装软件双击安装的时候默认是在C盘&#xff0c;以及后续的模型数据下载也在C盘&#xff0c;导致会占用C盘空间&#xff0c;所以这里单独写了一个自定义安装Ollama安装目录的教程。 Ollama官网地址&#xff1…

以教代学——费曼学习法

本文是思维导图&#xff0c;算是费曼学习法精髓我的个人总结&#xff0c;如果条件允许的话可以去看看费曼自传性质的书&#xff0c;书名见文末。 《别闹了&#xff0c;费曼先生》&#xff1a;英文书名为《Surely Youre Joking, Mr. Feynman!》&#xff0c;这是一本自传性质的书…

JWT 令牌

目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言&#xff1a; 在现代Web应用和微服务架构中&#xff0c;用户身份验证和信息安全传输是核心问题。JSON Web Token&#xff08;J…

工控网络安全介绍 工控网络安全知识题目

31.PDR模型与访问控制的主要区别(A) A、PDR把对象看作一个整体 B、PDR作为系统保护的第一道防线 C、PDR采用定性评估与定量评估相结合 D、PDR的关键因素是人 32.信息安全中PDR模型的关键因素是(A) A、人 B、技术 C、模型 D、客体 33.计算机网络最早出现在哪个年代(B) A、20世…