之前做个几个大模型的应用,都是使用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 出现…