springboot3 RestClient、HTTP 客户端区别
1 RestClient使用
RestClient
是 Spring 6.1 M2 中引入的同步 HTTP 客户端,它取代了 RestTemplate
。同步 HTTP 客户端以阻塞方式发送和接收 HTTP 请求和响应,这意味着它会等待每个请求完成后才继续下一个请求。本文将带你了解 RestClient
的功能以及它与 RestTemplate
的比较。
1.1 RestClient
和 RestTemplate
RestTemplate
,顾名思义,是基于模板设计模式构建的。它是一种行为设计模式,用于在方法中定义算法的框架,允许子类为某些步骤提供特定的实现。虽然这是一种强大的模式,但它会导致需要进行方法覆写,这可能是不方便的。
为了改进这一点,RestClient
采用了 Fluent API。Fluent API 也是一种设计模式,它允许以一种使代码更易读和表达的方式进行方法链式调用,通常无需使用中间变量。从创建一个基本的 RestClient
开始:
RestClient restClient = RestClient.create();
1.2 使用各种 HTTP 方法发起请求
与 RestTemplate
或其他 REST 客户端类似,RestClient
可以使用不同的 HTTP 方法发起请求。创建一个用于操作的 Article
类:
public class Article {Integer id;String title;// 构造函数和 getter/setter
}
1.2.1 使用 GET 请求获取资源
GET 请求用于检索 Web 服务器上指定资源的数据,而不对其进行修改。通常,这是一个只读的操作!获取服务器响应的字符串(String
):
String result = restClient.get().uri(uriBase + "/articles").retrieve().body(String.class);
1.2.2 使用 POST 请求创建资源
POST 请求用于提交数据到 Web 服务器上,进行新的资源创建。资源通常是通过 URI 定义的。向服务器发送一篇 ID 为 1
的 Article
:
Article article = new Article(1, "How to use RestClient");
ResponseEntity<Void> response = restClient.post().uri(uriBase + "/articles").contentType(APPLICATION_JSON).body(article).retrieve().toBodilessEntity();
由于指定了 APPLICATION_JSON
Content Type,Jackson 库会自动将 Article
类实例序列化为 JSON。在本例中,使用 toBodilessEntity()
方法忽略了响应体。POST 端点不需要返回任何 Payload,通常也不会返回任何 Payload。
1.2.3 使用 PUT 请求更新资源
接下来是 PUT 请求,用于更新或替换已经存在的资源。修改上一段中创建的 Article
,URI 中的 ID 即表示要修改的资源:
Article article = new Article(1, "How to use RestClient even better");
ResponseEntity<Void> response = restClient.put().uri(uriBase + "/articles/1").contentType(APPLICATION_JSON).body(article).retrieve().toBodilessEntity();
与 POST 请求一样,依靠 RestClient
对 Payload 进行序列化,并忽略响应。
1.2.4 使用 DELETE 请求删除资源
使用 DELETE 请求从 Web 服务器上删除指定资源。与 GET 类似,通常不提供任何 Payload,而是在 URI 参数中指定要删除的资源:
ResponseEntity<Void> response = restClient.delete().uri(uriBase + "/articles/1").retrieve().toBodilessEntity();
1.3 反序列化响应
通常,我们希望将请求序列化,并将响应反序列化为我们可以操作的类。RestClient
具有执行 JSON 到对象转换的功能,该功能由 Jackson
库提供。此外,由于共享使用了 Message Converter,因此可以使用 RestTemplate
支持的所有数据类型。通过 ID 获取一篇文章,并将其序列化为 Article
类的实例:
Article article = restClient.get().uri(uriBase + "/articles/1").retrieve().body(Article.class);
当我们需要获取 List
等泛型类的实例时,指定 body 的类就比较复杂了。例如,如果我们想获取所有 Article
,以 List<Article>
对象形式返回。在这种情况下,可以使用 ParameterizedTypeReference
抽象类来告诉 RestClient
我们要获取什么对象。甚至不需要指定泛型类型,Java 会自动推断出类型:
List<Article> articles = restClient.get().uri(uriBase + "/articles").retrieve().body(new ParameterizedTypeReference<>() {});
1.4 使用 Exchange 解析响应
RestClient
包含 exchange()
方法。通过提供对底层 HTTP 请求和响应的访问权限,用于处理更复杂的情况。在这种情况下,库不会应用默认的 Handler,我们必须自己处理响应的 Status。
比方说,当数据库中没有文章时,服务会返回 204
(No Content)状态代码。由于这种行为略显非标准,我们希望以一种特殊的方式来处理它。当状态代码等于 204
时,抛出一个 ArticleNotFoundException
异常;当状态代码不等于 200 时,抛出一个更通用的异常:
List<Article> article = restClient.get().uri(uriBase + "/articles").exchange((request, response) -> {if (response.getStatusCode().isSameCodeAs(HttpStatusCode.valueOf(204))) {throw new ArticleNotFoundException();} else if (response.getStatusCode().isSameCodeAs(HttpStatusCode.valueOf(200))) {return objectMapper.readValue(response.getBody(), new TypeReference<>() {});} else {throw new InvalidArticleResponseException();}
});
由于我们在这里处理的是原始响应,因此还需要使用 ObjectMapper
对 Response Body 进行反序列化。
1.5 异常处理
默认情况下,当 RestClient
在 HTTP 响应中遇到 4xx
或 5xx
状态码时,它会抛出一个 RestClientException
子类的异常。我们可以通过自定义 Status Handler 来覆盖这一行为。自定义 Status Handler,在找不到文章时抛出一个自定义异常:
Article article = restClient.get().uri(uriBase + "/articles/1234").retrieve().onStatus(status -> status.value() == 404, (request, response) -> {throw new ArticleNotFoundException(response)}).body(Article.class);
1.6 从 RestTemplate 构建 RestClient
如果你已经在项目中使用上了 RestTemplate
,也可以可从 RestTemplate
构建 RestClient
。
RestTemplate oldRestTemplate;
RestClient restClient = RestClient.create(oldRestTemplate);
2 HTTP 客户端区别
2.1 RestTemplate
RestTemplate
是 Spring 框架提供的同步 HTTP
客户端,专用于发起 RESTful
请求。它通过封装 HTTP
请求和响应的样板代码,提供了一种简洁的方式与 REST
服务进行交互。
2.1.1 核心特性
- 同步API: RestTemplate以同步方式运行,阻塞当前线程直到收到响应。
- 模板方法: 提供了用于常见HTTP操作(GET、POST、PUT、DELETE等)的预定义方法。
- 可定制性: 允许通过拦截器、错误处理程序和消息转换器进行定制。
- 对象映射: 可以使用消息转换器自动将请求和响应体转换为Java对象。
2.1.2 优点和缺点
优点:
- 使用简单易懂:
RestTemplate
提供了直观的 API,简化了与 RESTful 服务的交互,开发者可以轻松上手。 - 适用于简单用例: 对于常见的 CRUD 操作和简单的 HTTP 请求处理,
RestTemplate
是一种方便的选择。 - 与 Spring 生态系统良好集成: 作为 Spring 框架的一部分,
RestTemplate
与 Spring 的其他组件紧密配合,能够无缝融入到 Spring 应用中。
缺点:
- 同步特性可能在高并发场景中影响性能: 由于
RestTemplate
是同步的,调用线程会阻塞直到响应返回,这在高并发情况下可能导致性能瓶颈。 - 对异步和响应式编程的支持有限:
RestTemplate
不支持异步处理,也无法与响应式编程模式兼容,这使得它在需要非阻塞操作的场景中不够灵活。 - 正在被
WebClient
取代: 随着 Spring 5 的推出,WebClient
作为更现代的 HTTP 客户端出现,逐渐成为RestTemplate
的替代品,尤其是在响应式编程场景下。
2.1.3 使用 RestTemplate 的时机
RestTemplate
适用于那些同步行为可接受且性能要求不高的简单用例。对于需要进行直接 REST 交互的中小型应用程序,RestTemplate
可能是一个理想的选择。特别是在以下情况下,它是不错的工具:
- 简单的 CRUD 操作: 当应用程序主要处理创建、读取、更新和删除等基本 REST 操作时,
RestTemplate
提供了简洁易用的 API。 - 同步请求: 如果应用程序可以容忍同步请求,且并发需求不高,那么
RestTemplate
可以很好地满足需求。 - 快速原型开发: 在开发阶段,
RestTemplate
可以快速帮助构建和测试 RESTful API 的交互逻辑。
然而,当需要处理复杂的异步操作、流式处理或者更高的并发需求时,应该考虑使用 WebClient
或 RestClient
。
2.2 WebClient
WebClient
是在 Spring 5 中引入的非阻塞、响应式 HTTP 客户端,被设计为 RestTemplate
的替代品。它基于 Project Reactor
构建,支持异步和非阻塞操作。这种方式非常适合构建现代、可扩展的应用程序,特别是在需要高效处理高并发场景时,WebClient
能够显著提高性能和系统的响应能力。
WebClient
提供了灵活且强大的 API,使开发者能够轻松处理复杂的 HTTP 交互,包括流式数据处理和异步操作。由于它与 Spring 的响应式编程模型紧密集成,因此对于现代微服务架构和高并发应用来说,WebClient
是一个至关重要的工具。
2.2.1 核心特性
- 响应式 API:
WebClient
利用Mono
和Flux
等响应式编程概念来进行异步操作,使开发者可以轻松处理单个或多个异步数据流。 - 流畅接口:
WebClient
提供了声明式、可读性强的 API,用于构建和执行 HTTP 请求,开发者可以通过链式调用方式轻松定义复杂的请求逻辑。 - 非阻塞:
WebClient
的非阻塞特性允许在不阻塞当前线程的情况下发起请求,从而提高了资源利用率,特别是在高并发场景下表现尤为出色。 - 与 Spring 生态系统集成:
WebClient
与Spring Data Reactive
、Spring Security
等其他 Spring 组件无缝集成,支持响应式数据访问和安全认证等功能,使得它能够完美融入 Spring 响应式堆栈。
2.2.2 优点和缺点
优点:
- 非阻塞和异步:
WebClient
支持非阻塞的异步操作,可以更高效地利用系统资源,特别是在处理大量并发请求时表现出色。 - 并发请求的高性能: 通过异步处理和非阻塞 I/O,
WebClient
能够处理更高的并发请求量,适合需要高吞吐量的应用场景。 - 支持响应式编程:
WebClient
与 Spring 的响应式编程模型紧密集成,支持Mono
和Flux
,能够更自然地处理流式数据和异步操作。 - 更适合现代应用程序架构: 对于微服务架构、响应式系统等现代架构,
WebClient
提供了更丰富的功能和更高的灵活性,能够适应复杂的需求。
缺点:
- 学习曲线更陡峭: 由于
WebClient
基于响应式编程模型,开发者可能需要掌握Mono
和Flux
等响应式编程概念,这对不熟悉响应式编程的开发者来说会有一定的学习难度。 - 更复杂的错误处理: 与
RestTemplate
相比,WebClient
的错误处理可能更复杂,需要开发者在处理响应状态、异常和重试机制时更加小心和全面。
2.2.3 使用WebClient的时机
WebClient
是大多数现代 Spring 应用程序的首选工具。它非常适合微服务架构、高流量应用程序,以及那些非阻塞行为至关重要的场景。在构建响应式系统或需要高效处理大量并发请求时,WebClient
是一个值得优先考虑的选择。无论是处理复杂的 HTTP 交互,还是构建高度可扩展的系统,WebClient
都能为开发者提供强大的功能和灵活性,使其能够轻松应对现代应用程序的需求。
2.3 RestClient
RestClient
是 Spring HTTP 客户端领域的最新发展,作为 RestTemplate
的现代化和高效替代品引入。它旨在解决 RestTemplate
的一些局限性,同时结合了 WebClient
的最佳实践。
RestClient
提供了更先进的功能,专注于优化性能和提高开发效率,尤其在处理 RESTful API 请求时,结合了响应式编程和非阻塞操作的优点。通过引入 RestClient
,Spring 提供了一种更现代的解决方案,能够更好地满足当前和未来的应用需求。
2.3.1 核心特性和改进
- 构建者模式:
RestClient
使用构建者模式来构建请求,这种模式提供了更流畅、可读性更高的 API,使得请求的配置和管理更加直观和灵活。 - 异步操作: 尽管
RestClient
的异步能力不如WebClient
那么全面,但它通过CompletableFuture
提供了一定程度的非阻塞能力,适合需要异步处理但不要求完全响应式的场景。 - 响应式支持:
RestClient
可以与Project Reactor
等响应式编程框架集成,支持响应式编程模型,使其能够更好地适应现代应用程序的需求,并提高应用程序的可扩展性。 - 简化的错误处理:
RestClient
提供了改进的错误处理机制,使得异常处理和 HTTP 状态码的管理变得更加简单和直接,有助于提高开发效率和代码质量。
2.3.2 使用RestClient的时机
当我们需要在 RestTemplate
的简单性和 WebClient
的高级特性之间取得平衡时,RestClient
是一个合适的选择。它适用于那些需要异步操作但不需要完全响应式编程的项目,提供了一种折衷方案。
此外,如果您正在从 RestTemplate
迁移并希望逐步过渡,RestClient
也是一个很好的选择。它不仅保留了 RestTemplate
的易用性,还引入了现代化的特性,使得迁移过程更加平滑,同时为未来的需求提供了更多的灵活性。
2.4 三者比较
以下是 RestTemplate
、WebClient
和 RestClient
的特性对比表:
特性 | RestTemplate | WebClient | RestClient |
---|---|---|---|
同步/异步 | 同步 | 异步 | 同步/异步 |
API 风格 | 模板方法 | 流畅构建者 | 流畅构建者 |
响应式 | 否 | 是 | 部分 |
性能 | 较低 | 较高 | 中等 |
复杂性 | 较低 | 较高 | 中等 |
Spring 版本 | 旧版本 | Spring 5+ | Spring 6.1+ |
2.4.1 重要考虑因素
- 性能: 对于需要处理高并发和非阻塞操作的场景,
WebClient
显然是最佳选择,它提供了高性能和良好的资源利用效率。 - 复杂性:
RestTemplate
提供了简单易用的 API,适合初学者和简单用例;而WebClient
和RestClient
提供了更多高级特性和灵活性,但复杂性也相应较高。 - 项目需求: 如果您的项目需要同步行为和易用性,
RestTemplate
可能已经足够。如果您正在构建现代响应式应用程序,WebClient
是最佳选择。RestClient
则提供了一种在这两者之间的平衡方案,适合那些需要异步操作但不完全响应式的场景。 - Spring 版本: 选择客户端时,请确保与您当前使用的 Spring 版本兼容。
RestTemplate
是较旧版本的选择,而WebClient
和RestClient
则需要较新的 Spring 版本。
2.4.2 建议
- 新项目: 如果您正在开始一个新项目,优先考虑使用
WebClient
,因为它提供了最佳的性能和响应式能力,适合现代应用程序的需求。 - 现有项目: 对于已经使用
RestTemplate
的现有项目,如果计划迁移到更现代的客户端,RestClient
可以作为一个很好的过渡步骤,逐步引入异步和非阻塞特性。 - 简单用例: 对于简单的 HTTP 请求和同步操作,
RestTemplate
仍然是一个合适的选择,特别是在性能和复杂性要求不高的情况下。
相关文章:
springboot3 RestClient、HTTP 客户端区别
1 RestClient使用 RestClient 是 Spring 6.1 M2 中引入的同步 HTTP 客户端,它取代了 RestTemplate。同步 HTTP 客户端以阻塞方式发送和接收 HTTP 请求和响应,这意味着它会等待每个请求完成后才继续下一个请求。本文将带你了解 RestClient 的功能以及它与…...
自我训练模型:通往未来的必经之路?
摘要 在探讨是否唯有通过自我训练模型才能掌握未来的问题时,文章强调了底层技术的重要性。当前,许多人倾向于关注应用层的便捷性,却忽视了支撑这一切的根本——底层技术。将模型简单视为产品是一种短视行为,长远来看,理…...
RuoYi框架添加自己的模块(学生管理系统CRUD)
RuoYi框架添加自己的模块(学生管理系统) 框架顺利运行 首先肯定要顺利运行框架了,这个我不多说了 设计数据库表 在ry数据库中添加表tb_student 表字段如图所示 如图所示 注意id字段是自增的 注释部分是后面成功后前端要展示的部分 导入…...
linux查看python版本
1.查看Linux是否安装python yum list all | grep python 2.Linux安装python yum install python 3.Linux查看python版本 python -V...
算法题(89):单项链表
审题: 本题需要我们实现一个可以执行三个指令的数据结构来解决这里的问题 思路: 方法一:利用数组模拟链表 由于这里涉及插入删除操作,所以我们不能使用数组结构存储数据,这样子会超时,所以我们就利用数组来…...
开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维
开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维 文|黄兴抗 电子信息工程专业 Koupleless 社区贡献者 就读于南昌师范学院,电子信息工程专业的大三学生。 本文 2634 字,预计阅读 7 分钟 今天 SOFAStack 邀…...
体验开源openeuler openharmony stratovirt模拟器
文档 openeuler社区面向数字基础设施的开源操作系统 openharmony社区 OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代、基于开源的方式,搭建一个智能终端设备操作系统…...
【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践
深度神经网络系列文章 【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践 引言 在深度…...
深入探讨AI-Ops架构 第一讲 - 运维的进化历程以及未来发展趋势
首先,让我们一起回顾运维的进化之路,然后再深入探讨AI-Ops架构的细节。 运维的进化历程 1. AI 大范围普及前的运维状态 (传统运维) 在AI技术尚未广泛渗透到运维领域之前,我们称之为传统运维,其主要特点是: 人工驱动…...
2025年全球生成式AI消费应用发展趋势报告
原文链接:The Top 100 Gen AI Consumer Apps - 4th Edition | Andreessen Horowitz 核心要点:本报告由a16z发布,深度解析了2025年全球生成式AI消费应用的发展格局,揭示了技术迭代与商业化加速的双重趋势。 报告显示,A…...
VBA 列方向合并单元格,左侧范围大于右侧范围
实现功能如下: excel指定行列范围内的所有单元格 规则1:每一列的连续相同的值合并单元格 规则2:每一列的第一个非空单元格与其下方的所有空白单元格合并单元 规则3:优先左侧列合并单元格,合并后,右侧的单元…...
设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan
前言 这几年芯片设计行业在国内像坐过山车。时而高亢,时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何? 我谈谈自己观点:芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后,芯…...
【弹性计算】异构计算云服务和 AI 加速器(二):适用场景
异构计算云服务和 AI 加速器(二):适用场景 1.图形处理2.视频处理3.计算4.人工智能 异构计算 目前已经被广泛地应用于生产和生活当中,主要应用场景如下图所示。 1.图形处理 GPU 云服务器在传统的图形处理领域具有强大的优势&…...
JVM常用概念之移动GC和局部性
问题 非移动GC一定比移动GC好吗? 基础知识 移动GC和非移动GC 移动GC 在进行垃圾回收时,为了减少碎片而移动对象来顺利完成垃圾回收的GC。 Serial GC 在单线程环境下,它在标记-清除(Mark-Sweep)算法的基础上进行…...
微服务保护:Sentinel
home | Sentinelhttps://sentinelguard.io/zh-cn/ 微服务保护的方案有很多,比如: 请求限流 线程隔离 服务熔断 服务故障最重要原因,就是并发太高!解决了这个问题,就能避免大部分故障。当然,接口的并发…...
使用Wireshark截取并解密摄像头画面
在物联网(IoT)设备普及的今天,安全摄像头等智能设备在追求便捷的同时,往往忽视了数据传输过程中的加密保护。很多摄像头默认通过 HTTP 协议传输数据,而非加密的 HTTPS,从而给潜在攻击者留下了可乘之机。本文…...
IDEA 基础配置: maven配置 | 服务窗口配置
文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…...
20250-3-8 树的存储结构
一、树的逻辑结构回顾 树:一个分支结点可以有多课子树 如果按照二叉树的存储来实现树的存储,则只依靠数组下标,无法反映结点之间的逻辑关系。 二、双亲表示法(顺序存储) 1.因此:我们可以用链式存储的方法&…...
Visual-RFT视觉强化微调:用「试错学习」教会AI看图说话
📜 文献卡 英文题目: Visual-RFT: Visual Reinforcement Fine-Tuning;作者: Ziyu Liu; Zeyi Sun; Yuhang Zang; Xiaoyi Dong; Yuhang Cao; Haodong Duan; Dahua Lin; Jiaqi WangDOI: 10.48550/arXiv.2503.01785摘要翻译: 像OpenAI o1这样的大型推理模型中的强化微调…...
PDF处理控件Aspose.PDF,如何实现企业级PDF处理
PDF处理为何成为开发者的“隐形雷区”? “手动调整200页PDF目录耗时3天,扫描件文字识别错误导致数据混乱,跨平台渲染格式崩坏引发客户投诉……” 作为开发者,你是否也在为PDF处理的复杂细节消耗大量精力?Aspose.PDF凭…...
DeepSeek-R1本地化部署(Mac)
一、下载 Ollama 本地化部署需要用到 Ollama,它能支持很多大模型。官方网站:https://ollama.com/ 点击 Download 即可,支持macOS,Linux 和 Windows;我下载的是 mac 版本,要求macOS 11 Big Sur or later,Ol…...
Swift Package Manager (SPM) 创建并集成本地库
在macOS 项目中,使用 Swift Package Manager (SPM) 创建并集成本地库的完整步骤。 创建一个macos应用程序,选择 swift、oc、swiftui都可以。 创建好应用之后,开始创建SPM本地库。 打开终端app,进入项目根目录,逐次输…...
分布式锁—6.Redisson的同步器组件
大纲 1.Redisson的分布式锁简单总结 2.Redisson的Semaphore简介 3.Redisson的Semaphore源码剖析 4.Redisson的CountDownLatch简介 5.Redisson的CountDownLatch源码剖析 1.Redisson的分布式锁简单总结 (1)可重入锁RedissonLock (2)公平锁RedissonFairLock (3)联锁MultiL…...
文献分享: ConstBERT固定数目向量编码文档
😂图放这了,大道至简的 idea \text{idea} idea不愧是 ECIR \text{ECIR} ECIR 👉原论文 1. ConstBERT \textbf{1. ConstBERT} 1. ConstBERT的原理 1️⃣模型的改进点:相较于 ColBERT \text{ColBERT} ColBERT为每个 Token \text{Tok…...
如何使用SSH命令安全连接并转发端口到远程服务器
ssh -p 22546 rootconnect.westc.gpuhub.com d6IS/mQKq/iG ssh -CNgv -L 6006:127.0.0.1:6006 rootconnect.westc.gpuhub.com -p 22546 第一条命令:用于登录远程服务器,进行交互式操作。第二条命令:用于建立 SSH 隧道,进行端口转…...
SolidWorks 转 PDF3D 技术详解
在现代工程设计与制造流程中,不同软件间的数据交互与格式转换至关重要。将 SolidWorks 模型转换为 PDF3D 格式,能有效解决模型展示、数据共享以及跨平台协作等问题。本文将深入探讨 SolidWorks 转 PDF3D 的技术原理、操作流程及相关注意事项,…...
9.2 EvictionManager源码解读
本节重点总结 : evictionManager初始化了两个相同的manager对象 evictionManager做本机驱逐pod的判定和厨房evictionAdmitHandler用来kubelet创建Pod前进依据本机的资源压力进行准入检查 evictionManager判断内存驱逐阈值有两种方法 第一种使用内核的memcg的通知机制ÿ…...
考研数一非数竞赛复习之Stolz定理求解数列极限
在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…...
整理一下高级设施农业栽培学这门课程的所有知识点
整理一下高级设施农业栽培学这门课程的所有知识点 以下是高级设施农业栽培学这门课程从入门到精通需要学习的知识点: 一、设施农业概述 设施农业的概念与发展历程 了解设施农业的定义、特点及作用,掌握其发展历程、现状与未来趋势。熟悉国内外设施农业…...
2025最新软件测试面试八股文(含答案+文档)
1、请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。 参考答案: 黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 白盒测试:已知产品的内部工作过程…...
系统架构设计师—系统架构设计篇—基于体系结构的软件开发方法
文章目录 概述基于体系结构的开发模型-ABSDM体系结构需求体系结构设计体系结构文档化体系结构复审体系结构实现体系结构演化 概述 基于体系结构(架构)的软件设计(Architecture-Based Software Design,ABSD)方法。 AB…...
求最大公约数【C/C++】
大家好啊,欢迎来到本博客( •̀ ω •́ )✧,我将带领大家详细的了解最大公约数的思想与解法。 一、什么是公约数 公约数,也称为公因数,是指两个或多个整数共有的因数。具体来说,如果一个整数能被两个或多个整数整除&…...
Transformer 代码剖析16 - BLEU分数(pytorch实现)
一、BLEU算法全景图 #mermaid-svg-uwjb5mQ2KAC6Rqbp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-icon{fill:#552222;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-text{fill:#552222;stroke:…...
手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机
首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…...
labelimg标注的xml标签转换为yolo格式标签
本文不生产技术,只做技术的搬运工!!! 前言 在yolo训练时,我们需要对图像进行标注,而使用labelimg标注时如果直接选择输出yolo格式的数据集,则原始数据的很多信息无法被保存,因此一版…...
Linux云计算SRE-第十七周
1. 做三个节点的redis集群。 1、编辑redis节点node0(10.0.0.100)、node1(10.0.0.110)、node2(10.0.0.120)的安装脚本 [rootnode0 ~]# vim install_redis.sh#!/bin/bash # 指定脚本解释器为bashREDIS_VERSIONredis-7.2.7 # 定义Redis的版本号PASSWORD123456 # 设置Redis的访问…...
K8S学习之基础十八:k8s的灰度发布和金丝雀部署
灰度发布 逐步扩大新版本的发布范围,从少量用户逐步扩展到全体用户。 特点是分阶段发布、持续监控、逐步扩展 适合需要逐步验证和降低风险的更新 金丝雀部署 将新版本先部署到一小部分用户或服务器,观察其表现,再决定是否全面推广。 特点&…...
WSL with NVIDIA Container Toolkit
一、wsl 下安装 docker 会提示安装 docekr 桌面版,所以直接安装 docker 桌面版本即可 二、安装 NVIDIA Container Toolkit NVIDIA Container Toolkit仓库 https://github.com/NVIDIA/nvidia-container-toolkitgithub.com/NVIDIA/nvidia-container-toolkit 安装…...
PAT线上考试 真题/注意细节(甲/乙级)
闲谈 从此以后!参加竞赛! 都要为自己留够足够的时间练习! 都要为自己留够足够的时间练习! 都要为自己留够足够的时间练习! 重要的事情说三遍,毕竟这只是我参加各种竞赛的开始! \(ÿ…...
springcloud sentinel教程
QPS(Queries Per Second)即每秒查询率 TPS,每秒处理的事务数目 PV(page view)即页面浏览量 UV 访问数(Unique Visitor)指独立访客访问数 一、初识Sentinel 什么是雪崩问题? 微服务之间相…...
摄相机标定的基本原理
【相机标定的基本原理与经验分享】https://www.bilibili.com/video/BV1eE411c7kr?vd_source7c2b5de7032bf3907543a7675013ce3a 相机模型: 定义: 内参:就像相机的“眼睛”。它描述了相机内部的特性,比如焦距(镜头的放…...
HJ C++11 Day2
Initializer Lists 对于一个类P class P{P(int a, int b){cout << "P(int, int), a" << a << ", b " << b << endl;}P(initializer_list<int> initlist){cout << "P(initializer_list<int>), val…...
在 ASP.NET Core 中启用 Brotli 和 Gzip 响应压缩
在本文中,我们将探讨如何在 ASP.NET Core 应用程序中启用响应压缩,重点介绍 Brotli 和 Gzip 算法以及如何验证压缩是否有效。 什么是响应压缩? 响应压缩通过使用Brotli 或 Gzip等算法来最小化 HTTP 响应的大小。这些算法在传输文本资产&#…...
leetcode69.x 的平方根
题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。…...
第11章 web应用程序安全(网络安全防御实战--蓝军武器库)
网络安全防御实战--蓝军武器库是2020年出版的,已经过去3年时间了,最近利用闲暇时间,抓紧吸收,总的来说,第11章开始学习利用web应用程序安全,主要讲信息收集、dns以及burpsuite,现在的资产测绘也…...
flac、kgg、kgma格式音频转换MP3
1. 选择需要转换的音频文件 2. 下载闪电音频格式转换器 闪电音频格式转换器-全面覆盖常见音乐格式_音频合并分割_音频压缩 3. 买会员有点贵,也没必要,偶尔转换一次的,就去闲鱼买,两天会员9块钱。 4. 闲鱼卖家给兑换码,…...
macos 程序 运行
sudo xattr -r -d com.apple.quarantine [/Applications/Name]使用stow 管理配置文件...
基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
HTML5 表单属性
HTML5 表单属性 引言 HTML5作为新一代的网页标准,带来了许多新的特性和改进。在表单处理方面,HTML5引入了一系列新的表单属性,这些属性使得表单的创建和使用更加灵活和强大。本文将详细介绍HTML5表单属性,包括其功能、使用方法和注意事项。 一、HTML5表单属性概述 HTML…...
从0开始,手搓Tomcat
一、什么是Tomcat Tomcat 是一款开源的、轻量级的 Web 服务器,它不仅能够提供 HTTP 服务,还能够运行 Java Servlet 和 JavaServer Pages(JSP)。对于许多开发者来说,理解 Tomcat 的目录结构以及如何在该结构中组织应用…...