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

【微服务】Feign 整合 Sentinel,深入探索 Sentinel 的隔离和熔断降级规则,以及授权规则和自定义异常返回结果

文章目录

  • 前言
  • 一、Feign 整合 Sentinel
    • 1.1 实现步骤
    • 1.2 FallbackFactory 示例
  • 二、Sentinel 实现隔离
    • 2.1 隔离的实现方法
    • 2.2 Sentinel 实现线程隔离示例
  • 三、熔断降级规则
    • 3.1 熔断降级原理及其流程
    • 3.2 熔断策略 —— 慢调用
    • 3.3 熔断策略 —— 异常比例和异常数
  • 四、授权规则
    • 4.1 什么是授权规则
    • 4.2 授权规则示例
  • 五、自定义异常返回结果


前言

在前文中,介绍了 Sentinel 的流控模式和流控效果,然而限流只是一种预防措施,虽然可以尽量避免因为并发问题而引起的服务故障,但服务仍然可能因其他因素而发生故障。为了将这些故障控制在一定范围内,以避免雪崩效应的发生,我们需要依赖线程隔离(舱壁模式)和熔断降级机制。

无论是线程隔离还是熔断降级,它们都是为了保护客户端(调用方)免受服务故障的影响。

Sentinel保护客户端

在微服务之间的调用通常依赖于 Open Feign,因此我们首先需要将Feign与 Sentinel进行有效整合。

本文将探讨 Feign 如何与 Sentinel 整合,以及 Sentinel 的隔离、熔断降级规则以及授权规则等关键概念。

一、Feign 整合 Sentinel

1.1 实现步骤

在 Spring Cloud 中,微服务之间的调用通常依赖于 Feign 来实现。要在微服务架构中保护客户端,需要将 Feign 和 Sentinel 整合在一起。以下是将 Feign 与 Sentinel 整合的步骤,以一个名为 cloud-demo 的微服务案例为例:

1. 修改 order-serviceapplication.yml 文件,启用 Feign 对 Sentinel 的支持:

feign:sentinel:enabled: true # 启用 Feign 对 Sentinel 的支持

通过这个配置,我们告诉 Feign 在进行远程调用时要与 Sentinel 一起工作,以确保客户端受到适当的保护。

2. 编写调用失败后的降级逻辑:

当远程调用失败时,可以实现降级逻辑。有两种方式可供选择:

  • 方式一:FallbackClass,FallbackClass 是 Feign 的一种直接降级处理机制。它涉及创建一个实现原始Feign接口的类,并在该类的方法中定义降级逻辑。但是这种方式对远程调用的异常无法进行处理。
  • 方式二:FallbackFactory(降级工厂),FallbackFactory 提供了更灵活的处理远程服务调用失败的方式。它允许我们动态创建 Feign 接口的降级实例,并获取特定的异常信息。

1.2 FallbackFactory 示例

在接下来的部分,我们将深入研究如何使用 FallbackFactory 来处理远程调用的异常,并为客户端提供更好的降级体验。

步骤一:在 feign-api 模块中创建一个UserClientFallbackFactory类,实现FallbackFactory接口,并重写 create 方法:

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

这段代码将在 order-service 调用 user-service 失败后自动调用,在控制台会输出错误日志,并返回一个空的 User 对象。

步骤二:在 config 中将 UserClientFallbackFactory 类注册为一个 Bean:

@Bean
public UserClientFallbackFactory userClientFallbackFactory(){return new UserClientFallbackFactory();
}

步骤三:在 feignUserClient 接口的@FeignClient 注解中指定 fallbackFactory UserClientFallbackFactory

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

通过这些步骤,就可以使用 FallbackFactory 处理远程服务调用失败,捕获异常信息,并提供更好的降级体验。

二、Sentinel 实现隔离

在 Sentinel 中,隔离有两种主要实现方法,即信号量隔离和线程隔离。其中默认采用的是信号量隔离:

Sentinel隔离方法

2.1 隔离的实现方法

信号量隔离:

信号量隔离是一种资源隔离方式,它通过设置每个资源(或接口)的许可证数量来控制并发访问。当并发请求到达时,如果资源的许可证数量已经用尽,新的请求将被阻塞,以保护资源不被过度访问。信号量隔离适用于需要控制并发访问的场景,例如数据库连接、外部API调用等。

优点

  • 轻量级,无额外开销
  • 适用于高频调用和高扇出场景

缺点

  • 不支持主动超时
  • 不支持异步调用

场景:适用于高频调用和高扇出的场景,其中资源隔离较为轻量。

线程隔离:

线程隔离是一种资源隔离方式,它将不同的资源请求隔离到不同的线程池中执行,以确保它们不会相互影响。每个线程池负责执行特定资源的请求,如果一个请求由于某种原因导致线程阻塞或异常,不会影响其他资源的请求。线程隔离适用于需要独立线程执行的场景,例如耗时操作、阻塞调用等。

优点

  • 支持主动超时
  • 支持异步调用

缺点

  • 线程的额外开销较大

场景:线程隔离适用于低扇出场景,其中资源隔离更为重要,或需要支持异步调用和主动超时的情况。

选择隔离的实现方法取决于具体需求和应用场景。根据不同的场景和资源调用特点,可以灵活选择信号量隔离或线程隔离,以保障系统的稳定性和性能。

2.2 Sentinel 实现线程隔离示例

回顾在使用 Sentinel 控制台设置限流规则的时候,发现有两种阈值类型:

  • QPS: 就是每秒的请求数,在快速入门中已经演示过
  • 线程数: 是该资源能使用用的tomcat线程数的最大值。也就是通过限制线程数量,实现舱壁模式。

下面是一个示例,演示如何在 Sentinel 的控制台中实现线程隔离的设置。

1. 给 UserClient 的查询用户接口设置流控规则,线程数不能超过 2。

2. 然后利用 JMeter 测试。

设置线程数为 10:

设置 HTTP 请求:

启动 JMeter:

可以发现最终 10 个线程的请求只通过了其中两个。

查看 Sentinel 控制台的实时监控:

三、熔断降级规则

3.1 熔断降级原理及其流程

熔断降级原理:

熔断降级是解决雪崩问题的重要手段,其原理是由断路器统计服务调用的异常比例和慢请求比例,如果超出阈值则会熔断该服务。具体原理如下:

  1. 关闭状态(Closed):初始状态下,断路器处于关闭状态,所有请求都会被允许访问服务。
  2. 熔断状态(Open):当服务调用的异常比例或慢请求比例超出阈值时,断路器会进入熔断状态,拦截一定比例的请求,这些请求将快速失败,不会真正访问服务。
  3. 半开状态(Half-Open):在一段时间后,断路器会进入半开状态,允许部分请求访问服务,用于测试服务是否已经恢复正常。
  4. 关闭状态(Closed)或继续熔断状态(Open):根据半开状态下的请求成功与否,断路器会决定是继续保持熔断状态还是恢复到关闭状态。

熔断降级流程:

熔断降级的流程如下图所示:

熔断降级流程

流程说明如下:

  1. 断路器初始处于 Closed 状态,允许所有请求访问服务。
  2. 当服务调用失败次数或慢请求比例达到阈值,断路器进入 Open 状态,拦截所有请求,快速失败。
  3. 在一段时间后,断路器进入 Half-Open 状态,允许部分请求访问服务,用于测试服务是否已经恢复正常。
  4. 如果在 Half-Open 状态下的请求成功,则断路器进入 Closed 状态,允许所有请求访问服务。
  5. 如果在 Half-Open 状态下的请求仍然失败,断路器继续保持 Open 状态,直到下一次尝试进入 Half-Open 状态。

熔断降级通过这种状态机实现,可以帮助服务在异常情况下避免雪崩效应,提高系统的可用性和稳定性。

3.2 熔断策略 —— 慢调用

断路器熔断策略有三种:慢调用、异常比例、异常数。

慢调用就是当业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。

例如,通过 Sentinel 控制台设置慢调用降级策略:

说明:
当 RT 超过 500ms 的调用就是慢调用,统计最近 10000ms 内的请求,如果请求量超过 5 次,并且慢调用比例不低于 0.5,则触发熔断,熔断时长为 5 秒。然后进入 Half-open 状态,放行一次请求做测试。

现在有一个需求:就是给 UserClient 的查询用户接口设置降级规则,慢调用的 RT 阈值为 50ms,统计时间为 1 秒,最小请求数量为 5,失败阈值比例为 0.4,熔断时长为 5:

为了触发慢调用规则,我们需要修改UserService中的业务,增加业务耗时:

@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id ) throws InterruptedException {if(id == 1){// 休眠,触发慢调用熔断策略Thread.sleep(60);}return userService.queryById(id);
}

重启 user-service 服务后,我们可以通过快速刷新浏览器,来触发这个熔断机制:

当触发了容器之后,服务其他 ID 的接口,也会被熔断:

3.3 熔断策略 —— 异常比例和异常数

异常比例或异常数都是统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。

同样可以通过 Sentinel 控制台进行设置:

说明:

统计最近 1000ms 内的请求,如果请求量超过 10 次,并且异常比例不低于 0.5,则触发熔断,熔断时长为5秒。然后进入Half-open状态,放行一次请求做测试。

下面以异常比例为例:

例如现在有一个需求:就是给 UserClient 的查询用户接口设置降级规则,统计时间为 1 秒,最小请求数量为 5,失败阈值比例为 0.4,熔断时长为 5s:

为了触发异常统计,同样需要修改UserService中的业务,抛出异常:

@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) throws InterruptedException {if(id == 1){// 休眠,触发慢调用熔断策略Thread.sleep(60);} else if (id == 2) {throw new RuntimeException("演示触发异常比例熔断!");}return userService.queryById(id);
}

此时,访问 ID 为 2 的用户就会抛出异常。

重启 user-service 服务后,我们可以通过快速刷新浏览器,来触发这个熔断机制:

四、授权规则

4.1 什么是授权规则

授权规则用于对调用方的来源进行控制,通常分为白名单和黑名单两种方式:

  • 白名单:将指定的来源(origin)加入白名单,允许这些调用者访问服务。
  • 黑名单:将指定的来源(origin)加入黑名单,不允许这些调用者访问服务。

在 Sentinel 控制台中,可以配置授权规则,如下所示:

授权规则配置

现在,我们可以从浏览器和网关两个路径去服务 order-service服务:

如果现在需要限定只允许从网关来的请求访问 order-service服务,那么流控应用中就填写网关的名称。

4.2 授权规则示例

下面将演示如何通过 Sentinel 的授权规则来限制对 order-service 服务的请求只能来自网关 gateway

Sentinel 是通过 RequestOriginParser 这个接口的 parseOrigin 来获取请求的来源的:

public interface RequestOriginParser {    // 从请求request对象中获取origin,获取方式自定义String parseOrigin(HttpServletRequest request);}

RequestOriginParser 是 Sentinel 提供的接口,用于解析请求的来源(origin)。这接口定义了一个方法 parseOrigin,我们需要实现这个方法,以自定义方式从请求对象中获取请求的来源信息。

因此,我们尝试从request中获取一个名为origin的请求头,作为origin的值,作为判断请求是否来源于网关的依据。实现的步骤如下:

  1. 首先,在gateway服务的 application.yml 文件中,利用网关的过滤器给所有的请求都添加一个名为 gatewayorigin 请求头:
spring:cloud:gateway:default-filters: # 默认过滤器,会对所有的路由请求都生效- AddRequestHeader=origin, gateway # Sentinel 授权规则,只有从网关服务的才合法,通过添加请求头标识
  1. 然后在 Sentinel 控制台中添加授权规则,指定流控应用为 gateway

  1. order-service 中实现一个 HeadOriginParser 类,实现 RequestOriginParser 接口,用来获取请求源:
@Component
public class HeadOriginParser implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {// 1. 获取请求头String origin = httpServletRequest.getHeader("origin");// 2. 非空判断if (StringUtils.isEmpty(origin)) {return "blank";}return origin;}
}

如果不存在origin 这个字段的请求头,直接返回"blank",否则直接返回 origin 的值,然后交给 Sentinel 进行判断请求源。

  1. 重启 order-servicegateway 服务,进行演示:

此时,如果我们之间通过浏览器访问 order-service 的接口,发现就被禁止访问了:

如果通过 gateway 网关,就能够成功访问了:

五、自定义异常返回结果

默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方,但是通过上面所有的例子,我们发现都只返回了一种结果,那就是“Blocked by Sentinel (flow limiting)”。如果我们想要知道微服务调用失败的具体原因,就需要对异常进行自定义处理:

如果要实现对 Sentinel 的异常实现自定义,那么就需要实现 BlockExceptionHandler 接口,它是 Sentinel 提供的一个接口,用于自定义处理调用失败时的异常情况。

而关于 BlockException这个类,包含很多个子类,分别对应不同的场景:

异常说明
FlowException限流异常
ParamFlowException热点参数限流的异常
DegradeException降级异常
AuthorityException授权规则异常
SystemBlockException系统规则异常

我们可以通过这些子类来判断在调用微服务失败的时候,具体出现了哪种情况,然后通过自定义异常进行结果的返回,下面是一个实现自定义异常的代码示例:

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

在上述示例中,创建了一个名为 CustomBlockExceptionHandler 的自定义异常处理类,实现了 BlockExceptionHandler 接口。在重写的 handle 方法中,根据不同的 BlockException 类型来确定异常消息和状态码,然后将这些信息返回给调用方。

例如,在上面配置了授权规则的情况下,直接通过浏览器访问 order-service 服务:

此时,就能够清楚的知道微服务调用失败的原因了。

相关文章:

【微服务】Feign 整合 Sentinel,深入探索 Sentinel 的隔离和熔断降级规则,以及授权规则和自定义异常返回结果

文章目录 前言一、Feign 整合 Sentinel1.1 实现步骤1.2 FallbackFactory 示例 二、Sentinel 实现隔离2.1 隔离的实现方法2.2 Sentinel 实现线程隔离示例 三、熔断降级规则3.1 熔断降级原理及其流程3.2 熔断策略 —— 慢调用3.3 熔断策略 —— 异常比例和异常数 四、授权规则4.1…...

Kurento多对多webrtc会议搭建测试

环境ubuntu18.04 KMS版本6.13.0 多对多通信demo7.0.0 KMS运行起来后&#xff0c;通过运行它的一个个demo&#xff0c;来实现不同的功能&#xff0c;它的demo很多如下&#xff1a; https://github.com/Kurento 里面有一对一&#xff0c;多对多&#xff0c;还有一些特效的demo。…...

蓝桥杯 (饮料换购,C++)

思路&#xff1a; 1、先加上初始的饮料数n。 2、再加上n可以兑换的饮料数n/3&#xff0c;求多余的瓶盖n%3。循环直至瓶盖数无法兑换新的一瓶饮料。 #include<iostream> using namespace std; int main() {int n,a0,sum0;cin >> n;sum n;while (n){n n a;//加上上…...

《java核心卷Ⅰ》知识点总结(可作面试题)

&#x1f6eb; JDK和JRE傻傻分不清?&#x1f6eb; HelloWorld的输出都经历了啥&#xff1f;&#x1f6eb; Java的三个版本都是啥&#xff1f;&#x1f6eb; 关于main方法你都知道啥&#xff1f;main方法被声明为private会怎样&#xff1f;&#x1f6eb; 强制and自动类型转换都…...

发成绩小程序,一键群发成绩给家长,省事

大家好&#xff01;又到了学期末&#xff0c;是不是又开始为了学生的成绩而烦恼了&#xff1f;别担心&#xff0c;今天就给大家带来一款超级实用的成绩查询系统&#xff01;从此告别繁琐的手动操作&#xff0c;一键群发成绩给家长&#xff0c;轻松又愉快&#xff01; 成绩查询系…...

barzilar_borwein算法微调函数的优化收敛

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool>2.4.2加载barzilar_borwein算法 import optimtool.unconstrain as ou barzilar_borwein ou.gradient_descent.barzilar_borwein初始化输入数据 f ( x ) ∑ i 1 n / 2 c ( x 2 i −…...

SpringBoot篇---第一篇

系列文章目录 文章目录 系列文章目录一、为什么要用SpringBoot二、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?三、运行Spring Boot有哪几种方式?一、为什么要用SpringBoot Spring Boot 优点非常多,如: 一、独立运行 Spring Boot而且内嵌了各种servlet容器,…...

算法通关村第二关-白银挑战反转链表拓展问题

大家好我是苏麟 , 今天聊一聊链表反转拓展问题 . 反转链表拓展问题 1.指定区间反转 描述 : 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 题目…...

【rust/树莓派】使用rppalembedded-graphics控制st7789 LCD屏幕

说在前面 树莓派版本&#xff1a;4bLCD模块&#xff1a;ST7789V2 240*280 LCD树莓派系统&#xff1a;Linux raspberrypi 5.15.76-v8 #1597 SMP aarch64 GNU/Linuxrust版本&#xff1a;rustc 1.73.0 模块详情 某雪的1.69inch LCD模块&#xff0c;包含杜邦线 准备工作 树莓派…...

WebSocket—STOMP详解(官方原版)

WebSocket协议定义了两种类型的消息&#xff08;文本和二进制&#xff09;&#xff0c;但其内容未作定义。该协议定义了一种机制&#xff0c;供客户端和服务器协商在WebSocket之上使用的子协议&#xff08;即更高级别的消息传递协议&#xff09;&#xff0c;以定义各自可以发送…...

淘宝/天猫获取购买到的商品订单物流信息 API分享

开发背景&#xff1a; 淘宝是中国最大的电商平台之一&#xff0c;拥有海量的用户和卖家。为了方便卖家和买家之间的交易&#xff0c;淘宝提供了订单物流API的开发接口。通过这个接口&#xff0c;卖家可以快速获取到买家的订单信息以及物流状态&#xff0c;从而更好地管理自己的…...

PS软件 点击 “另存为 Web 所用格式” ,提示错误 无法完成操作 系统找不到指定路径

软件&#xff1a;Adobe Photoshop 问题&#xff1a; PS 点击 另存为 Web 所用格式 &#xff0c;提示错误 无法完成操作 系统找不到指定路径 解决&#xff1a; 如果是Win10以上的系统&#xff0c;出现这种情况基本就是被系统自带的杀毒软件阻止了&#xff0c;可以看一下电脑右…...

解决“您点击的链接已过期”;The Link You Followed Has Expired的问题

今天WP碰到一个坑。无论发布文章还是更新插件、更换主题都是这么一种状态“您点击的链接已过期”&#xff1b;The Link You Followed Has Expired 百度出来的答案都是修改post_max_size 方法1. 通过functions.php文件修复 这种方法更容易&#xff0c;只需将以下代码添加到Wor…...

说说对ajax、axios、jsonp的理解

下面是对 AJAX、Axios 和 JSONP 的简要说明&#xff1a; 1&#xff1a;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;&#xff1a; AJAX 是一种用于创建异步通信的技术&#xff0c;通过在后台与服务器进行数据交换&#xff0c;实现页面的局部更新&#xff0c…...

黄金代理这么多,怎么选?

目前&#xff0c;现货黄金代理已成为了市场中成熟的模式&#xff0c;我们只要在搜索引擎上搜索如何在市场中开户&#xff0c;会搜到各种各样的黄金代理&#xff0c;其中更是不乏服务非常优秀的。部分投资者早就接受了黄金代理的存在&#xff0c;并且率先开始在黄金代理中进行开…...

一个工作三年的前端是如何做性能优化的

你是怎么做性能优化的&#xff1f;关于这一个问题&#xff0c;也是我们前端开发程序员经常会讨论到的问题&#xff0c;接下来这篇文章将总结一下前端方面的性能优化及方式。 为什么要做性能优化 性能优化是为了提高网页的加载速度和相应速度&#xff0c;给用户带来更好的体验…...

如何确定自己的armbian系统是不是ARM64架构

使用 arch 命令&#xff1a; arch 命令会返回当前系统的架构信息。 arch系统是ARM64架构&#xff0c;返回 aarch64。系统是ARM32架构&#xff0c;它会返回 armv7l 或类似的值。 使用 uname 命令&#xff1a; 确认系统架构的方法是使用 uname 命令 uname -a这会显示系统的详…...

leetcode_1155 掷骰子等于目标和的方法数

1. 题意 n个k面的骰子&#xff0c;投掷出骰子的点数之和为target的所有可能。 掷骰子等于目标和的方法数 2. 题解 动态规划&#xff0c;实际上相当于一个0-1背包。 令 d p [ i ] [ j ] dp[i][j] dp[i][j]为前 i i i个骰子和为j的方案数 则 d p [ i ] [ j ] ∑ t 1 k d p…...

2023年中国精准放疗未来展望分析:将朝着精准化、数字化和智能化发展[图]

肿瘤放射治疗是利用放射线治疗肿瘤的一种局部治疗方法。放射线包括放射性同位素产生的α、β、γ射线和各类x射线治疗机或加速器产生的x射线、电子线、质子束及其他粒子束等。放射治疗在肿瘤治疗中的作用和地位日益突出&#xff0c;已成为治疗恶性肿瘤的主要手段之一。 现代放…...

大数据之LibrA数据库常见术语(二)

Cgroups Control Groups&#xff0c;控制组&#xff08;FusionInsight LibrA中也称之为优先级组&#xff09;。SUSE Linux和RedHat内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制。 CLI Command-line Interface&#xff0c;命令行界面。应用程序和用户交互…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...