Spring AI 系列之三十一 - Spring AI Alibaba-基于Nacos的MCP

之前做個幾個大模型的應用,都是使用Python語言,后來有一個項目使用了Java,并使用了Spring AI框架。隨著Spring AI不斷地完善,最近它發布了1.0正式版,意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說真是一個福音,其功能已經能滿足基于大模型開發企業級應用。借著這次機會,給大家分享一下Spring AI框架。

注意由于框架不同版本改造會有些使用的不同,因此本次系列中使用基本框架是 Spring AI-1.0.0,JDK版本使用的是19,Spring-AI-Alibaba-1.0.0.3-SNAPSHOT
代碼參考: https://github.com/forever1986/springai-study

目錄

  • 1 基于Nacos的MCP
  • 2 MCP 服務注冊到 Nacos
    • 2.1 前提準備
    • 2.2 代碼
    • 2.3 演示
  • 3 Client 結合 Nacos 實現 MCP 集群發現
    • 3.1 代碼實現
    • 3.2 演示

前幾章基本上對Spring AI Alibaba的基本使用,包括模型、提示詞、聊天記憶等講了一遍,可以看到基本上使用方式與Spring AI差異不大,這一章講一下Spring AI Alibaba-基于Nacos的MCP,這是一個基于企業級生產環境實踐總結出來的應用框架。

1 基于Nacos的MCP

Spring AI Alibaba MCP 結合 Nacos 服務注冊中心,為企業級智能體應用提供了強大的基礎架構支持。這一組合解決方案主要圍繞三條核心技術線展開,實現了從服務注冊、工具代理到服務發現的完整閉環,為企業級 AI 應用部署提供了堅實基礎。

在這里插入圖片描述

Nacos3中提供了新的MCP列表功能,其中有三類MCP服務可以注冊到Nacos:

  • 第一類:已有的API服務,通過聲明自動轉化為 MCP 服務,配合 Higress 的協議轉換能力,實現 0 代碼改造成 MCP 服務協議
  • 第二類:已經構建好的或其他供應商提供的 MCP 服務,可以導入到 Nacos 中,進行其描述、工具列表、工具 Schema 等內容的動態修改和維護
  • 第三類:新構建的 MCP 服務注冊, 配合 Spring AI Alibaba應用框架或者Nacos-MCP 的 sdk,能夠做到像微服務一樣自動注冊到 Nacos 中進行統一的管理和維護

前兩類都是Nacos3本身支持的功能,這里主要是講Spring AI Alibaba。因此本次演示的是第三類,使用Spring AI Alibaba框架注冊服務到Nacos,并通過Spring AI Alibaba框架獲得及發現MCP服務。

2 MCP 服務注冊到 Nacos

參考lesson25子模塊中ali-mcp-server子模塊

示例說明:本實例創建一個MCP的server,里面有一個查詢天氣的工具,然后將MCP服務(基于sse模式)注冊到Nacos上面,本次使用Nacos3.0.2版本

2.1 前提準備

1)安裝并啟動nacos3.0.2

在這里插入圖片描述
2)申請高德開放平臺的API KEY

在這里插入圖片描述

2.2 代碼

1)新建lesson25子模塊

2)在lesson25子模塊下,新建ali-mcp-server子模塊,其pom引入如下:

<dependencies><!-- MCP Nacos 注冊 --><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-nacos-mcp-server</artifactId></dependency><!-- MCP Server (webflux) --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId></dependency>
</dependencies>

3)新建application.properties配置文件

server.port=9005
spring.application.name=mcp-nacos-registry-examplespring.ai.dashscope.api-key=你的阿里百煉API KEY
spring.ai.dashscope.chat.options.model=qwen-plus## NacosMcpProperties nacos的配置
spring.ai.alibaba.mcp.nacos.namespace=public
spring.ai.alibaba.mcp.nacos.server-addr=localhost:8848
spring.ai.alibaba.mcp.nacos.username=nacos
spring.ai.alibaba.mcp.nacos.password=nacos## McpServerProperties MCP的配置
spring.ai.mcp.server.name=webflux-mcp-server
spring.ai.mcp.server.version=1.0.0
spring.ai.mcp.server.type=ASYNC## NacosMcpRegistryProperties MCP注冊到nacos的配置
spring.ai.alibaba.mcp.nacos.registry.enabled=true
spring.ai.alibaba.mcp.nacos.registry.service-group=mcp-server
spring.ai.alibaba.mcp.nacos.registry.service-name=webflux-mcp-server

4)配置RestTemplateConfig類:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

5)新增天氣查詢服務WeatherService:

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class WeatherService {@Autowiredprivate RestTemplate restTemplate;private static final String adcode = "adcode";@Tool(description = "獲取中國城市的天氣情況")public String getWeatherForecastByCity(@ToolParam(description = "城市名稱") String city) {// 獲取城市的adcodeString result = restTemplate.getForObject("https://restapi.amap.com/v3/geocode/geo?address="+city+"&key=ef3cbaef8f0965c6205f56e0ff00ceb4", String.class);// 這里為了方便簡單處理一下字符串獲取adcode,正式的話需要解析json格式int startIndex = result.indexOf(adcode);String code = result.substring(startIndex+adcode.length()+3,result.indexOf(",",startIndex)-1);// 通過城市的adcode,進行獲取天氣預報result = restTemplate.getForObject("https://restapi.amap.com/v3/weather/weatherInfo?extensions=all&key=ef3cbaef8f0965c6205f56e0ff00ceb4&city="+code, String.class);return result;}}

6)新建啟動類Lesson25ServerApplication,注冊工具:

import com.demo.lesson25.server.service.WeatherService;
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;@SpringBootApplication
public class Lesson25ServerApplication {public static void main(String[] args) {SpringApplication.run(Lesson25ServerApplication.class, args);}@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService) {return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();}}

2.3 演示

1)啟動項目后,在nacos控制臺的MCP服務列表可以看到注冊的MCP服務

在這里插入圖片描述

2)點擊詳情,可以看看詳情

在這里插入圖片描述

3)查看服務列表,可以看到服務已經注冊到nacos

在這里插入圖片描述

4)點擊詳情可以看到服務地址

在這里插入圖片描述

3 Client 結合 Nacos 實現 MCP 集群發現

參考lesson25子模塊中ali-mcp-client子模塊

示例說明,本實例創建一個MCP的client,通過Nacos方式,將上面注冊的工具通過sse模式拉取到本地,并訪問測試

3.1 代碼實現

1)在lesson25子模塊下,新建ali-mcp-client子模塊,其pom引入如下:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-nacos-mcp-client</artifactId></dependency><!-- 引入的是mcp-client --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client-webflux</artifactId></dependency>
</dependencies>

2)創建application.properties配置文件

server.port=9006
spring.application.name=mcp-nacos-client-examplespring.ai.dashscope.api-key=你的阿里百煉API KEY
spring.ai.dashscope.chat.options.model=qwen-plus## NacosMcpProperties nacos的配置
spring.ai.alibaba.mcp.nacos.namespace=public
spring.ai.alibaba.mcp.nacos.server-addr=localhost:8848
spring.ai.alibaba.mcp.nacos.username=nacos
spring.ai.alibaba.mcp.nacos.password=nacos## NacosMcpSseClientProperties MCP客戶端配置通過nacos獲取的MCP server
spring.ai.alibaba.mcp.nacos.client.enabled=true
spring.ai.alibaba.mcp.nacos.client.sse.connections.server1.service-name=webflux-mcp-server
spring.ai.alibaba.mcp.nacos.client.sse.connections.server1.version=1.0.0## McpClientCommonProperties  MCP客戶端配置的配置
spring.ai.mcp.client.enabled=true
spring.ai.mcp.client.name=mcp-client-webflux
spring.ai.mcp.client.version=1.0.0
spring.ai.mcp.client.type=ASYNC

3)配置ClientController 演示類:

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ClientController {private final ChatClient chatClient;public ClientController(ChatClient.Builder chatClientBuilder, @Qualifier("loadbalancedMcpAsyncToolCallbacks") ToolCallbackProvider tools) {this.chatClient = chatClientBuilder.defaultToolCallbacks(tools.getToolCallbacks()).build();}@GetMapping("/ai/generate")public String generate(@RequestParam(value = "message", defaultValue = "請問北京市目前天氣預報?") String message) {return this.chatClient.prompt().user(message).call().content();}
}

說明:工具的獲取,Spring AI Alibaba分為同步和異步
1)同步方式:

  • 通過@Qualifier(“loadbalancedSyncMcpToolCallbacks”) ToolCallbackProvider tools參數注冊;
  • 通過@Autowired private List loadbalancedMcpSyncClients;變量注冊

2)異步方式:

  • 通過@Qualifier(“loadbalancedMcpAsyncToolCallbacks”) ToolCallbackProvider tools參數注冊;
  • 通過@Autowired private List loadbalancedMcpAsyncClients;變量注冊

4)啟動類Lesson25ClientApplication :

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Lesson25ClientApplication {public static void main(String[] args) {SpringApplication.run(Lesson25ClientApplication.class, args);}}

3.2 演示

http://localhost:9006/ai/generate

在這里插入圖片描述

結語:本章通過一個基于Nacos的MCP服務端和MCP客戶端,演示了Spring AI Alibaba-基于Nacos的MCP實現方法,當然Spring AI Alibaba-基于Nacos的MCP是一種企業級的應用模式,詳情可以參考官方文檔,它并不止提供本章內容,比如遠程其它MCP服務也可以通過Nacos注冊等等。這里就不多累述。

Spring AI系列上一章:《Spring AI 系列之三十 - Spring AI Alibaba-其它模型》

Spring AI系列下一章:《Spring AI 系列之三十二 - Spring AI Alibaba-Graph框架之入門》

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

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

相關文章

sqli-labs:Less-12關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $uname".$uname."; $passwd".$passwd."; $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入類型&#xff1a;字符串型&#xff0…

【SpringAI】8.通過json動態添加mcp服務

前言 官方示例的代碼中&#xff0c;mcp一般是配置到yml中或者json文件中&#xff0c;使用自動裝配的方式注入服務&#xff0c;這種方式不方便在程序啟動后添加新的服務&#xff0c;這里參考cherry studio的方式動態添加mcp服務 1.確定方案 mcp服務的維護放到mysql業務數據庫維…

【PDF + ZIP 合并器:把ZIP文件打包至PDF文件中】

B站鏈接 PDF ZIP 合并器&#xff1a;把ZIP文件打包至PDF文件中_嗶哩嗶哩_bilibiliz 加強作者的工具 https://wwgw.lanzn.com/i8h1C32k9bef 密碼:30cv 新增c框架&#xff0c;加快運行速度

阿里云部署微調chatglm3

git Ifs install Git lfs 主要用于管理大型文件。在傳統的Git倉庫中&#xff0c;所有文件內容都會被完整記錄在每一次提交中&#xff0c;這會導致倉庫體積增大&#xff0c;克隆、拉取和推送操作變慢&#xff0c;甚至可能超出存儲限額。Git LFS通過將大文件替換成文本指針&#…

Linux網絡編程 ---五種IO模型

五種IO模型一、IO慢的原因二、五種IO模型三、如何設置非阻塞式IO&#xff1f;一、IO慢的原因 二、五種IO模型 阻塞式IO 非阻塞式IO 信號驅動IO 多路轉接 異步IO 三、如何設置非阻塞式IO&#xff1f; &#xff08;一&#xff09;用法說明 &#xff08;二&#xff0…

Obsidian結合CI/CD實現自動發布

CI/CDQuickAddJS腳本bat腳本sh腳本實現自動發版Hugo文章 需求來源 每次手動執行Hugo的命令&#xff0c;手動把public文件夾上傳到自己的服務器可以完成發版需求。 但是&#xff0c;作為一個內容創作者&#xff0c;我更希望的關注于自己的內容&#xff0c;而不是關注整個發版…

[硬件電路-141]:模擬電路 - 源電路,信號源與電源,能自己產生確定性波形的電路。

源電路&#xff08;Source Circuit&#xff09;是電子系統中為其他電路或負載提供特定信號或能量的基礎電路模塊&#xff0c;其核心功能是生成、調節或轉換所需的物理量&#xff08;如電壓、電流、波形、頻率等&#xff09;。以下是源電路的詳細解析&#xff1a;一、源電路的核…

Unity_數據持久化_PlayerPrefs基礎

Unity數據持久化 一、數據持久化基礎概念 1.1 什么是數據持久化 定義&#xff1a; 數據持久化就是將內存中的數據模型轉換為存儲模型&#xff0c;以及將存儲模型轉換為內存中的數據模型的統稱。 通俗解釋&#xff1a; 將游戲數據存儲到硬盤&#xff0c;硬盤中數據讀取到游戲中&…

什么是列存儲(Columnar Storage)?深度解析其原理與應用場景

列存儲的基本概念&#xff1a;顛覆傳統的數據組織方式列存儲&#xff08;Column Storage&#xff09;是一種革命性的數據庫存儲技術&#xff0c;它通過按列而非按行組織數據&#xff0c;從根本上改變了數據的物理存儲結構。與傳統行存儲數據庫不同&#xff0c;列式數據庫將每一…

機器人抓取流程介紹與實現——機器人抓取系統基礎系列(七)

機器人抓取系統基礎系列文章目錄 1. UR機械臂的ROS驅動安裝官方教程詳解——機器人抓取系統基礎系列&#xff08;一&#xff09; 2. MoveIt控制機械臂的運動實現——機器人抓取系統基礎系列&#xff08;二&#xff09; 3. 機器人&#xff08;機械臂&#xff09;的相機選型與安裝…

【Qt】QObject::startTimer: Timers cannot be started from another thread

QTimer對象的 start 函數調用必須和創建QTimer對象是同一個線程。 #include "QtTimerTest.h" #include <QDebug>QtTimerTest::QtTimerTest(QWidget *parent): QMainWindow(parent),m_timer(nullptr),m_timerThread(nullptr), m_workingThread(nullptr) {ui.set…

社會治安滿意度調查:為城市安全治理提供精準參考(滿意度調查公司)

在社會治理不斷深化的背景下&#xff0c;公眾對社會治安的感知與評價已成為衡量城市治理水平的重要維度&#xff08;社會治安滿意度調查&#xff09;&#xff08;公眾滿意度調查&#xff09;&#xff08;滿意度調查&#xff09;。為全面掌握市民對治安狀況的真實反饋&#xff0…

Python篇--- Python 的加載、緩存、覆蓋機制

要理解 import 與 if __name__ "__main__": 的關系&#xff0c;以及 Python 的加載、緩存、覆蓋機制&#xff0c;我們可以從 “模塊的兩種身份” 和 “導入的全過程” 入手&#xff0c;用通俗的例子一步步拆解。一、核心&#xff1a;模塊的 “雙重身份” 與 __name_…

Java設計模式之行為型模式(訪問者模式)應用場景分析

訪問者模式&#xff08;Visitor Pattern&#xff09;作為Java設計模式中的“隱形冠軍”&#xff0c;常被開發者低估其價值。這一模式通過“雙分派”機制巧妙解耦數據結構與操作&#xff0c;為復雜系統的擴展提供了強大武器。在大廠項目中&#xff0c;訪問者模式往往出現在業務邏…

【IDEA】JavaWeb自定義servlet模板

方法一&#xff1a;&#xff08;推薦去使用方法二&#xff0c;還能創建其它代碼模板&#xff09;使用servlet模板創建Servlet類如果創建時找不到servlet模板&#xff1a;File -> Project Structure然后應用 -> OK&#xff0c;如果還是找不到Servlet模板&#xff0c;看看項…

Linux選擇

在內存中運行著的進程稱為&#xff08; 服務 &#xff09;。負責控制systemd系統和服務管理器的工具為&#xff08; systemctl &#xff09;命令。systemd管理系統服務的基本單位是&#xff08; unit &#xff09;。分配和管理資源的基本單位是&#xff08; 進程 &#xf…

【Redis學習路|第一篇】初步認識Redis

概要: 深入探討NoSQL數據庫的核心特性&#xff0c;對比傳統關系型數據庫的差異&#xff0c;重點介紹Redis作為內存數據庫的優勢與應用場景。 文章目錄認識 NoSQLNoSQL vs SQL 對比1?? 結構化 vs 非結構化2?? 關聯 vs 非關聯3?? 查詢方式對比4?? 事務特性5?? 存儲方式…

java局域網聊天室小項目架構思路

java局域網聊天室小項目架構思路 項目需求 創建一個局域網聊天系統&#xff0c;要求&#xff1a;用戶在登錄界面登錄后進入聊天窗口界面&#xff0c;能實現多用戶同時在線聊天&#xff0c;并且用戶之間可以進行私聊 項目用到的技術棧 java網絡編程java多線程java面向對象編…

vulhub-corrosion2靶機

1.安裝靶機 https://download.vulnhub.com/corrosion/Corrosion2.ovahttps://download.vulnhub.com/corrosion/Corrosion2.ova 2.掃描IP 3.掃描端口 4.訪問端口 首先訪問一下80端口 訪問一個8080端口發現是一個apache的頁面 5.掃描目錄與漏洞探測 那么我們掃描一下目錄 80…

Mysql深入學習:慢sql執行

目錄 慢查詢日志 慢查詢主要步驟 11種慢查詢的場景分析 場景一&#xff1a;SQL 沒有建立索引 場景二&#xff1a;索引未生效的典型原因 場景三&#xff1a;LIMIT 深分頁導致性能下降 場景四&#xff1a;單表數據量過大導致 SQL 性能下降 場景五&#xff1a;ORDER BY 出現…