首页 / 资讯中心 / 文章详情

基于 Spring Boot WebFlux 与 Server-Sent Events 实现 MCP HTTP 流式传输:Java 计算器演示全解析

基于 Spring Boot WebFlux 与 Server-Sent Events 实现 MCP HTTP 流式传输:Java 计算器演示全解析 ★ FEATURED ARTICLE
教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载本篇技术指南聚焦 mcp-for-beginners 仓库06-http-streaming章节中的 Java 完整实现——一个基于 Spring Boot WebFlux 和 Server-Sent EventsSSE的计算器流式传输演示。文章以该章节的 Java 解决方案文档 为骨架结合仓库内的服务端与客户端源码系统讲解 SSE 端点的构建、响应式流式消费、构建配置与运行验证方法。读完本文你将掌握在 Java 生态中实现经典 HTTP 流式传输的完整套路并理解它作为 MCP Streamable HTTP 与通知机制前置知识的作用。演示项目定位从经典 HTTP 流式传输通往 MCP 流式传输在 MCP 的演进中流式传输是连接客户端与服务器实时通信能力的关键。章节主文档 06-http-streaming/README.md 明确指出MCP 支持三类传输机制传输机制状态通知支持典型场景stdio现行支持本地子进程HTTPSSE已弃用支持遗留远程实现Streamable HTTP现行支持远程与云端服务器其中Streamable HTTP 是面向现代、可扩展、云就绪应用的首选传输。而本小节提供的 Java 演示正是用最直白的经典 HTTP 流式传输SSE向你展示流式数据的核心机制——数据分块渐进交付、客户端边收边处理、降低感知延迟。理解这一层之后再去看 MCP 的流式服务端通过通知向客户端实时推送进度主结果仍以单条消息返回会更加轻松两者的差异对照如下特性经典 HTTP 流式传输MCP 流式传输通知主响应分块chunked结束时单条返回进度更新作为数据块发送作为通知发送客户端要求必须处理流必须实现消息处理器适用场景大文件、AI Token 流进度、日志、实时反馈在阅读本文前请注意版本前提章节主文档特别警示其实现示例面向 MCP 规范2025-11-25演示的是遗留的initialize握手、Mcp-Session-Id、GET 事件流与可恢复模型MCP2026-07-28已移除这些特性新的 Streamable HTTP 请求是自包含的 POST 请求携带MCP-Protocol-Version与Mcp-Method头。详细差异可参考 mcp-2026-07-28.md。本文的 Java 演示聚焦于经典 SSE 流式传输本身的原理与实现与规范版本无关。项目结构与前置条件该 Java 演示位于 03-GettingStarted/06-http-streaming/solution/java/由两个独立的 Spring Boot 应用组成java/ ├── calculator-server/ # Spring Boot 服务端暴露 SSE 端点 │ ├── src/main/java/com/example/calculatorserver/ │ │ ├── CalculatorServerApplication.java # 应用入口 │ │ └── CalculatorController.java # /calculate SSE 控制器 │ └── pom.xml ├── calculator-client/ # Spring Boot 客户端应用 │ ├── src/main/java/com/example/calculatorclient/ │ │ └── CalculatorClientApplication.java # 消费流式端点 │ └── pom.xml └── README.md运行前提条件Java 17 或更高版本两个pom.xml中均以java.version17声明编译目标Maven 3.6 或更高版本服务端实现用FluxServerSentEvent构建 SSE 端点服务端核心是 CalculatorController.java 中的calculate方法它完整展示了 Spring WebFlux 中 SSE 的标准写法RestController public class CalculatorController { GetMapping(value /calculate, produces MediaType.TEXT_EVENT_STREAM_VALUE) public FluxServerSentEventString calculate(RequestParam double a, RequestParam double b, RequestParam String op) { double result; switch (op) { case add: result a b; break; case sub: result a - b; break; case mul: result a * b; break; case div: result b ! 0 ? a / b : Double.NaN; break; default: result Double.NaN; } return Flux.ServerSentEventStringjust( ServerSentEvent.Stringbuilder() .event(info) .data(Calculating: a op b) .build(), ServerSentEvent.Stringbuilder() .event(result) .data(String.valueOf(result)) .build() ) .delayElements(Duration.ofSeconds(1)); } }从源码结构看这个端点由四个关键要素组成produces MediaType.TEXT_EVENT_STREAM_VALUE将响应 Content-Type 声明为text/event-stream这是 SSE 协议的标志Spring 据此走流式响应路径。RequestParam参数绑定a、b为double类型数值op为运算字符串。注意参数名能否正确绑定依赖于编译期保留参数名见下文 pom.xml 的-parameters配置。FluxServerSentEventString返回类型Project Reactor 的Flux代表一个可异步发射零到多个元素的响应式流每个元素被包装成带事件类型event与载荷data的ServerSentEvent。运算语义addab、suba-b、mula*b、divb≠0 时 a/bb0 或非法运算时返回Double.NaN。值得一提的实现细节是delayElements(Duration.ofSeconds(1))它在两个事件之间人为插入 1 秒延迟用于模拟长任务的处理时间。这正是流式传输的精髓——info事件先到达通知客户端正在计算 7.0 mul 5.0约 1 秒后result事件才携带最终结果 35.0 到达客户端可以在等待期间就获得进度反馈。应用入口 CalculatorServerApplication.java 仅是一个标准的SpringBootApplication引导类通过SpringApplication.run启动由于依赖了spring-boot-starter-webflux默认内嵌Netty非阻塞 I/O 服务器作为 Web 容器。客户端实现用 WebClient 响应式消费事件流客户端 CalculatorClientApplication.java 实现CommandLineRunner在应用启动后立即发起请求代码同样完整可运行SpringBootApplication public class CalculatorClientApplication implements CommandLineRunner { private final WebClient client WebClient.builder() .baseUrl(http://localhost:8080) .build(); public static void main(String[] args) { SpringApplication.run(CalculatorClientApplication.class, args); } Override public void run(String... args) { client.get() .uri(uriBuilder - uriBuilder .path(/calculate) .queryParam(a, 7) .queryParam(b, 5) .queryParam(op, mul) .build()) .accept(MediaType.TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(String.class) .doOnNext(System.out::println) .blockLast(); } }从源码可归纳客户端的关键调用链WebClient.builder().baseUrl(...)构建指向http://localhost:8080的响应式 HTTP 客户端。.accept(MediaType.TEXT_EVENT_STREAM)告知服务端客户端可接受text/event-stream响应。.retrieve().bodyToFlux(String.class)将响应体反序列化为FluxString——这是响应式流式消费的核心每个 SSE 事件的数据部分会作为一个字符串元素被发射。.doOnNext(System.out::println)对每个到达的事件执行副作用打印到控制台事件是一个一个陆续到达的而非等全部就绪。.blockLast()阻塞直到最后一个元素到达保证CommandLineRunner在流结束前不会提前退出。客户端默认发起7 * 5的乘法计算请求完整演示了服务端渐进推送、客户端即时处理的双向配合。构建配置要点Spring Boot 3.3.1 与-parameters编译标志服务端与客户端使用同一套 Maven 构建模板以 calculator-server/pom.xml 为例properties java.version17/java.version spring.boot.version3.3.1/spring.boot.version /properties dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version${spring.boot.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement dependencies !-- Spring Boot WebFlux for SSE -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency /dependencies build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.11.0/version configuration source${java.version}/source target${java.version}/target parameterstrue/parameters /configuration /plugin plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build三个配置点值得注意spring-boot-dependencies的 BOM 导入以spring.boot.version3.3.1统管所有 Spring 依赖版本两个应用只需声明spring-boot-starter-webflux一个依赖即可同时获得 Spring WebFlux、Project Reactor 与 Netty。parameterstrue/parameters对应编译标志-parameters这是本项目特意加入的配置用于在编译产物中保留方法参数名。若缺失该配置RequestParam按参数名绑定时可能失效出现参数绑定错误。该客户端 pom 中的注释也印证了其用途Spring Boot WebFlux for WebClient。spring-boot-maven-plugin提供mvn spring-boot:run直接运行与可执行 jar 打包能力。运行与验证三种启动与测试方式方式一Maven 直接运行推荐第一步启动服务端在终端进入calculator-server目录cd calculator-server mvn clean package mvn spring-boot:run服务端将监听http://localhost:8080启动成功应看到类似输出Started CalculatorServerApplication in X.XXX seconds Netty started on port 8080 (http)第二步另开一个终端启动客户端cd calculator-client mvn clean package mvn spring-boot:run客户端会自动连接服务端、发起7 * 5的请求并逐个打印流式事件。方式二打包为可执行 jar先在两个目录分别执行mvn clean package然后直接用java -jar运行# 服务端 cd calculator-server mvn clean package java -jar target/calculator-server-0.0.1-SNAPSHOT.jar # 客户端另开终端 cd calculator-client mvn clean package java -jar target/calculator-client-0.0.1-SNAPSHOT.jarjar 包名称由pom.xml中的artifactId与version0.0.1-SNAPSHOT拼接而成如需改名可在构建配置中调整finalName。方式三手动测试服务端无需启动客户端用浏览器或 curl 即可验证 SSE 行为浏览器访问http://localhost:8080/calculate?a10b5opaddcurl 请求显式声明接受事件流curl http://localhost:8080/calculate?a10b5opadd -H Accept: text/event-stream运行客户端后预期输出为注意两个事件间约 1 秒间隔这是delayElements的效果event:info data:Calculating: 7.0 mul 5.0 event:result data:35.0API 参考GET /calculate请求参数均必填参数类型说明adouble第一个运算数bdouble第二个运算数opstring运算类型add/sub/mul/div响应Content-Type 为text/event-stream返回两个 Server-Sent Events先发info计算进度约 1 秒后发result最终结果请求示例GET /calculate?a7b5opmul HTTP/1.1 Host: localhost:8080 Accept: text/event-stream响应示例event: info data: Calculating: 7.0 mul 5.0 event: result data: 35.0支持的运算语义add加法a bsub减法a - bmul乘法a * bdiv除法a / b当 b 0 时返回 NaN故障排查与常见问题端口 8080 已被占用先停掉占用该端口的其他进程或在calculator-server/src/main/resources/application.yml中修改服务端端口如server.port: 8081同时记得同步修改客户端的baseUrl。连接被拒绝Connection refused务必先启动服务端再启动客户端并确认服务端已成功监听 8080 端口观察启动日志中的Netty started on port 8080。参数名绑定问题本项目已在两个pom.xml的maven-compiler-plugin中启用-parameters编译标志若自行改动构建配置后出现RequestParam无法解析的问题需检查该配置是否被移除。停止应用在运行各应用的终端按CtrlC若作为后台进程运行可使用mvn spring-boot:stop。技术栈一览与扩展方向本演示的技术栈与 章节主文档 及两个pom.xml完全一致Spring Boot 3.3.1应用框架与自动配置Spring WebFlux响应式 Web 框架Project Reactor响应式流库Flux、ServerSentEventNetty非阻塞 I/O 服务器WebFlux 默认内嵌容器Maven构建工具Java 17编程语言在此基础上可继续扩展增加更多数学运算如pow、mod为非法运算补充显式错误处理当前非法op会返回NaN添加请求/响应日志记录实现认证如 API Key、OAuth补充单元测试对运算逻辑与 SSE 输出做断言最后若要沿本演示继续深入 MCP 流式传输建议结合章节主文档的 Solution 索引 横向对比 Python、.NET、Rust 的实现并参考 MCP 中的通知实现 一节理解ctx.info()/ 消息处理器如何将这种经典流式思维迁移到 MCP 的进度通知体系中去。赞分享教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载相关推荐mcp-for-beginners 实战用 Spring Boot WebFlux SSE 构建 HTTP 流式计算服务Calculator HTTP Streaming Demo 全解析mcp for beginners 实战用 Spring Boot WebFlux SSE 构建 HTTP 流式计算服务Calculator HTTP教程文档人工智能基于 Spring Boot WebFlux 构建 MCP 计算器服务从 Tool 注解到 MCP Inspector 全流程实战基于 Spring Boot WebFlux 构建 MCP 计算器服务从 Tool 注解到 MCP Inspector 全流程实战 导读 本指南以 mcp教程文档人工智能基于 Spring Boot WebFlux 构建 MCP 计算器服务mcp-for-beginners 的 Java 入门实战指南基于 Spring Boot WebFlux 构建 MCP 计算器服务mcp for beginners 的 Java 入门实战指南 本篇技术指南围绕开源课程教程文档人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站