詳解mcp以及agen架構設計與實現

文章目錄

        • 1.MCP概念
        • 2.MCP服務端主要能力
        • 3.MCP技術生態
        • 4.MCP與Function call區別
        • 5.MCP生命周期
        • 6.MCP java SDK
        • 7.MCP應用場景
        • 8.基于springAI+ollma+阿里qianwen+mcp設計私有AIAgent應用實現
        • 9.AI java項目落地技術選型
        • 10.構建AI Agent四大模塊
        • 11.LLM(大模型)與MCP之間關系
        • 12.A2A、MCP、Kafka、Flink協同工作方法
        • 13.事件驅動多智能體
        • 14.flink+kafka+MCP+LLM(gemini Ai ) 應用架構demo:使用Gemini AI Agent進行實時數據處理

1.MCP概念
  • MCP(模型上下文協議):

    • mcpserver

    • mcp client

    • tools

    • Communication&tools

  • 提供標準方式的連接AI模型

2.MCP服務端主要能力
  1. Resources: 可被客戶端讀取的類文件數據(如 API 響應或文件內容)
  2. Tools: 大語言模型(需獲得用戶許可)可調用的函數
  3. Prompts: 有助于用戶完成特定任務的預寫模板
3.MCP技術生態

在這里插入圖片描述

4.MCP與Function call區別

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

5.MCP生命周期

在這里插入圖片描述

6.MCP java SDK

https://github.com/modelcontextprotocol/java-sdk

支持以下功能:

  • Creating MCP servers that expose tools, resources, and prompts
  • Building MCP clients that can connect to any MCP server
  • Local and Remote transport protocols
  • Protocol compliance with type safety
7.MCP應用場景
  • 自動預約
  • 更新客戶記錄
  • 接入database
  • 發送文件
  • 處理在線支付
  • 處理郵件
    在這里插入圖片描述
8.基于springAI+ollma+阿里qianwen+mcp設計私有AIAgent應用實現

1.安裝本地ollama,基于ollma拉取qianwen大模型,詳見關于利用ollama 與deepseek r1大模型搭建本地知識庫
2.搭建mcp客戶端與服務端
mcp服務端代碼實現:

在這里插入圖片描述
server端pom.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.mcp</groupId><artifactId>mcp-server</artifactId><version>0.0.1-SNAPSHOT</version><name>mcp-server</name><description>Demo project for Spring Boot</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-ai.version>1.0.1</spring-ai.version></properties><dependencies><!--配置springAI mcpserver--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webmvc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

java代碼實現如下:

package com.mcp.toos;import org.springframework.ai.tool.annotation.Tool;/*** 1.定義工具*/public class MathTool {@Tool(name = "數字計算工具", description = "兩個數字相加")public  Integer add(Integer a,Integer b){return  a+b;}
}package com.mcp;import com.mcp.toos.MathTool;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;/*** 定義mcp server端*/
@SpringBootApplication
public class McpServerApplication {public static void main(String[] args) {SpringApplication.run(McpServerApplication.class, args);}/*** 2.注冊MathTool到spring容器中* @return*/@Beanpublic ToolCallbackProvider mathTool(){return MethodToolCallbackProvider.builder().toolObjects(new MathTool()).build();}}

application.yml

spring:application:name: mcp-serverai:mcp:server:enabled: truename: mcp-serverversion: 1.0.0sse-endpoint: /api/v1/ssesse-message-endpoint: /api/v1/mcpcapabilities:tool: true
logging:level:io.modelcontextprotocol: TRACEorg.springframework.ai.mcp: TRACE

mcp客戶端代碼實現如下:
在這里插入圖片描述
客戶端pom.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.mcp</groupId><artifactId>mcp-client</artifactId><version>0.0.1-SNAPSHOT</version><name>mcp-client</name><description>Demo project for Spring Boot</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-ai.version>1.0.0-M6</spring-ai.version></properties><dependencies><!-- spring-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-spring-boot-autoconfigure</artifactId></dependency><!-- 如果需要集成OpenAI,還需添加對應依賴 -->
<!--		<dependency>-->
<!--			<groupId>org.springframework.ai</groupId>-->
<!--			<artifactId>spring-ai-openai-spring-boot-starter</artifactId>-->
<!--		</dependency>--><!--mcp client--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId><version>1.0.1</version></dependency><dependency><groupId>io.modelcontextprotocol.sdk</groupId><artifactId>mcp</artifactId><version>0.10.0</version></dependency><!--本地部署調用--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency><dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>2.7.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><artifactId>maven-resources-plugin</artifactId><configuration><nonFilteredFileExtensions><nonFilteredFileExtension>db</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin></plugins></build><repositories><repository><id>public</id><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository><repository><id>central</id><url>https://maven.aliyun.com/repository/central</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository><repository><name>Central Portal Snapshots</name><id>central-portal-snapshots</id><url>https://central.sonatype.com/repository/maven-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository><repository><id>maven-central</id><url>https://repo.maven.apache.org/maven2/</url><snapshots><enabled>false</enabled></snapshots><releases><enabled>true</enabled></releases></repository></repositories></project>

java代碼實現如下:

package com.mcp.client.config;import org.springframework.ai.autoconfigure.chat.client.ChatClientBuilderConfigurer;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*** 2.配置chatCleint*/@Configuration
public class McpConfig {@Beanpublic ChatMemory chatMemory() {return new InMemoryChatMemory();//使用內存記憶策略}@Beanpublic ChatClient chatClient(ChatClient.Builder builder, ChatMemory chatMemory, ToolCallbackProvider tools){return builder.defaultSystem("hi,我這個agent可以進行數字計算!").defaultTools(tools).defaultAdvisors(new SimpleLoggerAdvisor(),//打印日志new MessageChatMemoryAdvisor(chatMemory)//會話記憶).build();}// 手動注冊 ChatClientBuilderConfigurer Bean@Beanpublic ChatClientBuilderConfigurer chatClientBuilderConfigurer() {return new ChatClientBuilderConfigurer();}}package com.mcp.client.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/*** 3.實現Ai聊天agent api*/
@Slf4j
@RestController
public class AIController {private final ChatClient chatClient;public AIController(ChatClient chatClient) {this.chatClient = chatClient;}/*** 處理聊天請求,使用AI和MCP工具進行響應*/@GetMapping("/api/v1/caculate")public String caculate() {// 使用ChatClient與LLM交互
//        String message = "8+9等于多少?";String message = "mcp數字計算都有哪些功能?";// 使用API調用聊天
//        String content = chatClient.prompt(message)
//                .call()
//                .content();String content=chatClient.prompt().user(message).call().content();System.out.println(">>> 問題: " + message);System.out.println(">>> 回答:" + content);return content;}}package com.mcp.client;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;/*** 1.定義mcp客戶端*/
@SpringBootApplication
public class McpClientApplication {public static void main(String[] args) {SpringApplication.run(McpClientApplication.class, args);}@Beanpublic CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,ToolCallbackProvider tools) {return args -> {// 構建ChatClient并注入MCP工具var chatClient = chatClientBuilder.defaultTools(tools).build();// 使用ChatClient與LLM交互String userInput = "8+9等于多少?";System.out.println("\n>>> QUESTION: " + userInput);System.out.println("\n>>> ASSISTANT: " + chatClient.prompt(userInput).call().content());};}}

application.yml配置如下:

server:port: 8081servlet:encoding:charset: utf-8enabled: trueforce: truespring:application:name: mcp-clientmain:allow-bean-definition-overriding: trueweb-application-type: servletai:ollama:base-url: http://localhost:11434chat:model: qwen2.5:7bmcp:client:enabled: truename: mcp-clientversion: 1.0.0request-timeout: 30stype: syncsse:connections:server1:url: http://localhost:8080sse-endpoint: /api/v1/ssetoolcallback:enabled: trueroot-change-notification: truechat:client:observations:log-prompt: falsemandatory-file-encoding: UTF-8logging:level:io:modelcontextprotocol:client: DEBUGspec: DEBUGorg.springframework.ai.model.tool: DEBUG# IP 白名單相關配置
ip-white-list:enabled: trueips: 127.0.0.1,192.168.1.100# 其他相關配置項
9.AI java項目落地技術選型

在這里插入圖片描述

10.構建AI Agent四大模塊

在這里插入圖片描述

11.LLM(大模型)與MCP之間關系

在這里插入圖片描述
在這里插入圖片描述

12.A2A、MCP、Kafka、Flink協同工作方法

Kafka負責數據的流動,而 Flink 負責在數據流經系統時對其進行轉換、豐富、監控和編排。

Kafka和Flink構成了事件驅動的基礎,可以支持可擴展的agent通信和計算。它們解決了直接的點對點通信無法解決的問題:

  • 解耦:使用Kafka,agent不需要知道誰將消費它們的輸出。它們將事件(例如,"TaskCompleted", "InsightGenerated")發布到主題;任何感興趣的agent或系統都可以訂閱。
  • 可觀測性和可重放性:Kafka維護每個事件的持久、按時間排序的日志,使agent行為完全可追溯、可審計和可重放。
  • 實時決策:Flink使agent 能夠實時響應事件流,根據動態條件過濾、豐富、連接或觸發操作。
  • 彈性和擴展:Flink作業可以獨立擴展、從故障中恢復并在長時間運行的工作流中保持狀態。這對于執行復雜的多步驟任務的agent至關重要。
  • 流原生協調:agen可以通過事件流進行協調,發布更新、訂閱工作流并協同推進狀態,而不是等待同步響應。

A2A、MCP、Kafka、Flink 、mongodb協同工作方法:

為了充分實現企業級、可互操作的AI agent的愿景,需要四個層次:

  • 協議:A2A(實現AI代理之間的無縫通信和協作,打破agent鼓搗、促進互操性), MCP(讓LLM能夠訪問數據和工具) – 定義什么
  • 框架:LangGraph, CrewAI, ADK(智能體開發套件) – 定義如何
  • 消息傳遞基礎設施:Apache Kafka – 支持流動
  • 實時計算:Apache Flink – 支持思考

在這里插入圖片描述

13.事件驅動多智能體

使用Apache Flink和 Apache Kafka為多智能體系統構建一個事件驅動的編排器,利用Flink來解析和路由消息,同時將Kafka用作系統的短期共享內存。

任何多智能體系統的核心都在于智能體如何進行通信。

請求/響應模型雖然在概念上很簡單,但當系統需要演進、適應新信息或在不可預測的環境中運行時,往往會失效。這就是為什么由 Apache Kafka 和Apache Flink等技術支持的事件驅動消息傳遞通常是企業應用程序的更佳模型。

事件驅動智能體
在這里插入圖片描述
事件驅動架構允許智能體動態通信,無需嚴格的依賴關系,這使它們更具自主性和韌性。智能體不再硬編碼關系,而是對事件做出反應,從而實現了更高的靈活性、并行性和容錯能力。

就像事件驅動架構為微服務和團隊提供解耦一樣,它們在構建多智能體系統時也能帶來同樣的優勢。智能體本質上是一個帶有 “大腦”的有狀態微服務,因此,許多用于構建可靠分布式系統的模式同樣適用于智能體。

此外,流治理能夠驗證消息結構,防止格式錯誤的數據干擾系統。這一點在當今現有的多智能體框架中往往缺失,這使得事件驅動架構更具吸引力。

編排:協調智能體工作流

? 現實世界中的應用需要多個智能體協作,承擔不同的職責,同時共享上下文。這帶來了任務依賴、故障恢復和通信效率方面的挑戰。

編排器模式通過引入一個主導智能體(即編排器)來解決這些問題,該智能體指導其他智能體進行問題解決。與傳統微服務那樣的靜態工作流不同,智能體生成動態執行計劃,分解任務并實時調整。
在這里插入圖片描述
靈活性帶來的挑戰:

  • 任務激增 —— 智能體可能會生成數量不受限制的任務,這就需要進行資源管理。
  • 監控與恢復 —— 智能體需要一種方法來跟蹤進度、發現故障并重新規劃。
  • 可擴展性 —— 系統必須能夠處理不斷增加的智能體交互,且不會出現瓶頸。

事件驅動架構比較擅長處理上面這些問題。

借助流式處理的核心架構,智能體能夠立即對新數據做出反應,高效追蹤依賴關系,并從容地從故障中恢復,所有這些都不會出現集中式瓶頸。

智能體系統本質上是動態的、有狀態的和自適應的 —— 這意味著事件驅動架構是一種天然的契合。

事件驅動的多智能體系統的參考架構**,使用 Apache Flink 和Apache Kafka實現編排器模式**,為大規模的實時智能體決策提供支持。

使用flink進行多智能體編排

? 構建可擴展的多智能體系統需要實時決策以及智能體之間消息的動態路由。這是Apache Flink發揮關鍵作用的地方

Apache Flink是一個流處理引擎,旨在對無界數據流進行有狀態計算。與批處理框架不同,Flink 能夠實時處理事件,使其成為編排多智能體交互的理想工具。

編排器模式(Orchestrator Pattern)

多智能體系統需要一個協調器來決定哪個智能體應該處理給定的任務。不同于智能體做出臨時決定,協調器會接收消息,使用大語言模型(LLM)對其進行解讀,然后將消息路由到合適的智能體。

為了在 Flink中支持這種編排模式,Kafka被用作消息骨干,而Flink則作為處理引擎:
在這里插入圖片描述

  1. 消息生成:
    • 代理向Kafka主題生成消息
    • 每條消息都包含與某個代理相關的原始上下文數據
  2. Flink Processing & Routing:
  • Flink job 監聽kafka中新消息
  • 新消息被傳遞給一個大語言模型(LLM),該模型會確定處理這條信息的最合適的代理。
  • 大語言模型(LLM的)決策基于結構化的智能體定義,該定義包括
    Agent Name — 代理的唯一標識符
    Description — 代理主要功能.
    Input — 由數據契約強制規定的智能體處理的預期數據格式
    Output — 智能體生成的結果
  1. 決策輸出與路由

    一旦大語言模型LLM選擇了合適的代理,Flink就會將消息發布到與已識別代理相關聯的HTTP 端點。

  2. 代理執行與繼續

    • 代理處理該消息,并將更新寫回代理消息主題
    • Flink job會檢測到這些更新,重新評估是否需要額外處理,并繼續路由消息,直到代理工作流完成

閉環

這種事件驅動的反饋循環使多智能體系統能夠自主且高效地運行,確保:

  • 實時決策,無需硬編碼工作流。
  • 具有去中心化智能體交互的可擴展執行。
  • 對新輸入和系統變化的無縫適應性。

實現構建一個事件驅動的多智能體系統:銷售開發代表(SDR:sales development representative)系統,它能夠自主管理銷售線索。
在這里插入圖片描述
AI銷售開發代表多智能體系統

? 該系統由多個專門的代理組成,這些代理負責潛在客戶資格認定和參與流程的不同階段。每個代理都有明確的角色,并在事件驅動的流程中獨立運作。

? AI SDR系統中的代理

  1. Lead Ingestion Agent(潛在客戶攝入代理): 捕獲原始的潛在客戶數據,通過額外研究對其進行充實,并生成潛在客戶檔案。
  2. Lead Scoring Agent(銷售線索評分代理): 分析潛在客戶數據,以分配優先級分數并確定最佳的參與策略。
  3. Active Outreach Agent: 利用潛在客戶的詳細信息和評分生成個性化的外展信息.
  4. Nurture Campaign Agent(培育活動代理): 根據潛在客戶的來源地及其興趣動態創建一系列電子郵件。
  5. Send Email Agent: 接收電子郵件并設置營銷活動以發送這些郵件。

? 這些代理之間沒有明確的依賴關系。它們只是獨立地生成和消費事件

?

? Flink SQL中編排工作的方法:

? 1. 創建模型

? 用于設置模型的Flink SQL語句如下所示,其中包含用于執行映射操作的提示詞的簡化版本。
在這里插入圖片描述
2.創建Flink job使用模型去處理接入的消息并且分配他們正確的代理:
在這里插入圖片描述
Executing the Orchestrator as a Flink Job

這會自動將消息路由到相應的代理,確保實現無縫、智能的工作流程。每個代理處理其任務,并將更新寫回 Kafka,以便流程中的下一個代理采取行動。

? 總結:事件驅動型多智能體系統的未來
? AI SDR 系統展示了事件驅動架構如何使多智能體系統高效運行,無需僵化的工作流程即可做出實時決策。通過利用 Flink進行消息處理和路由,以及Kafka 作為短期共享內存,實現了一個可擴展、自主的編排框架,使智能體能夠動態協作。

關鍵要點是:智能體本質上是帶有 “大腦” 的有狀態微服務,而那些使微服務得以擴展的事件驅動原則同樣適用于多智能體系統。不再采用靜態的、預定義的工作流程,而是讓系統和團隊實現解耦,能夠動態適應,在新數據到來時做出反應。

雖然本篇博客文章重點討論了編排器模式,但值得注意的是,其他模式也可以得到支持。在某些情況下,智能體之間需要更明確的依賴關系,以確保可靠性、一致性或滿足特定領域的約束。例如,某些工作流程可能需要智能體嚴格按順序執行,以保證事務完整性或合規性。關鍵在于根據應用需求在靈活性和控制力之間找到恰當的平衡。

14.flink+kafka+MCP+LLM(gemini Ai ) 應用架構demo:使用Gemini AI Agent進行實時數據處理

在這里插入圖片描述
在這里插入圖片描述
提示詞 payload 是json格式,通過kafka發送schema (json),然后交由flink進行處理
在這里插入圖片描述
在這里插入圖片描述
通過AI發布json消息到kafka topic,可用的topics如下:

  • kafka
  • rule
  • event
  • agg-transactions

AI Agent架構過程
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98786.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98786.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98786.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

六級第一關——下樓梯

上目錄&#xff1a; 目錄 題目描述 輸入格式 輸出格式 輸入輸出樣例 說明/提示 一、DP的意義以及線性動規簡介 在一個困難的嵌套決策鏈中&#xff0c;決策出最優解。 二、動態規劃性質淺談 三、子序列問題 &#xff08;一&#xff09;一個序列中的最長上升子序列&am…

【Linux基礎】Linux系統配置IP詳解:從入門到精通

目錄 1 Linux網絡配置概述 2 網卡配置文件位置和命名規則 2.1 配置文件位置 2.2 網卡命名規則 2.3 配置文件命名示例 3 網卡配置文件詳解 3.1 主要參數說明 4 Linux系統配置IP步驟 4.1 DHCP動態配置 4.2 靜態IP配置 5 Linux網絡配置流程 5.1 網絡配置流程 5.2 網卡…

C語言sprintf的高效替代方案

C語言的sprintf和snprintf將變量格式化輸出到內存buffer&#xff0c;其功能強大&#xff0c;用起來很方便。但sprintf系列函數的運行效率低下&#xff0c;主要包括四方面的原因&#xff1a;格式字符串解析、變參處理、locale&#xff08;本地化&#xff09;支持和通用&#xff…

【知識堂】制造業與物流數字化全景圖:系統縮寫大全與專業名詞速查手冊

前言在制造業和物流行業的數字化轉型過程中&#xff0c;我們經常會接觸到大量的 系統縮寫&#xff08;如 ERP、MES、WMS…&#xff09;和 專業名詞&#xff08;如 AGV、BOM、LOT…&#xff09;。 這些縮寫往往讓剛入行的人“一頭霧水”&#xff0c;即使是有經驗的從業者&#x…

利用JSONCrack與cpolar提升數據可視化及跨團隊協作效率

文章目錄前言1. 在Linux上使用Docker安裝JSONCrack2. 安裝Cpolar內網穿透工具3. 配置JSON Crack界面公網地址4. 遠程訪問 JSONCrack 界面5. 固定 JSONCrack公網地址前言 JSONCrack 是一款功能強大的開源數據可視化工具&#xff0c;專為解析和展示復雜的 JSON、XML 等結構化數據…

CANoe入門之一 CANoe功能概述

01 CANoe功能概述 CANoe軟件在汽車電子領域被廣泛應用。 CANoe軟件的全稱是CAN Open Environment&#xff0c;它是一個專業的系統級總線和ECU仿真、分析、開發、測試工具。支持ECU或總線網絡開發從需求分析到系統實現的全過程&#xff0c;包括模型創建、仿真、測試、診斷及通信…

項目管理核心八項(軟件篇)

2025年09月11日23:50:33&#xff1a;進來常思&#xff0c;寫代碼也五六年了&#xff0c;后面的路該何去何從呢&#xff1f; 項目管理核心八項一、項目管理之“建立開發人員 backup 機制”二、待補充一、項目管理之“建立開發人員 backup 機制” “建立開發人員 backup 機制” 是…

springboot redisson 分布式鎖入門與實戰

Spring Boot3 Redisson 項目地址 https://gitee.com/supervol/loong-springboot-study &#xff08;記得給個start&#xff0c;感謝&#xff09; Redisson 介紹 在分布式系統中&#xff0c;多節點部署的應用對共享資源&#xff08;如數據庫記錄、緩存鍵、文件&#xff09;的…

使用 Tkinter + Requests 實現地理信息安全系統學習時長助手

?重磅&#xff01;盹貓的個人小站正式上線啦&#xff5e;誠邀各位技術大佬前來探秘&#xff01;? 這里有&#xff1a; 硬核技術干貨&#xff1a;編程技巧、開發經驗、踩坑指南&#xff0c;帶你解鎖技術新姿勢&#xff01;趣味開發日常&#xff1a;代碼背后的腦洞故事、工具…

構建一個優雅的待辦事項應用:現代JavaScript實踐

構建一個優雅的待辦事項應用&#xff1a;現代JavaScript實踐本文將介紹如何使用現代JavaScript&#xff08;ES6&#xff09;和DOM操作創建一個功能完整的待辦事項應用&#xff0c;無需任何外部庫或框架。功能概述添加新任務標記任務為完成/未完成編輯任務內容刪除任務過濾任務&…

【數據可視化-111】93大閱兵后的軍費開支情況———2024年全球軍費開支分析:用Python和Pyecharts打造炫酷可視化大屏

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

3.2.Maven-概述-介紹安裝

一.介紹&#xff1a;二.安裝&#xff1a;Maven的安裝比較簡單&#xff0c;因為他是綠色版的軟件&#xff0c;官方給我們提供Maven的安裝包就是一個zip壓縮包&#xff0c;在進行Maven安裝以及配置的時候&#xff0c;主要進行如下4步操作&#xff1a;第一步&#xff1a;把官方提供…

Kafka面試精講 Day 14:集群擴容與數據遷移

【Kafka面試精講 Day 14】集群擴容與數據遷移 在“Kafka面試精講”系列的第14天&#xff0c;我們將深入探討 Kafka 運維中最關鍵的操作之一&#xff1a;集群擴容與數據遷移。隨著業務增長&#xff0c;原始 Kafka 集群可能面臨磁盤不足、吞吐瓶頸或節點負載不均等問題&#xff…

字節一面 面經(補充版)

什么是RabbitMQ&#xff0c;特點是什么怎么理解保障消息的一致性String、StringBuffer、StringBuilder解釋一下線程安全先操作數據庫再刪緩存還是先刪緩存再操作數據庫這種辦法能杜絕數據不一致問題嗎解釋一下AOP介紹Redis的特點&#xff08;Redis比較快&#xff09;Redis為什么…

【MFC】對話框屬性:Absolute Align(絕對對齊)

前言 本文介紹對話框屬性中的Absolute Align(絕對對齊)&#xff0c;同時給出相關示例便于理解。 目錄1 位置2 詳解3 示例1 位置 首先介紹一下這個屬性在哪里。 在資源視圖中雙擊對話框節點&#xff0c;打開該對話框&#xff1b; 鼠標右鍵工作區空白處&#xff0c;單擊屬性&…

【從0開始學習Java | 第17篇】集合(中-Set部分)

文章目錄Java集合之Set&#xff1a;無序不重復的元素容器一、Set接口的核心特性二、常用實現類及底層原理1. HashSet&#xff1a;基于哈希表的高效實現2. LinkedHashSet&#xff1a;保留插入順序的哈希實現3. TreeSet&#xff1a;基于紅黑樹的排序實現三、實現類對比與選擇建議…

玩轉Docker | 使用Docker部署dufs文件管理工具

玩轉Docker | 使用Docker部署dufs文件管理工具 前言 一、 dufs介紹 Dufs簡介 核心特性 ?? 靜態文件服務 ?? 文件夾打包下載 ?? 拖拽上傳文件/文件夾 ?? 文件在線創建、編輯與搜索 ? 斷點續傳與部分傳輸 ?? 細粒度訪問控制 ?? HTTPS 安全傳輸 ?? WebDAV 兼容支持…

【混合開發】vue+Android、iPhone、鴻蒙、win、macOS、Linux之android 把assert里的dist.zip 包解壓到sd卡里

一圖勝千言 上一篇有 <!-- 讀寫外部存儲 --> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"android:maxSdkVersion"28"/> <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE&qu…

線程的創建.銷毀

線程線程的創建在 C 中&#xff0c;線程的創建核心是通過std::thread類實現的&#xff0c;其構造函數需要傳入一個可調用對象&#xff08;Callable Object&#xff09;作為線程入口。可調用對象包括普通函數、lambda 表達式、函數對象&#xff08;functor&#xff09;、類的成員…

MySQL基礎全面解析

MySQL作為最流行的關系型數據庫管理系統之一&#xff0c;是每一位開發者必備的核心技能。本文將系統性地解析MySQL的基礎知識&#xff0c;結合關鍵概念與實戰應用&#xff0c;幫助您構建扎實的數據庫基礎。1. SQL與NoSQL的本質區別SQL&#xff08;結構化查詢語言&#xff09;數…