AI应用开发的高级特性——MCP模型上下文协议,打通AI与外部服务的边界。

**************************************************************************************************************

一、需求分析

当你的AI具备了RAG的能力,具备了调用工具的能力,我想在上海找一家特别小资的约会圣地?

1、直接利用AI大模型自身的能力:大模型本身就有一定的训练知识,可以识别出位置信息和地点,但不够准确详尽。

2、利用RAG知识库:把约会地点整理成知识库,让AI利用他来回答,但是需要人工提供足够的信息。

3、利用工具调用:开发一个根据位置查询附近店铺的工具,可以利用第三方地图API(比如高德),这样得到的信息更准确。

如上我们肯定会选择第3种方式来实现。既然选择调用第三方API,更实用轻松便捷的就是MCP协议。

二、MCP

什么是MCP

MC(Model Context Protocol,模型上下文协议)是一种开放标准,目的是增强AI与外部系统的交互能力。MCP为AI提供了与外部工具、资源和服务交互的标准化方式,让AI能够访问最新数据、执行复杂操作,并与现有系统集成。

根据MCP官方定义,MCP是一种开放协议,标准化了应用程序如何向大模型提供上下文的方式。可以将MCP想象成AI应用的USB接口。就像USB为设备连接各种设备提供了标准化方式一样,MCP为AI模型连接不同的数据源和工具提供了标准化方法。

🙋‍♀️🌰

方便理解MCP的作用:首先是增强AI的能力,通过MCP协议,AI应用可以轻松接入提供的服务来实现更多功能。比如搜索网页,调用第三方、执行计算得等。

其次,MCP是个协议或者标准,本身不具备提供服务的能力,只是定义好了一套规范,让服务者和服务使用者去遵守。就像HTTP协议一样,现在前后端发送请求基本都是用HTTP协议,像get/post请求类别,401、404状态码,这些标准能有效降低开发者的理解成本

此外,标准化还有其他好处。官方把查询地图的能力直接做成一个服务,谁要用谁就接入,就省去了开发成本,如果大家陆续开放自己的服务,不就相当于打造了一个服务市场。

标准可以打造生态。就像前端NPM包、后端maven仓库,Docker镜像源。或者安卓市场、App Store。

MCP三大作用:

  • 轻松增强AI能力
  • 统一标准,降低使用和理解成本
  • 打造服务生态

MCP架构

1、宏观架构

MCP核心是“客户端 - 服务器”架构,其中MCP客户端主机可以链接到多个服务器。客户端主机是指希望访问MCP服务的程序,比如Claude Desktop、IDE、AI工具或部署在服务器上的项目。

2、SDK 3层架构

如果要在程序中使用MCP或者开发MCP服务,可以引入MCP官方的SDK,比如Java SDK。

官方文档了解MCP SDK的架构,主要分3层:

分别来看每一层的作用:

  • 客户端/服务器层:McpClient处理客户端操作,而McpServer管理服务器端协议操作。两者都使用McpSession进行通信管理。
  • 会话层(McpSession):通过DefaultMcpSession实现管理通信模式和状态。
  • 传输层(McpTransport):处理JSON-RPC消息序列化和反序列化,支持多种传输实现,比如Stdio标准IO流传输和HTTPSSE远程传输。

客户端和服务端需要先经过流程建立链接,之后才能正常交换信息:

3、MCP 客户端

MCP Client是MCP架构中的关键组件,主要负责和MCP服务器建立连接并进行通信。他能自动匹配服务器的协议版本,确认可用功能、负责数据传输和JSON-RPC交互。此外,还能发现和使用各种工具、管理资源和提示词系统进行交互。

除了核心功能,MCP客户端还支持一些额外特性,比如根管理、采样控制,以及同步或异步操作,为了使用不同场景,他提供了多种数据传输方式,包括:

  • Stdio标准输入/输出:适用于本地调用
  • 基于Java HttpClient和WebFlux的SSE传输:适用于远程调用

客户端可以通过不同传输方式调用不同MCP服务,可以是本地的,也可以是远程的。

4、MCP 服务

MCP Server也是整个MCP架构的关键组件,主要用来为客户端提供各种工具,资源和功能支持。

负责处理客户端的请求,包括解析协议提供工具,管理资源以及处理各种交互信息。同事,还能记录日志,发送通过,并且支持多个客户端同时连接,保证高效的通信和协作。

和客户端一样,他也可以通过多种方式进行数据传输,比如Stdio标准输入/输出、基于Servlet/WebFlux/WebMV的SSE传输,满足不同应用场景。

这种设计是的客户端和服务端完全解耦,任何语言开发的客户端都可以调用MCP服务。

MCP核心概念

官方给出6大核心概念:

  1. Resources资源:让服务端向客户端提供各种数据,比如文本,文件,数据库记录,API响应等,客户端可以决定什么时候使用这些资源。使AI能够访问最新信息和外部知识,为模型提供更丰富的上下文。
  2. Prompts提示词:服务端可以定义可复用的提示词模板和工作流,供客户端和用户直接使用。他的作用是标准化常见AI交互模式,比如能作为UI元素(如斜杠命令,快捷键操作)呈现给用户,从而简化用户与LLM的交互过程。
  3. Tools工具:MCP中最实用的特性,服务端可以提供给客户端可调用的函数,使AI模型能够执行计算、查询信息或者外部系统哦交互,极大扩展了AI的能力范围。
  4. Sampling采样:允许服务端通过客户端向大模型发送生成内容的请求(反向请求)。使MCP服务能够实现复杂的只能代理行为,同时保持用户对整个过程的控制和数据隐私保护。
  5. Roots根目录:MCP协议的安全机制,定义了服务器可以访问文件系统位置,限制访问范围,为MCP服务提供安全边界,当值恶意文件访问。
  6. Transports传输:定义客户端和服务器间的通信方式,包括Stdio(本地进程间通信)和SSE(网络实时通信),确保不同环境下的可靠信息交换。

开发MCP服务,主要关注 Resources资源、Prompt提示词、Tools工具(重中之重),三个改变。

MCP 官方文档 中提到,大多数客户端也支持Tools工具调用能力:

实际开发中,实际应用关注Tools工具即可。

三、使用 MCP

3种使用MCP方式:

  • 云平台使用MCP
  • 软件客户端使用MCP
  • 程序中使用MCP

不管哪一种,原理类似。有2种可选的使用模式:本地下载MCP服务端代码运行(类似引入了一个SDK),或者直接使用已部署的MCP服务(类似调用别人的API)

MCP服务市场

开发者可以在这些平台上找到各种现成的MCP服务

  • MCP.so:主流,提供丰富的MCP服务目录
  • GitHub Awesome MCP Server:开源MCP服务集合
  • 阿里云百炼MCP服务市场
  • Spring AI Alibaba的MCP服务市场
  • Glama.ai MCP服务

多数MCP服务市场仅提供本地下载MCP服务端代码并运行的使用方式,部署MCP服务也需要成本

阿里云百炼平台提供了云端部署的MCP服务,在线填写配置后可以使用,轻松和平台上的AI应用集成。

云平台使用 MCP

以阿里云百炼为例,参考阿里官方MCP文档,可以直接使用官方预置的MCP服务,或者部署自己的MCP服务到阿里云平台上。

官方提供了现成的MCP服务:

进入智能体应用,在左侧可以点击添加MCP服务,然后选择想要使用的MCP服务即可,比如高德地图MCP服务,提供地理信息查询等。

测试输入Prompt:听说上海静安区有很多宝藏小吃和游玩圣地,范围5公里,,帮我规划一下吧。

AI会根据需求调用不同的工具,比如地点转换为坐标,查找某坐标附近的点:

调用工具后,AI会利用工具的输出结果进一步分析并生成回复。这个流程就像(Tool Calling)

软件客户端使用 MCP

不同客户端软件对MCP支持成都不同,可以在官方文档中查看个客户端的支持特性。

接下来,使用目前较为主流的AI客户端Cursor为例,调用MCP服务。采用本地运行的方式。

1、环境

首先安装本地运行MCP服务需要用到工具,具体安转什么工具取决于MCP服务的配置要求。

🙋‍♀️🌰

在MCP市场找到高德地图MCP,发现Server Config中定义了使用npx命令行工具来安装和运行服务端代码

大多数MCP服务都支持与npx工具运行,所以推荐安装Node.js和NPX,可去Node官方下载安装。

从配置中我们发现,使用地图MCP需要API Key,在地图开放平台创建应用并添加API Key

2、Cursor接入MCP

在右上角进入Cursor Settings设置界面,然后选择MCP,添加全局MCP Server:

从MCP市场中找到MCPServer Config,并粘贴到mcp.json配置中,注意要将API key更改为自己的

保存配置,软件会自动识别并启动服务。

3、测试使用MCP

提供Prompt:“去上海静安区的宝藏小店和打卡圣地游玩推荐。”

观察效果 ,发现AI可能会调用多次MCP

图示结果

云服务使用MCP调用次数不稳定,可能产生AI和API调用产生费用,所以不建议使用。

如果要使用其他客户端,接入方式类似,比如:

  • Cherry Studio:查看软件官方文档了解集成方法
  • Claude Desktop:参考MCP 官方的用户快速入门指南

程序中使用MCP

利用Spring AI框架,在程序中使用MCP并完成我们的需求,实现一个完成“旅游攻略”的AI助手。

首先了解Spring AI MCP客户端的基本使用方法。建议参考Spring AI Alibaba的文档。

1、在Maven中央仓库找到依赖

<!-- https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-mcp-client-spring-boot-starter -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId><version>1.0.0-M6</version>
</dependency>

2、在resouces目录下新建mcp-servers.json配置,定义需要用到的MCP服务:

{"mcpServers": {"amap-maps": {"command": "npx","args": ["-y","@amap/amap-maps-mcp-server"],"env": {"AMAP_MAPS_API_KEY": "改成你的 API Key"}}}
}

⚠️注意:在Windows环境下,命令配置需要添加.cmd后缀(如npx.cmd),否则会报错找不到命令。

3、修改Spring配置文件,编写MCP客户端配置。由于是本地运行MCP服务,所以使用stdio模式,并且要执行MCP服务配置文件的位置。

spring:ai:mcp:client:stdio:servers-configuration: classpath:mcp-servers.json

这样,MCP客户端程序启动时,会额外启动一个子进程来运行MCP服务,从而能够实现调用。

4、写一个利用MCP完成对话的方法。通过自动注入的ToolCallbackProvider获取到配置中定义的MCP服务提供的所有工具,并提供给ChatClient。

@Resource
private ToolCallbackProvider toolCallbackProvider;public String doChatWithMcp(String message, String chatId) {ChatResponse response = chatClient.prompt().user(message).advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))// 开启日志,便于观察效果.advisors(new MyLoggerAdvisor()).tools(toolCallbackProvider).call().chatResponse();String content = response.getResult().getOutput().getText();logger.info("content: {}", content);return content;
}

代码中可以看出,MCP调用的本质就是类似工具调用,并不是让AI服务器主动去调用MCP服务,而是告诉AI“MCP服务提供了哪些工具”,如果AI想要使用这些工具完成任务,就会告诉我们的后端程序在执行工具后将结果返回给AI,最后由AI总结回复。

5、测试运行

@Test
void doChatWithMcp() {String chatId = UUID.randomUUID().toString();// 测试地图 MCPString message = "上海静安区的宝藏小店,推荐打卡。";String answer =  loveApp.doChatWithMcp(message, chatId);
}

可以在地图开放品改控制查看API key的使用量,注意控制调用次数。

四、Spring AI MCP 开发模式

Spring AI在MCP官方Java SDK的基础上额外封装了一层,提供了和Spring Boot整合的SDK,支持客户端和服务端的普通调用和响应式调用。

MCP客户端开发

客户端开发主要基于Spring AI MCP Client Boot Starter,能够自动完成客户端的初始化,管理多个客户端实例,自动清理资源等。

1、引入资源

Spring AI 提供了2种客户端SDK,分别支持非响应式和响应式编程,可以根据需要选择对应的依赖包:

  • spring-ai-starter-mcp-client:核心启动器,提供stdio和基于http的SSE支持
  • spring-ai-starter-mcp-client-webflux:基于WebFlux响应式的SSE传输实现

比如下面依赖(具体以官方为准)

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
</dependency>

2、配置连接

引入依赖后,需要配置与服务器的连接,Spring AI支持两种配置方式:

1、直接写入配置文件,这种方式同时吃吃stdio和SSE连接方式

spring:ai:mcp:client:enabled: truename: my-mcp-clientversion: 1.0.0request-timeout: 30stype: SYNCsse:connections:server1:url: http://localhost:8080stdio:connections:server1:command: /path/to/serverargs:- --port=8080env:API_KEY: your-api-key

更多配置属性可参考Spring AI官方文档

2、引入Claude Desktop 格式的JSON文件,目前仅支持stdio连接方式

spring:ai:mcp:client:stdio:servers-configuration: classpath:mcp-servers.json

配置文件格式:

{"mcpServers": {"filesystem": {"command": "npx","args": ["-y","@modelcontextprotocol/server-filesystem","/Users/username/Desktop","/Users/username/Downloads"]}}
}

3、使用服务

启动项目是,Spring AI 会自动注入一些MCP相关的Bean。

1、如果想完全自主控制MCP客户端的行为,可以使用McpClient Bean,支持同异步:

// 同步客户端
@Autowired
private List<McpSyncClient> mcpSyncClients;// 异步客户端
@Autowired
private List<McpAsyncClient> mcpAsyncClients;

查看McpSyncClient的源码,发现提供了很多和MCP服务端交互的方法,比如获取工具信息,调用工具等等:

注意,每个MCP服务连接都会创建一个独立的客户端实例。

2、如果你想利用MCP服务提供的工具来增强AI的能力,可以使用自动注入的ToolCallbackProvider Bean,从中获取到ToolCallback工具对象,。

// 和 Spring AI 的工具进行整合
@Autowired
private SyncMcpToolCallbackProvider toolCallbackProvider;
ToolCallback[] toolCallbacks = toolCallbackProvider.getToolCallbacks();

绑定给ChatClient对象即可:

ChatResponse response = chatClient.prompt().user(message).tools(toolCallbackProvider).call().chatResponse();

4、其他特新

1、Spring AI同时支持同步和异步客户端类型,可根据应用需求选择合适的模式,只需要更改配置即可:

spring.ai.mcp.client.type=ASYNC

2、开发者可以通过编写自定义Client Bean来定制客户端行为,比如设置请求超时时间设置文件系统根目录的访问范围,自定义时间处理器,添加特色的日志处理逻辑。

官方提供的代码示例:

@Component
public class CustomMcpSyncClientCustomizer implements McpSyncClientCustomizer {@Overridepublic void customize(String serverConfigurationName, McpClient.SyncSpec spec) {// 自定义请求超时配置spec.requestTimeout(Duration.ofSeconds(30));// 设置此客户端可访问的根目录URIspec.roots(roots);// 设置处理消息创建请求的自定义采样处理器spec.sampling((CreateMessageRequest messageRequest) -> {// 处理采样CreateMessageResult result = ...return result;});// 添加在可用工具变更时通知的消费者spec.toolsChangeConsumer((List<McpSchema.Tool> tools) -> {// 处理工具变更});// 添加在可用资源变更时通知的消费者spec.resourcesChangeConsumer((List<McpSchema.Resource> resources) -> {// 处理资源变更});// 添加在可用提示词变更时通知的消费者spec.promptsChangeConsumer((List<McpSchema.Prompt> prompts) -> {// 处理提示词变更});// 添加接收服务器日志消息时通知的消费者spec.loggingConsumer((McpSchema.LoggingMessageNotification log) -> {// 处理日志消息});}
}

MCP服务端开发

服务端开发主要基于Spring AI MCP Server Boot Starter,能够自动配置MCP服务端组件。使开发者能够轻松创建MCP服务,向AI客户端提供工具,资源和提示词模板,从而扩展AI模型的能力范围。

1、引入依赖

  • spring-ai-starter-mcp-server:提供stdio传输支持,不需要额外的web依赖
  • spring-ai-starter-mcp-server-webmvc:提供基于SpringMCV的SSE传输和可选的stdio传输(推荐)
  • springi-ai-strater-mcp-server-webflux:提供基于Spring WebFlux的响应式SSE传输和可选的stdio传输
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency>

2、配置服务

# 使用 spring-ai-starter-mcp-server
spring:ai:mcp:server:name: stdio-mcp-serverversion: 1.0.0stdio: truetype: SYNC # 同步

开发SSE服务,配置如下:

# 使用 spring-ai-starter-mcp-server-webmvc
spring:ai:mcp:server:name: webmvc-mcp-serverversion: 1.0.0type: SYNC # 同步sse-message-endpoint: /mcp/message  # SSE 消息端点路径sse-endpoint: /sse                  # SSE 端点路径

如果开发响应式(异步)服务,配置如下:

# 使用 spring-ai-starter-mcp-server-webflux
spring:ai:mcp:server:name: webflux-mcp-serverversion: 1.0.0type: ASYNC  # 异步sse-message-endpoint: /mcp/messages # SSE 消息端点路径sse-endpoint: /sse                  # SSE 端点路径

更多配置参见Spring AI 官方文档

spring:ai:mcp:server:enabled: true                # 启用/禁用 MCP 服务stdio: false                 # 启用/禁用 stdio 传输name: my-mcp-server          # 服务名称version: 1.0.0               # 服务版本type: SYNC                   # 服务类型(SYNC/ASYNC)resource-change-notification: true  # 启用资源变更通知prompt-change-notification: true    # 启用提示词变更通知tool-change-notification: true      # 启用工具变更通知sse-message-endpoint: /mcp/message  # SSE 消息端点路径sse-endpoint: /sse                  # SSE 端点路径# 可选 URL 前缀base-url: /api/v1           # 客户端访问路径将是/api/v1/sse 和 /api/v1/mcp/message

3、开发服务

MCP服务开发都是类似的,直接泗洪@Tool注解表姐服务类中的方法。

@Service
public class WeatherService {@Tool(description = "获取指定城市的天气信息")public String getWeather(@ToolParameter(description = "城市名称,如北京、上海") String cityName) {// 实现天气查询逻辑return "城市" + cityName + "的天气是晴天,温度22°C";}
}

然后Spring Boot项目启动时注册一个ToolCallbackProvider Bean:

@SpringBootApplication
public class McpServerApplication {@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService) {return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();}
}

MCP 工具类

Spring AI提供了一系列辅助MCP开发的工具类,用于MCP和ToolCallback之间互相转换。

也就是说,开发者可以直接将之前开发的工具转换为MCP服务,极大提高代码的复用性

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

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

相关文章

在es中安装kibana

一 安装 1.1 验证访问https的连通性 # 测试 80 端口&#xff08;HTTP&#xff09; curl -I -m 5 http://目标IP:端口号 说明&#xff1a; -I&#xff1a;仅获取 HTTP 头部&#xff08;Head 请求&#xff09;&#xff0c;不下载正文&#xff0c;减少数据传输。 -m 5&#x…

嵌入式开发学习———Linux环境下网络编程学习(二)

UDP服务器客户端搭建UDP服务器代码#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h>#define PORT 8080 #define BUFFER_SIZE 1024int main() {int sockfd;char buffer[BUFFER_SIZE…

UVa1465/LA4841 Searchlights

UVa12345 UVa1465/LA4841 Searchlights题目链接题意输入格式输出格式分析AC 代码题目链接 本题是2010年icpc亚洲区域赛杭州赛区的I题 题意 在一个 n 行 m 列&#xff08;n≤100&#xff0c;m≤10 000&#xff09;的网格中有一些探照灯&#xff0c;每个探照灯有一个最大亮度 k&…

详解区块链技术及主流区块链框架对比

文章目录一、区块链技术栈详解二、主流区块链框架对比1. 公有链&#xff08;Public Blockchain&#xff09;2. 联盟链&#xff08;Consortium Blockchain&#xff09;3. 私有链&#xff08;Private Blockchain&#xff09;三、技术选型建议1. 按需求选择框架2. 开发工具与生态四…

大模型 + 垂直场景:搜索 / 推荐 / 营销 / 客服领域开发有哪些新玩法?

技术文章大纲&#xff1a;大模型 垂直场景的新玩法大模型与搜索领域的结合大模型在搜索领域的应用可以显著提升搜索结果的准确性和用户体验。利用大模型进行语义理解和上下文关联&#xff0c;能够实现更精准的意图识别。结合知识图谱和动态索引优化&#xff0c;可以增强长尾查…

p5.js 3D盒子的基础用法

点赞 关注 收藏 学会了 如果你刚接触 p5.js&#xff0c;想尝试 3D 绘图&#xff0c;那么box()函数绝对是你的入门首选。它能快速绘制出 3D 长方体&#xff08;或正方体&#xff09;&#xff0c;配合简单的交互就能做出酷炫的 3D 效果。本文会从基础到进阶&#xff0c;带你吃…

【动态规划 完全背包 卡常】P9743 「KDOI-06-J」旅行|普及+

本文涉及知识点 C动态规划 完全背包 C记忆化搜索 「KDOI-06-J」旅行 题目描述 小 C 在 C 国旅行。 C 国有 nmn\times mnm 个城市&#xff0c;可以看做 nmn\times mnm 的网格。定义 (i,j)(i,j)(i,j) 表示在网格中第 iii 行第 jjj 列的城市。 该国有 222 种交通系统&#x…

pytest框架-详解

目录 一、前言 二、pytest安装 2.1、安装 2.2、验证安装 2.3、pytest文档 三、pytest框架的约束 3.1、 python的命名规则 3.2、 pytest的命名规则 四、pytest的运行方式 4.1、主函数运行 4.2、命令行运行 五、pytest配置文件pytest.ini文件 六、前置和后置 七、as…

【递归、搜索与回溯算法】DFS解决FloodFill算法

FloodFill算法简介一、[图像渲染](https://leetcode.cn/problems/flood-fill/description/)二、[岛屿数量](https://leetcode.cn/problems/number-of-islands/description/)三、[岛屿的最大面积](https://leetcode.cn/problems/max-area-of-island/description/)四、[被围绕的区…

解决网络传输中可能出现的“粘包”

先理解核心问题&#xff1a;什么是“TCP粘包”&#xff1f; TCP 就像一条水管&#xff0c;数据通过水管从一端传到另一端。但它有个特点&#xff1a;不会按“发送时的小包”来划分&#xff0c;而是把数据当成连续的字节流。 比如&#xff1a; 你分两次发数据&#xff1a;第一次…

Docker搭建RSS订阅服务(freshRss+rsshub)

目录搭建freshRss1. 创建yml文件2. 创建容器3. 检查容器状态&#xff0c;正常运行则搭建成功4. 浏览器访问并配置数据库5. 开始使用搭建RssHub1. 创建yml文件2. 创建容器3. 检查容器状态&#xff0c;正常运行则搭建成功4. 浏览器访问生成RSS路由&#xff08;订阅地址&#xff0…

Spring 条件注解与 SPI 机制(深度解析)

在 Spring 及 Spring Boot 框架中&#xff0c;条件注解与 SPI 机制扮演着至关重要的角色&#xff0c;它们是实现自动配置、灵活控制 Bean 创建以及组件按需加载的关键所在。深入理解它们的底层实现与应用场景&#xff0c;既能帮助我们在面试中对答如流&#xff0c;又能在实际开…

Mac(二)Homebrew 的安装和使用

官网地址&#xff1a; https://brew.sh/官方文档&#xff1a; https://docs.brew.sh/Manpage Homebrew 是 macOS 上最强大的包管理器&#xff0c;让你轻松安装、更新和管理成千上万的开发工具、命令行程序&#xff08;如 wget, tree, ffmpeg&#xff09;甚至图形应用&#xff0…

Vue 侦听器(watch 与 watchEffect)全解析2

二、watchEffect:自动追踪依赖的侦听器 watchEffect 是更“简洁”的侦听器:它不需要手动指定数据源,而是自动追踪回调中用到的响应式状态——当这些状态变化时,自动触发回调。适用于“副作用与依赖绑定紧密”的场景(如依赖较多、无需区分新旧值)。 1. 基本用法(与 wat…

正点原子STM32H743配置 LTDC + DMA2D

开发板 正点原子STM32H743 阿波罗固件包 STM32Cube MCU Package for STM32H7 1.12.1开发工具 STM32CubeMX STM32CubeIDE根据原理图适配所有GPIO&#xff0c;并设置所有GPIO速度 Very Hight

北京JAVA基础面试30天打卡10

1.最佳左前缀原则是什么 Q:什么是MySQL索引I的最左匹配原则&#xff1f; A:最左匹配原则是指&#xff0c;在复合索引引中&#xff0c;查询条件需要按照索引列的顺序从最左侧列开始依次匹配。只有查询条件中的列按照索引的最左边列开始进行匹配,索引引才能被有效使用。 Q:能否举…

五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化软件的部署

五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化软件的部署 文章目录五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化软件的部署1.作用主要作用&#xff08;通俗说法&#xff09;对实战项目有什么用&#xff1f;&#xff08;直接举例&#xff09;2.集群化软…

下载及交叉编译glib,记录

下载及交叉编译glib&#xff0c;记录 编译参见这篇博客 嵌入式arm交叉编译移植bluez5.0最新教程_bluez移植-CSDN博客 编译命令有更新&#xff1a; make -j4 CFLAGS"-Wno-format-overflow" glib库的作用&#xff1a; glib 是 GNOME 项目下的一个基础库&#xff0c…

从 0 到 1 玩转Claude code(蓝耘UI界面版本):AI 编程助手的服务器部署与实战指南

前言 蓝耘 Coding UI 作为基于 Claude Code 的可视化工具&#xff0c;凭借对本地项目的深度掌控、与 Git 仓库的无缝衔接以及直观的交互界面&#xff0c;正在重构开发者的工作流。本文将带你一步步完成从环境搭建到实战使用的全流程&#xff0c;让这款工具真正成为你的编程「副…

docker使用指定的MAC地址启动podman使用指定的MAC地址启动

docker指定固定的mac地址 1】创建自定义桥接网络并配置 MAC 地址保留 docker network create --driver bridge custom_bridge2】启动容器并指定使用自定义网络 docker run -it --name your-container --network custom_bridge --mac-address 02:42:ac:11:00:02 your-image--mac…