SpringAI-mcp-sse方式

1.什么是SSE

Server-Sent Events 是基于 HTTP 协议的实时单向服务器推送技术,具有轻量级、⾃动重连和事 件分类型特点,适⽤于实时数据推送 场景。允许服务器主动向客户端(如浏览器)推送实时数据。与 传统的轮询或⻓轮询不同, SSE 通过单⼀的持久连接实现数据的实时传输,客户端⽆需频繁发起请求。

2.SSE的特点

  • 单向通信
    • SSE 是单向的,服务器可以主动推送数据到客户端,但客户端⽆法直接通过 SSE 向服 务器发送数据。
  • 基于 HTTP 协议
    • SSE 使⽤标准的 HTTP 协议,⽆需额外的协议或端⼝配置,兼容性好,易于实现。
  • 轻量级
    • 相⽐ WebSocket , SSE 的实现更简单,代码量更少,适合简单的实时数据推送场景。
  • ⾃动重连
    • 如果连接断开,浏览器会⾃动尝试重新连接,开发者⽆需⼿动处理重连逻辑。
  • ⽀持事件类型
    • 服务器可以发送不同类型的事件,客户端可以根据事件类型执⾏不同的操作。
  • 支持消息 ID
    • 每条消息可以包含⼀个唯⼀的 ID ,⽤于断线重连后恢复消息流。

3.SSE工作原理

相⽐传统的请求-响应模式, SSE 提供了⼀种持久连接,允许服务器随时向客户端发送事件和 数据,实现了实时性的消息传递。 SSE 的⼯作原理⾮常简单直观。客户端通过与服务器建⽴⼀条持久化的 HTTP 连接,然后服 务器使⽤该连接将数据以事件流( event stream)的形式发送给客户端。这些事件流由多个 事件( event )组成,每个事件包含⼀个标识符、类型和数据字段。客户端通过监听事件流 来获取最新的数据,并在接收到事件后进⾏处理。

4.SSE应用场景

服务端想主动向客户端发送回音

5.搭建服务器

5.1导依赖

XML 复制代码
 <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
        </dependency>
    </dependencies>

5.2书写配置

XML 复制代码
server:
  port: 8011
spring:
  application:
    name: ai-mcp-sse-server
  ai:
    mcp:
      server:
        name: ai-mcp-sse-server
        sse-message-endpoint: /mcp/city

5.3开发工具

java 复制代码
package com.jiazhong.mingxing.ai.siliconflow.glm.mcp.sse.server.service;

import org.springframework.stereotype.Service;

@Service
public interface CityService {
    String city();
}
java 复制代码
package com.jiazhong.mingxing.ai.siliconflow.glm.mcp.sse.server.service.impl;

import com.jiazhong.mingxing.ai.siliconflow.glm.mcp.sse.server.service.CityService;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;

@Service
public class CityServiceImpl implements CityService {
    @Tool(description = "中国最宜居的城市",name = "cityService")
    public String city() {
        return "青岛:北方宜居标杆,中科院 2024 宜居榜首。属于温带海洋性气候,四季分明,湿度适中。海岸线长达 817 公里,绿化覆盖率达 41%,空气优良率常年超 92%。拥有 12 家三甲医院,以及青岛大学、中国海洋大学等高校,地铁运营里程超 400 公里。";
    }
}

5.4注册服务

java 复制代码
package com.jiazhong.mingxing.ai.siliconflow.glm.mcp.sse.server.config;

import com.jiazhong.mingxing.ai.siliconflow.glm.mcp.sse.server.service.CityService;
import jakarta.annotation.Resource;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServiceConfig {
    @Resource
    private CityService cityService;
    @Bean("toolCallbackProvider")
    public ToolCallbackProvider toolCallbackProvider(){
        return MethodToolCallbackProvider.builder().toolObjects(cityService).build();
    }
}

5.5启动项

java 复制代码
package com.jiazhong.mingxing.ai.siliconflow.glm.mcp.sse.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AiSiliconflowGlmMcpSseServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(AiSiliconflowGlmMcpSseServerApplication.class,args);
    }
}

6.搭建客户端

6.1导依赖

XML 复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-openai</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-mcp-client</artifactId>
        </dependency>
    </dependencies>

6.2配置文件

XML 复制代码
server:
  port: 8012
spring:
  application:
    name: ai-siliconflow-glm-mcp-sse-client
  ai:
    openai:
      base-url: https://api.siliconflow.cn
      api-key: 你的轨迹流动的的key
      chat:
        options:
          model: "zai-org/GLM-4.6"
          temperature: 0.7

    mcp:
      client:
        name: ai-siliconflow-glm-mcp-sse-client
        sse:
          connections:
            server1:
              url: http://localhost:8011 #要连接服务器的地址 (先启动服务区后启动客户端)
          toolcallback:
            enabled: true

6.3配置类

java 复制代码
package com.jiazhong.mingxing.ai.siliconflow.glm.mcp.sse.client.config;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ChatClientConfig {
    @Resource
    private OpenAiChatModel openAiChatModel;
    @Resource
    private ToolCallbackProvider toolCallbackProvider;
    @Bean("openAiChatClient")
    public ChatClient openAiChatClient(){
        return ChatClient.builder(openAiChatModel)
                .defaultToolCallbacks(toolCallbackProvider)
                .build();
    }
}

6.4controller类

java 复制代码
package com.jiazhong.mingxing.ai.siliconflow.glm.mcp.sse.client.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/city_client")
public class CityClientController {
    @Resource
    private ChatClient openAiChatClient;
    @GetMapping(value = "/a",produces = "text/html;charset=utf-8")
    public Flux<String> a(@RequestParam("question") String question){
        return openAiChatClient.prompt()
                .user(question)
                .stream().content();
    }
}

6.5启动类

java 复制代码
package com.jiazhong.mingxing.ai.siliconflow.glm.mcp.sse.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AiSiliconflowGlmMcpSseClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(AiSiliconflowGlmMcpSseClientApplication.class,args);
    }
}
相关推荐
大大杰哥几秒前
String常用方法
java
littleM6 分钟前
OpenClaw vs HermesAgent 对比分析系列
人工智能·架构·ai编程
AI医影跨模态组学8 分钟前
Research(IF=10.9)南方医科大学珠江医院汪洋教授等团队:深度学习在脊柱MRI诊断中的应用:AI辅助与人工的多中心对比研究
人工智能·深度学习·论文·医学影像·影像组学
Zldaisy3d13 分钟前
上交大特材所 l 增材制造多层级功能结构综述
人工智能
缝艺智研社16 分钟前
誉财 YC - 16 POLO 衫智能自动钉扣机:POLO 衫钉扣新变革
人工智能·新人首发·自动化缝纫机·线上模板机·无人自动化产线
AI人工智能+电脑小能手17 分钟前
【大白话说Java面试题】【Java基础篇】第20题:HashMap在计算index的时候,为什么要对数组长度做减1操作
java·开发语言·数据结构·后端·面试·哈希算法·hash-index
带电的小王18 分钟前
【动手学深度学习】8.4. 循环神经网络
人工智能·pytorch·rnn·深度学习
yigan_Eins18 分钟前
Transformer|残差连接的技术演进:从CNN到ResNet
人工智能·深度学习·cnn·transformer
道可云19 分钟前
道可云人工智能&OPC每日资讯|《广东省加快推进人工智能全域全时全行业高水平应用行动方案》发布
人工智能
嵌入式×边缘AI:打怪升级日志19 分钟前
嵌入式Linux开发(了解交叉编译工具链的组成)
java·linux·运维