当前位置: 首页 > news >正文

51.Sentinel微服务保护

目录

(1)初识Sentinel。

(1.1)雪崩问题及解决方案。

(1.1.1)雪崩问题。

(1.1.2)解决雪崩问题的四种方式。

(1.1.3)总结。

(1.2)服务保护技术对比。

(1.3)Sentinel介绍和安装。

(1.4)微服务整合Sentinel。

(2)流量控制。

(2.1)简单流控。

(2.2)流控模式(直接、关联、链路)。

(2.3)流控效果(快速失败、warm up、排队等待)。

(2.4)热点参数限流。 

(3)线程隔离、熔断降级。

​编辑 (3.1)FeignClient整合Sentinel。

(3.2)线程隔离(舱壁模式)(线程池隔离、信号量隔离)。

(3.3)熔断降级(慢调用、异常比例、异常数)。

​编辑

(4)授权规则。

(4.1) 授权规则。

(4.2)自定义异常结果。

(4.3)总结。

(5) 系统规则。

(6)规则持久化。

(6.1)规则管理模式。

(6.2)实现push模式。

(7)浏览器清除缓存的技巧。


(1)初识Sentinel。

(1.1)雪崩问题及解决方案。

(1.1.1)雪崩问题。

雪崩:一个微服务A依赖(即发送请求,等回应)于另一个微服务B,如果B出现故障,没有回应,则A的这条访问就不会结束(请求不释放),等到微服务A的请求资源都用完后,A也废了(所有访问资源都被占用了)。然后一些微服务依赖服务A的,也得不到A的回应,也跟着废了。这就是雪崩,因为一个微服务出现故障,导致凡是依赖于它的微服务也出现故障。

(1.1.2)解决雪崩问题的四种方式。

提示:前三种是处理出现故障的微服务避免故障传递从而导致雪崩,第四种是预防雪崩,就是还没发生故障的。

(1.1.3)总结。

(1.2)服务保护技术对比。

(1.3)Sentinel介绍和安装。

开启的效果如下(部分截图): 


(1.4)微服务整合Sentinel。

提示:整合好之后,启动项目后,需要访问过服务器之后,在sentinel里面才能看到显示 。

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


(2)流量控制。

(2.1)简单流控。

每一个端点(Endpoint):可以理解成controller中的每个方法。

QPS 是 "Queries Per Second"(每秒查询数)的缩写:即每秒的请求量。

并发量:表示系统在同一时刻需要处理的请求总数。

提示:被请求过的方法才会被监控到,想要监控它,先请求它。


请求效果如下:每秒访问10次,5次成功,5次失败。 

(2.2)流控模式(直接、关联、链路)。

链路:就是对请求来源进行限流。(例如:有ABC三个资源,A和B都要访问C,在统计资源C的时候,只统计某个入口资源,如A或B,如果超过阈值,则限流C)

特别说明:

 如果不关闭这个,则所有controller中的方法访问service服务层的该监控方法时,都认为是同一个来源,所以就起不到链路的作用。(需要要配这个参数,不然链路模式不起作用)


以下是关联模式达到阈值后的限流:

(2.3)流控效果(快速失败、warm up、排队等待)。

warm up也叫预热模式:作用就是给刚启动的服务器一些缓冲的时间,让服务器刚开始时处理的请求少一些,然后慢慢增加到正常数量。(初始化QPS是3,然后慢慢增加,达到预热时间后,QPS就变成设置值的QPS了)

排队等待:如果设置的超时时间是5秒,而每秒只能处理10个,那么队列只能放50个。(例如,空闲服务器突然1秒内有60个请求,处理10个,50个放进队列,都能处理完。若是1秒内61,那么有一个不能进入队列,直接返回异常。) (计算失败的请求数量:就是当多出来的超过队列最大容量时,则后面每秒只能进入每秒处理的请求个数,多出来的都会返回异常,例如:超时是5秒,每秒出来1个请求,我每秒请求2次,则第五秒正好队列排满,之后每秒只能进队列1个(每秒处理的个数),多出来的1个请求只能返回异常)。

(2.4)热点参数限流。 

热点参数限流对默认的SpringMVC资源无效:解决方法就是给springmvc的方法加上@SentinelResource("hot")注解,里面的hot是给这个资源起的名称。



(3)线程隔离、熔断降级。

线程隔离:就是给每个业务分配一定数量的线程, 即便某业务调用的服务器垮了,也能处理其他业务。

熔断降级:就是按访问的成功与失败的比例,如果失败比例过大,则禁止访问该业务。


 (3.1)FeignClient整合Sentinel。

我这里出现一个异常:

Caused by: java.lang.IllegalStateException: Incompatible fallbackFactory instance. Fallback/fallbackFactory of type class cn.itcast.feign.clients.fallback.UserClientFallbackFactory is not assignable to interface org.springframework.cloud.openfeign.FallbackFactory for feign client userservice

 解决办法:因为是版本不兼容,换个版本就行。

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

本来成功运行了,但是今天早上重新开启服务的时候有报错了:

解决方法是:把Hoxton.SR10换成Hoxton.SR8就可以成功启动服务器了

<!--        <spring-cloud.version>Hoxton.SR10</spring-cloud.version>--><spring-cloud.version>Hoxton.SR8</spring-cloud.version>

(3.2)线程隔离(舱壁模式)(线程池隔离、信号量隔离)。

(3.3)熔断降级(慢调用、异常比例、异常数)。

(4)授权规则。

(4.1) 授权规则。

授权规则:可以做身份验证,网关也可以身份验证,但是万一泄露了微服务的地址,那么别人可以绕过网关,直接访问微服务,该授权规则就是拦截不是从网关过来的请求。

解析:下方的流控应用填写的名称是实现的RequestOriginParser接口的parseOrigin方法的返回值(当然也可以写其他,可操作空间挺大的),当返回值与流控应用的值一样时,则允许访问,否则拒绝访问。


(4.2)自定义异常结果。

FallbackFactory接口和BlockExceptionHandler接口是的区别:

  1. FallbackFactory接口:FallbackFactory接口通常用于实现服务降级的逻辑。当原始服务不可用时,fallback对象会代替原始服务进行处理,并返回预先定义的默认响应或错误信息。(用于远程调用feign,当feign出现异常或熔断隔离,就会调用这个接口的实现

  2. BlockExceptionHandler接口:BlockExceptionHandler接口通常用于处理限流和熔断的异常情况。BlockExceptionHandler接口允许自定义异常处理逻辑,在请求被限流或触发熔断时,可以定义如何处理这些异常情况。(只要不是远程调用,请求被sentinel限流授权等操作,就会调用该实现


(4.3)总结。

(5) 系统规则。

只对linux系统有用,对sentinel应用的主机进行保护措施。 

(6)规则持久化。

(6.1)规则管理模式。

(6.2)实现push模式。

注意:如果没变化的话,要清除缓存。

方法:开发者模式下,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除缓存并强制重新加载"选项。 

# 这里除了配置了flow还配了degrade,如果还要配其他的,就按照这个格式(把xxx换成需要配置的类型,有三个xxx)
spring:cloud:sentinel:datasource:flow:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-flow-rulesgroupId: SENTINEL_GROUPrule-type: flow # 还可以是:degrade、authority、param-flowdegrade:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-degrade-rulesgroupId: SENTINEL_GROUPrule-type: degrade # 还可以是:degrade、authority、param-flowxxx:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-xxx-rulesgroupId: SENTINEL_GROUPrule-type: xxx # 还可以是:degrade、authority、param-flow

sentinel的效果如下:只配置了持久化的流控规则。

 添加持久化的流控规则后,去nacos控制台看配置列表:多出了一个配置文件。

(7)浏览器清除缓存的技巧。

总结:开发者模式下,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除缓存并强制重新加载"选项。

Google Chrome浏览器:

  1. 在Chrome浏览器中,按下快捷键"Ctrl + Shift + I"(Windows)或"Cmd + Option + I"(Mac)打开开发者工具。
  2. 在开发者工具中,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除缓存并强制重新加载"选项。
  3. 或者,按下快捷键"Ctrl + F5"或"Shift + F5",这会强制刷新页面并清除缓存。

Mozilla Firefox浏览器:

  1. 在Firefox浏览器中,按下快捷键"Ctrl + Shift + I"(Windows)或"Cmd + Option + I"(Mac)打开开发者工具。
  2. 在开发者工具中,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除缓存和硬重载"选项。
  3. 或者,按下快捷键"Ctrl + F5"或"Shift + F5",这会强制刷新页面并清除缓存。

Microsoft Edge浏览器:

  1. 在Edge浏览器中,按下快捷键"Ctrl + Shift + I"(Windows)或"Cmd + Option + I"(Mac)打开开发者工具。
  2. 在开发者工具中,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除浏览器缓存"选项。
  3. 或者,按下快捷键"Ctrl + F5"或"Shift + F5",这会强制刷新页面并清除缓存。

相关文章:

  • 网络运维Day18
  • YOLOV5部署Android Studio安卓平台NCNN
  • 从零开始的C++(十七)
  • flask创建步骤
  • 利用 Pandoc + ChatGPT 优雅地润色论文,并保持 Word 公式格式:Pandoc将Word和LaTeX文件互相转化
  • 第八章 应用参数为约束建模 P1|系统建模语言SysML实用指南学习
  • 迭代新品 | 第四代可燃气体监测仪,守护燃气管网安全快人一步
  • qt-C++笔记之treeWidget初次使用
  • Sql Server 2017主从配置之:事务日志传送
  • P3879 [TJOI2010] 阅读理解- 字典树
  • Java方法中不使用的对象应该手动赋值为NULL吗?
  • JS 新操作符 —— “?.”、“??”、“??=”
  • Excel 文件比较工具 xlCompare 11.01 Crack
  • Python编程陷阱(五)
  • 【Java并发编程二】线程的基本知识
  • 【React系列】如何构建React应用程序
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • android图片蒙层
  • AWS实战 - 利用IAM对S3做访问控制
  • CODING 缺陷管理功能正式开始公测
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • golang中接口赋值与方法集
  • Javascript 原型链
  • JAVA多线程机制解析-volatilesynchronized
  • js面向对象
  • laravel 用artisan创建自己的模板
  • linux学习笔记
  • Octave 入门
  • Python打包系统简单入门
  • windows-nginx-https-本地配置
  • 初探 Vue 生命周期和钩子函数
  • 从输入URL到页面加载发生了什么
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 飞驰在Mesos的涡轮引擎上
  • 回顾 Swift 多平台移植进度 #2
  • 记一次和乔布斯合作最难忘的经历
  • 坑!为什么View.startAnimation不起作用?
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 一些css基础学习笔记
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 如何用纯 CSS 创作一个货车 loader
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (分布式缓存)Redis持久化
  • (七)Knockout 创建自定义绑定
  • (转)JAVA中的堆栈
  • (转)Unity3DUnity3D在android下调试
  • .Net 6.0 处理跨域的方式
  • .net 按比例显示图片的缩略图
  • .Net 代码性能 - (1)
  • .NET开发人员必知的八个网站