微服务组件Sentinel的学习(3)

Sentinel

  • 隔离和降级
    • Feign整合Sentinel
    • 线程隔离
    • 熔断降级
      • 熔断策略
  • 授权规则:
  • 自定义异常

隔离和降级

虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。而要将这些故障控制在一定范用避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级。

Feign整合Sentinel

步骤一:修改application.yml文件,开启Feign的Sentinel功能

  cloud:feign:sentinel:enabled: true

步骤二:给FeignClient编写失败后的降级逻辑
方式(1):FallbackClass,无法对远程调用的异常做处理
方式(2):FallbackFactory,可以对远程调用的异常做处理,

用FallbackFactory举例:
第一步:

public class UserClientFallbackFactory implements FallbackFactory<UserQuery> {@Overridepublic UserQuery create(Throwable throwable) {return new UserQuery() {@Overridepublic User findById(Long id) {log.error("查询用户失败!", throwable);return new User();}};}
}

第二步:

@Bean
public UserQueryFallbackFactory userQueryFallbackFactory(){return new UserQueryFallbackFactory();
}

第三步:

@FeignClient(value = "userservice", fallbackFactory = UserQueryFallbackFactory.class) 
public interface UserQuery {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

线程隔离

线程数:是该资源能使用的tomcat线程数的最大值。也就是通过限制线程数量,实现舱壁模式。下面图片中,就可以直接指定线程数。
在这里插入图片描述
线程隔离的两种手段是?
(1)信号量隔离
(2)线程池隔离
信号量隔离的特点是?
基于计数器模式,简单,开销小
线程池隔离的特点是?
基于线程池模式,有额外开销,但隔离控制更强

熔断降级

熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求,而当服务恢复时,断路器会放行访问该服务的请求。其主要分为以下几个状态:
在这里插入图片描述

熔断策略

断路器熔断策略有三种:慢调用异常比例异常数
慢调用:业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。例如:
在这里插入图片描述
RT超过500ms的调用是慢调用,统计最近1000ms内的请求,如果请求量超过10次,并且慢调用比例不低于0.5则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。

异常比例或异常数
异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。
在这里插入图片描述
统计最近1000ms内的请求,如果请求量超过10次,并且异常比例不低于0.5,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。

授权规则:

授权规则可以对调用方的来源做控制,有以下两种方式:
白名单:来源在白名单内的调用者允许访问
黑名单:来源在黑名单内的调用者不允许访问
在这里插入图片描述
Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的

public interface RequestOriginParser {    String parseOrigin(HttpServletRequest request);}

例如,尝试从request中获取一个名为origin的请求头,作为origin的值:

public class HeaderOriginParser implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {String origin = httpServletRequest.getHeader("origin");if(StringUtils.isEmpty(origin)){return "black";}return origin;}
}

还需要在gateway服务中,利用网关的过滤器添加名为gateway的origin头:

spring:cloud:gateway:default-filters: # 默认过滤器,会对所有的路由请求都生效- AddRequestHeader=origin, gateway # Sentinel授权规则,只有从网关服务的才合法,通过添加请求头标识

自定义异常

默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口:

@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 + "}");}
}

来源:B站黑马学习视频

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

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

相关文章

【LeetCode刷题笔记(7-1)】【Python】【四数之和】【哈希表】【中等】

文章目录 四数之和题目描述示例 1示例 2提示解决方案1&#xff1a;【四层遍历查找】解决方案2&#xff1a;【哈希表】【三层遍历】 结束语 四数之和 四数之和 题目描述 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件…

Logistic 回归算法

Logistic 回归 Logistic 回归算法Logistic 回归简述Sigmoid 函数Logistic 回归模型表达式求解参数 $\theta $梯度上升优化算法 Logistic 回归简单实现使用 sklearn 构建 Logistic 回归分类器Logistic 回归算法的优缺点 Logistic 回归算法 Logistic 回归简述 Logistic 回归是一…

uniapp播放 m3u8格式视频 兼容pc和移动端

支持全自动播放、设置参数 自己摸索出来的,花了一天时间,给点订阅支持下,订阅后,不懂的地方可以私聊我。 代码实现 代码实现 1.安装dplayer组件 npm i dplayer2. static/index.html下引入 hls 引入hls.min.js 可以存放在static项目hls下面<script src="/static…

error: src refspec master does not match any

新项目 push 至 github 仓库的时候抛出了如下异常 error: src refspec master does not match any 解决办法 首先,查看当前 branch, 因新项目只有一个 main git branch早期都是 master 而不是 main,所以将现有的改成 main 或者 master 均可 git branch -m main // 或者 git…

scipy.signal.hilbert和scipy.fftpack.hilbert的区别

提示&#xff1a;分析scipy.signal.hilbert和scipy.fftpack.hilbert在应用的区别 一、代码 import matplotlib import matplotlib.pyplot as plt import numpy as np from pyhht import EMD from scipy.signal import hilbert import tftb.processing from scipy import signa…

26种主流的神经网络偏微分方程求解方法汇总

偏微分方程&#xff08;PDE&#xff09;是数学中一门重要的分支&#xff0c;应用范围广泛涉及自然科学、工程技术、生物学领域等。然而我们都知道&#xff0c;偏微分方程的求解过程异常艰难&#xff0c;如果碰上了特别复杂的&#xff0c;传统的计算方法可能需要数百万个CPU小时…

网站服务器/域名/备案到底有什么关联?

​  在一个网站的组成中&#xff0c;网站服务器、域名、备案这几个要素是要被常提到的。在谈及三者关联之前&#xff0c;我们先了解下三者的各自概念。 域名&#xff1a;它是网站的唯一标识符&#xff0c;通俗理解来说就是用户在浏览器地址栏中输入的网址。一般来说&#xff…

自动驾驶技术:驶向未来的智能之路

导言 自动驾驶技术正引领着汽车产业向着更安全、高效、智能的未来演进。本文将深入研究自动驾驶技术的核心原理、关键技术、应用场景以及对交通、社会的深远影响。 1. 简介 自动驾驶技术是基于先进传感器、计算机视觉、机器学习等技术的创新&#xff0c;旨在实现汽车在不需要人…

DICOM 文件中,VR,VL,SQ,图像二进制的几个注意点

DICOM 文件的结构&#xff0c;在网上有很多的学习资料&#xff0c;这里只介绍些容易混淆的概念&#xff0c;作为回看笔记。 1. 传输语法 每个传输语法&#xff0c;起都是表达的三个概念&#xff1a;大小端、显隐式、压缩算法 DICOM Implicit VR Little Endian: 1.2.840.1000…

CSS基础面试题

介绍一下标准css盒子模型与低版本IE的盒子模型&#xff1f; 标准盒子模型&#xff1a;宽度内容的宽度&#xff08;content&#xff09; border padding margin 低版本IE盒子模型&#xff1a;宽度内容宽度&#xff08;contentborderpadding&#xff09; margin box-sizing 属性…

JOSEF 组合中间继电器 RXMM1-RK214003 DC220V 不带底座

系列型号 RXMM1 RK 214 002组合中间继电器&#xff1b;RXMM1 RK 214 003组合中间继电器; RXMM1 RK 214 004组合中间继电器&#xff1b;RXMM1 RK 214 005组合中间继电器; RXMM1 RK 214 006组合中间继电器&#xff1b; 1 用途 RXMM1系列组合中间继电器用于电力系统二次回路及…

01-EEA电子电器架构

1.背景 汽车正在从传统的机械装置逐步电气化&#xff0c;汽车电子电气功能不断的丰富。越来越多的电气系统和功能被集成到汽车上&#xff0c;传统的原理及线束设计已经远远不能满足。为此&#xff0c;EEA(电子电气架构)应运而生。如何设计电子电气架构&#xff0c;满足日益增长…