ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

mcp-for-beginners 实战:用 Spring Boot WebFlux + SSE 构建 HTTP 流式计算服务(Calculator HTTP Streaming Demo 全解析)

mcp-for-beginners 实战:用 Spring Boot WebFlux + SSE 构建 HTTP 流式计算服务(Calculator HTTP Streaming Demo 全解析) 教程文档人工智能【免费下载链接】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点击查看免费下载本文以本仓库03-GettingStarted/06-http-streaming章节的 Java 版 Calculator HTTP Streaming Demo 为骨架结合仓库内完整源码讲解如何用 Spring Boot WebFlux 与 Server-Sent EventsSSE实现真正的边算边推流式 HTTP 服务服务端逐条推送计算进度与结果事件客户端实时消费并打印。读完本文你将掌握 SSE 的传输格式、Reactive 流式 APIFluxServerSentEventT与WebClient.bodyToFlux()的完整用法并能把这一模式迁移到 MCPModel Context Protocol流式通知的实战开发中。背景为什么需要 HTTP 流式传输在正式进入 Java 代码之前先厘清一个关键概念。流式传输Streaming是一种网络编程技术它允许数据以小块或事件序列的方式逐步发送与接收而不是等整个响应组装完成后再一次性返回。它在以下场景尤其重要大文件、大数据集的分批传输实时更新聊天消息、进度条长时间运行的计算任务希望持续向用户反馈中间状态。其核心价值是数据渐进式到达、客户端边到边处理从而降低感知延迟、改善用户体验。关于流式传输与 MCP 传输机制stdio、HTTPSSE、Streamable HTTP的系统对比可参考章节总文档 06-http-streaming/README.md其中明确指出HTTPSSE 已在 MCP2025-03-26版本弃用并由 Streamable HTTP 取代本 Java 示例属于经典 HTTP 流式传输教学示例SSE用于演示流式编程范式本身而 MCP 中的流式则表现为进度/日志通知 最终结果单次返回的结构化 JSON-RPC 消息模式。项目结构本示例由两个 Maven 工程组成完整源码位于03-GettingStarted/06-http-streaming/solution/java/java/ ├── calculator-server/ # Spring Boot 服务端暴露 SSE 端点 │ ├── src/main/java/com/example/calculatorserver/ │ │ ├── CalculatorServerApplication.java # 启动入口 │ │ └── CalculatorController.java # /calculate SSE 控制器 │ ├── src/main/resources/ │ │ └── application.yml # 端口配置8080 │ └── pom.xml ├── calculator-client/ # Spring Boot 客户端应用 │ ├── src/main/java/com/example/calculatorclient/ │ │ └── CalculatorClientApplication.java # 流式消费端 │ └── pom.xml └── README.md # 本示例的原始说明文档工作原理Calculator Server暴露/calculate端点接收查询参数a数值、b数值、op运算类型支持add、sub、mul、div四种运算以 Server-Sent Events 的形式返回计算进度与最终结果。Calculator Client连接服务端发起一次7 * 5的计算请求消费流式响应将每个事件逐条打印到控制台。源码级解析服务端如何边算边推服务端全部逻辑浓缩在一个控制器中源码见 CalculatorController.java。1. 声明 SSE 端点GetMapping(value /calculate, produces MediaType.TEXT_EVENT_STREAM_VALUE) public FluxServerSentEventString calculate(RequestParam double a, RequestParam double b, RequestParam String op) {produces MediaType.TEXT_EVENT_STREAM_VALUE指定响应内容类型为text/event-stream这是 SSE 的标准 MIME 类型浏览器与各种 HTTP 客户端据此识别流式事件方法返回FluxServerSentEventString——这是 Project Reactor 的响应式流类型意味着响应体不是一次性字符串而是一个可订阅的事件流这正是 Spring WebFlux 支持流式响应的关键三个RequestParam分别绑定a、b、op其中a、b为doubleop为String。2. 运算分发逻辑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; }add加、sub减、mul乘、div除四种运算除法的边界处理值得注意当b 0时返回Double.NaN而不是抛出异常避免请求直接 500未匹配的op如pow、sqrt同样落入default分支返回Double.NaN——从源码结构看目前没有对非法运算做显式错误事件这是文档Next Steps建议改进的点之一。3. 构造 SSE 事件流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));Flux.just(...)一次性装配两个事件ServerSentEvent.builder()为每个事件指定事件类型event字段与数据载荷data字段第一个事件类型为info载荷是形如Calculating: 7.0 mul 5.0的进度描述第二个事件类型为result载荷是计算结果字符串.delayElements(Duration.ofSeconds(1))让两个事件之间间隔 1 秒发出模拟真实场景中处理需要耗时的效果——这是让客户端真正体会到流式到达而不是一次全给的关键设计。4. 服务端启动入口CalculatorServerApplication.java 是标准的 Spring Boot 入口SpringBootApplication public class CalculatorServerApplication { public static void main(String[] args) { SpringApplication.run(CalculatorServerApplication.class, args); } }默认内嵌 Netty 非阻塞服务器监听端口由 application.yml 指定为 8080server: port: 8080源码级解析客户端如何流式消费客户端是一个实现了CommandLineRunner的 Spring Boot 应用源码见 CalculatorClientApplication.java。1. 构建 WebClientprivate final WebClient client WebClient.builder() .baseUrl(http://localhost:8080) .build();WebClient是 Spring WebFlux 的响应式 HTTP 客户端baseUrl指向服务端地址默认端口 8080。2. 组装请求并流式接收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();uriBuilder.queryParam(...)依次注入a7、b5、opmul等价于请求GET /calculate?a7b5opmul.accept(MediaType.TEXT_EVENT_STREAM)在请求头声明Accept: text/event-stream告知服务端我要 SSE 流.bodyToFlux(String.class)是关键一步把响应体解码为一个FluxString每个String对应 SSE 中的一个data:数据行——客户端从此获得一个可以逐条订阅的事件流.doOnNext(System.out::println)在每条数据到达时立即打印实现边到边打.blockLast()阻塞等待流结束最后一条result到达后返回保证CommandLineRunner在流消费完之前进程不退。3. 启动入口public static void main(String[] args) { SpringApplication.run(CalculatorClientApplication.class, args); }客户端同样是一个标准 Spring Boot 应用因为实现了CommandLineRunner应用启动完成后会自动执行run(...)中的消费逻辑。Maven 构建配置两个工程的关键点两个 pom.xml客户端见 calculator-client/pom.xml配置完全对称值得注意的有三点Java 版本与 Spring Boot 版本properties java.version17/java.version spring.boot.version3.3.1/spring.boot.version /properties通过dependencyManagement导入spring-boot-dependenciesBOM 统一管理依赖版本。唯一的核心依赖spring-boot-starter-webflux。服务端依赖它获得响应式 Web 框架SSE 支持 Netty客户端依赖它获得WebClient。注释写得很直白服务端!-- Spring Boot WebFlux for SSE --客户端!-- Spring Boot WebFlux for WebClient --。-parameters编译标志maven-compiler-plugin中parameterstrue/parameters该配置把方法参数名写入字节码确保 Spring 能按名字绑定RequestParam。若缺失此配置可能出现参数绑定异常——这正是文档 Troubleshooting 第 3 条的来源详见下文。运行指南方式一使用 Maven推荐1. 启动服务端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)2. 运行客户端另开一个终端进入客户端目录cd calculator-client mvn clean package mvn spring-boot:run客户端会自动连接服务端发起7 * 5的计算并把流式事件逐条打印。方式二直接使用 Java 运行打包好的 Jar1. 编译并运行服务端cd calculator-server mvn clean package java -jar target/calculator-server-0.0.1-SNAPSHOT.jar2. 编译并运行客户端cd calculator-client mvn clean package java -jar target/calculator-client-0.0.1-SNAPSHOT.jar手动测试服务端除了运行配套客户端还可以用浏览器或 curl 直接验证 SSE 端点。使用浏览器访问http://localhost:8080/calculate?a10b5opadd浏览器会按 SSE 规范解析text/event-stream响应并持续显示到达的事件。使用 curlcurl http://localhost:8080/calculate?a10b5opadd -H Accept: text/event-stream通过-H Accept: text/event-stream显式声明接受 SSE 流即可在终端逐条看到事件帧。预期输出运行客户端后应看到类似以下的流式输出event:info data:Calculating: 7.0 mul 5.0 event:result data:35.0两行之间空行分隔正是 SSE 事件帧的标准格式event:行声明事件类型data:行承载载荷空行表示一个事件结束。由于服务端delayElements设置了 1 秒间隔你会先看到info事件约 1 秒后再看到result事件——这就是流式与一次性响应最直观的体验差异。API 参考GET /calculate请求参数参数必填类型说明a是double第一个操作数b是double第二个操作数op是String运算类型add、sub、mul、div响应Content-Type: text/event-stream返回包含计算进度与结果的 Server-Sent Events 流请求示例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除法b ! 0 ? a / b : Double.NaN除零返回 NaN故障排查常见问题端口 8080 被占用停止占用 8080 端口的其他应用或在 calculator-server 的 application.yml 中修改server.port并将客户端的baseUrl同步改为新端口。连接被拒绝Connection refused确保先启动服务端再启动客户端确认服务端已在 8080 端口成功启动观察 Netty started on port 8080 日志。参数名绑定问题本项目在 Maven 编译插件中配置了-parameters标志parameterstrue/parameters若遇到参数绑定异常请确认项目是使用该配置构建的——缺少此标志时Spring 无法按名称解析RequestParam。停止应用在每个应用运行的终端按CtrlC或若以后台进程方式运行使用mvn spring-boot:stop。技术栈一览组件说明Spring Boot 3.3.1应用框架BOM 统一管理版本Spring WebFlux响应式 Web 框架提供 SSE 与 WebClientProject Reactor响应式流库Flux/ServerSentEventNetty非阻塞 I/O 服务器内嵌于 WebFluxMaven构建工具含-parameters编译标志Java 17编程语言与运行时与 MCP 流式传输的衔接与扩展建议本示例是理解 MCP 流式通知的绝佳铺垫。对照 06-http-streaming/README.md 中的对比表经典 HTTP 流式本示例主响应本身就是分块流式传输进度以数据块形式内嵌在主响应流中MCP 流式Notifications主结果仍是一次性返回进度/日志以独立的 JSON-RPC 通知消息LoggingMessageNotification在过程中实时推送客户端需实现消息处理器来区分通知与最终结果。二者的设计哲学差异在于经典流式把进度塞进响应体MCP 把进度提升为结构化的一等消息类型。本仓库在同一章节提供了 MCP 流式的多语言实现Python 版解决方案 使用ctx.info()发送进度通知并运行transportstreamable-http可与本 Java 示例对照学习。另外需注意本仓库的教学示例明确标注了协议版本差异——章节文档提示MCP 规范2025-11-25中的initialize握手、Mcp-Session-Id、GET 事件流等能力已被2026-07-28规范移除后者改为自包含的 POST 请求详见 01-CoreConcepts/mcp-2026-07-28.md在新建实现前务必先行确认。官方给出的下一步练习建议增加更多数学运算如pow、sqrt为非法运算补充显式错误处理当前default分支仅返回 NaN添加请求/响应日志实现认证机制补充单元测试。对 Java 开发者而言建议直接修改CalculatorController的switch分支与Flux组装逻辑观察 SSE 事件流的变化从而深入理解响应式流式编程的每一环。赞分享教程文档人工智能【免费下载链接】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点击查看免费下载相关推荐基于 Spring Boot WebFlux 构建 MCP 计算器服务mcp-for-beginners 的 Java 入门实战指南基于 Spring Boot WebFlux 构建 MCP 计算器服务mcp for beginners 的 Java 入门实战指南 本篇技术指南围绕开源课程教程文档人工智能基于 Rust 与 Streamable HTTP 构建 MCP 计算器服务mcp-for-beginners HTTP 流式传输实战基于 Rust 与 Streamable HTTP 构建 MCP 计算器服务mcp for beginners HTTP 流式传输实战 在 mcp for b教程文档人工智能Kedro 模块化 Data Engineering 流水线指南以 split_data 节点为核心的训练/测试数据切分Kedro 模块化 Data Engineering 流水线指南以 split_data 节点为核心的训练/测试数据切分 导读 本文以 Kedro 官方项目模教程文档人工智能上一篇PowerToys中文汉化终极指南3分钟让微软工具箱变母语界面下一篇Puter.js 实战指南零配置接入云存储、NoSQL、托管与 500 AI 模型的单脚本开源方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表