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

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 ReactiveSpring 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 三者比较

        以下是 RestTemplateWebClient 和 RestClient 的特性对比表:

特性RestTemplateWebClientRestClient
同步/异步同步异步同步/异步
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 客户端&#xff0c;它取代了 RestTemplate。同步 HTTP 客户端以阻塞方式发送和接收 HTTP 请求和响应&#xff0c;这意味着它会等待每个请求完成后才继续下一个请求。本文将带你了解 RestClient 的功能以及它与…...

智能手表不可插卡怎么用

一、连接蓝牙 智能手表一般都可以通过蓝牙连接手机&#xff0c;以实现一些基础功能。连接方式一般分为以下几步&#xff1a; 1、首先打开手机的蓝牙功能&#xff0c;并在蓝牙列表中搜索手表的设备名称。 2、找到手表的设备名称后&#xff0c;点击连接即可完成蓝牙连接。 3、…...

blender看不到导入的模型

参考&#xff1a;blender 快捷键 常见问题_blender材质预览快捷键-CSDN博客 方法一&#xff1a;视图-裁剪起点&#xff0c;设置一个很大的值 方法二&#xff1a;选中所有对象&#xff0c;对齐视图-视图对齐活动项-选择一个视图...

【Unity】 HTFramework框架(六十一)Project窗口文件夹锁定器

更新日期&#xff1a;2025年3月7日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Project窗口文件夹锁定器框架文件夹锁定自定义文件夹锁定限制条件 Project窗口文件夹锁定器 在Project窗口中&#xff0c;文件夹锁定器能够为任何文件夹加…...

智能体开发:推理-行动(ReAct)思维链提示

人类在处理一个需要多个步骤才能完成任务时&#xff0c;显著特点是能够将言语推理&#xff08;内心独白&#xff09;和实际行动融合在一起&#xff0c;在面对陌生或不确定的情况时通过这种方法学习新知识&#xff0c;做出决策&#xff0c;并执行&#xff0c;从而应对复杂的任务…...

机试准备第11天

第一题是浮点数加法&#xff0c;目前写过最长的代码。 #include <stdio.h> #include <string> #include <iostream> #include <vector> using namespace std; int main() {string str1;string str2;while (getline(cin, str1) && getline(cin…...

【Proteus仿真】【STM32单片机】智能阳台控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LCD1604液晶、DHT11温湿度模块、PCF8591 ADC、光线传感器、PM2.5传感器、土壤湿度传感器、继电器、水泵、电灯、28BYJ48步进电机等。 主要…...

Manus AI Agent 技术解读:架构、机制与竞品对比

目录 1. Manus 是什么&#xff1f; 1.1 研发背景 1.2 技术特点 1.3 工具调用能力 1.4 主要应用场景 2. Manus 一夜爆火的原因何在&#xff1f; 2.1 技术突破带来的震撼 2.2 完整交付的产品体验 2.3 生态与开源策略 3. Manus 与其他 AI Agent 的对比分析 3.1 技术架构…...

【时间序列】因果推断:从时序数据中探寻“因”与“果”

在日常生活中&#xff0c;我们经常听到这样的问题&#xff1a;“为什么股票价格会突然下跌&#xff1f;”、“天气变化是否会影响销售额&#xff1f;”这些问题背后&#xff0c;其实都在试图寻找一种因果关系。然而&#xff0c;在时间序列数据中&#xff0c;探寻因果关系并不像…...

IDEA2023 使用枚举类型java: 非法字符: ‘\ufffd‘

一、异常&#xff1a; 二、原因 文件编码问题 IDE或文本编辑器的文件编码设置不正确&#xff0c;可能会导致在保存文件时引入了错误的字符。 三、解决 在IntelliJ IDEA中&#xff0c;你可以通过File -> Settings -> Editor -> File Encodings来设置。...

深度学习模型组件之优化器--基础优化器(GD、SGD、Mini-batch SGD)

深度学习模型组件之优化器–基础优化器&#xff08;GD、SGD、Mini-batch SGD&#xff09; 文章目录 深度学习模型组件之优化器--基础优化器&#xff08;GD、SGD、Mini-batch SGD&#xff09;1. 梯度下降&#xff08;Gradient Descent, GD&#xff09;1.1 基本原理1.2 优点与缺点…...

使用 AIStor、MLflow 和 KServe 将模型部署到 Kubernetes

在之前几篇关于 MLOps 工具的文章中&#xff0c;我展示了有多少流行的 MLOps 工具跟踪与模型训练实验相关的指标。我还展示了他们如何使用 MinIO 来存储作为模型训练管道一部分的非结构化数据。但是&#xff0c;一个好的 MLOps 工具应该做的不仅仅是管理您的实验、数据集和模型…...

宝塔 Linux 计划任务中添加运行项目网站PHP任务-定时任务

一、指定php版运行&#xff0c; cd /www/wwwroot/www.xxx.com/ && /www/server/php/56/bin/php think timedtasks start >> /tmp/timedtasks.log 2>&1 二、不指定php版 cd /www/wwwroot/www.xxx.com/ && php think timedtasks start >> …...

unity学习64,第3个小游戏:一个2D跑酷游戏

目录 学习参考 素材资源导入 1 创建项目 1.1 创建1个2D项目 1.2 导入素材 2 背景图bg 2.0 bg素材 2.1 创建背景 2.2 修改素材&#xff0c;且修改摄像机等 2.2.1 修改导入的原始prefab素材 2.2.2 对应调整摄像机 2.2.3 弄好背景 2.3 背景相关脚本实现 2.3.1 错误…...

rom定制系列------小米note3 原生安卓15 批量线刷 默认开启usb功能选项 插电自启等

小米Note 3搭载骁龙660处理器&#xff0c;1200万像素广角镜头、俗称大号版的小米6&#xff0c;官方最终版为12.0.1稳定版安卓9的固件。客户需要运行在安卓15的rom。根据原生官网的rom修改一些功能选项。以便客户操作需求。 定制资源说明 根据客户需求采用安卓15原生系统为底包…...

基于开源 AI 大模型、AI 智能名片及 S2B2C 商城小程序源码的个人 IP 用户运营策略研究

摘要&#xff1a;本文深入剖析了个人 IP 运营领域中用户运营的核心地位与关键作用&#xff0c;详细阐述了以拉新、留存和促活为主要方式的用户运营策略&#xff0c;旨在实现对用户的有效管理和用户价值的全面提升&#xff0c;进而延长用户生命周期&#xff0c;推动用户向消费者…...

什么是:马尔可夫博弈

什么是:马尔可夫博弈 马尔可夫博弈(Markov Game),也被称为随机博弈(Stochastic Game),是马尔可夫决策过程(MDP)在多智能体环境下的扩展。它描述了多个智能体在一个环境中相互作用的动态过程,每个智能体的决策不仅取决于当前环境状态,还会影响其他智能体的决策以及环…...

【探商宝】大数据企业销售线索平台:销售型公司的战略转型引擎

一、市场现状与销售型公司的核心痛点 在数字经济高速发展的2025年&#xff0c;全球企业获客成本较五年前增长超过300%&#xff0c;而B2B销售线索的平均转化率仍徘徊在15%-20%之间。这一矛盾背后&#xff0c;折射出传统销售模式的三重困境&#xff1a; ​数据孤岛导致决策滞后…...

用Ruby的Faraday库来进行网络请求抓取数据

在 Ruby 中&#xff0c;Faraday 是一个非常强大的 HTTP 客户端库&#xff0c;它可以用于发送 HTTP 请求并处理响应。你可以使用 Faraday 来抓取网页数据&#xff0c;处理 API 请求等任务。下面我将向你展示如何使用 Faraday 库进行网络请求&#xff0c;抓取数据并处理响应。 1.…...

Ubuntu的软件源

百度搜索 ubuntu清华镜像源 根据下面的网页&#xff0c;选择对应Ubuntu操作系统的源&#xff0c;一定要对应&#xff01;&#xff01;&#xff01; https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/上图的系统是16.04 xenial&#xff0c;这时就一定要使用16.04 xenial的源 …...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...