W7D3 学习手册 1.MCP回顾2.Client3.配置4.Server5.双栈 6.Obs概览7.Trace8.接W49.Metrics10.平台定位 资源达标①达标②自测速记

FDE W7D3 学习手册 · Spring AI MCP Client / Server 与 Observability

W7 周级拆解 Day3 · A 级(必须掌握,面试核心)· 约 4h · 学完能讲清"用 Spring AI 既能调 MCP Server、又能把 Java Tool 暴露成 MCP,并打通可观测 Trace"

本日定位:W2 我们手写过"保单 / 规则 Server"(MCP 风格的工具服务);W7D3 进入 Spring AI 对 MCP 协议的生产级支持:既做 MCP Client 调用已有 Server,又做 MCP Server 把 Java Tool 暴露成标准 MCP 协议;并叠加 Observability(Micrometer / Actuator)把 W4 的 Trace 字段(trace_id / model / tool)真正打通到监控。
学完能回答:① Spring AI 怎么同时做 MCP Client 和 MCP Server;② Observability 怎么接 W4 的 Trace 字段(trace_id / model / tool 等)。
使用方法:通读原理 → 重点看「🔧 工程含义」「🎤 面试话术」「⚠ 易错点」→ 做末尾自测清单 → 配合《FDE-W7D3-评测题.md》。候选人背景:36 岁,Java + 大数据 + 医疗保险,回答落到"Java 企业 AI 平台"能力,场景用保险知识库 / 特药理赔 Agent。

一、MCP 协议回顾(W2 写过的保单 / 规则 Server)

1.1 什么是 MCP

MCP(Model Context Protocol)是 Anthropic 提出的开放协议,统一了"模型 / Agent 如何连接外部数据源和工具"。它把"工具、资源、提示"标准化成一套协议,Client 和 Server 按协议通信,不再为每个工具写专属适配

Agent(App) ←—MCP 协议—→ MCP Server(暴露 tools/resources)←—→ 真实系统(保单库/规则引擎)

1.2 与 W2 的关系

W2 我们把"保单查询、理赔规则校验"做成工具服务,当时是自定义协议/HTTP。MCP 就是把这些工具标准化——任何兼容 MCP 的 Client 都能发现并调用,不必关心内部是 Java 还是 Python 实现。

MCP 的价值是"解耦":工具提供方(保单系统团队)和模型应用方(AI 平台团队)只需遵守协议,互不需知道对方技术栈。对企业多团队协作极关键。
MCP 是模型连接外部工具/数据的开放协议,把工具、资源、提示标准化。W2 我们手写保单/规则 Server,MCP 就是把这类 Server 标准化,任何兼容 Client 都能调,解耦工具方与模型方。
① MCP 不是"银弹"——它解决连接标准化,不解决工具本身的权限/幂等/质量问题。② MCP Server 一旦暴露,任何 Client 都能调,鉴权和作用域必须自己做。③ 别把 MCP 和 Function Calling 混为一谈:Function Calling 是模型厂商的能力,MCP 是跨模型的"工具连接协议",两者可叠加。

二、MCP Client:调用已有 MCP Server

2.1 能力

Spring AI 的 McpSyncClient / McpAsyncClient 连接远端 MCP Server,自动发现对方暴露的 tools,并把这些 tools 转成 Spring AI 的 ToolCallback,从而让 ChatClient 直接调用——和 W7D2 的本地 @Tool 体验一致,只是工具来自远端。

McpSyncClient(连 Server) → listTools() 发现 → 转 ToolCallback → ChatClient.tools(...) 调用

2.2 与本地 @Tool 的区别

维度本地 @ToolMCP Client 远程工具
位置同进程 Java 方法远端 Server 进程
发现编译期注解扫描运行时 listTools 动态发现
网络有(延迟/可用性问题)
团队边界同团队跨团队/跨语言
对保险平台:保单系统团队维护 MCP Server(Java 写),AI 平台团队用 McpSyncClient 接进来,ChatClient 像调本地工具一样调"查保单"。团队解耦、独立部署、独立扩缩。
MCP Client 连接远端 Server、动态发现 tools 并转成 ToolCallback,ChatClient 调用体验和本地 @Tool 一致,但工具在远端、有网络开销、跨团队。适合"工具由别的团队/语言维护"的场景。

三、MCP Client 配置(Stdio / HTTP transport)

3.1 两种传输

// HTTP 方式连接已部署的保单 MCP Server
McpClientTransport transport = HttpClientSseClientTransport.builder("http://mcp-policy-svc:8081").build();
McpSyncClient client = McpClient.sync(transport).build();
client.initialize();
List<ToolCallback> callbacks = client.listTools(null).tools().stream()
    .map(t -> new McpToolCallback(t, client)).toList();
chatClient = ChatClient.builder(chatModel).defaultTools(callbacks).build();
生产用 HTTP/SSE 而非 Stdio:Server 独立部署、可水平扩展、多 AI 应用共享、便于加鉴权与限流(呼应 W7D4 Gateway)。Stdio 仅适合本地调试/单机工具。
MCP Client 支持 Stdio(同机子进程,调试用)和 HTTP/SSE(独立部署、生产用)两种传输。保险场景的保单 Server 用 HTTP/SSE,可独立扩缩、多应用共享、便于治理。
① HTTP 方式 Server 不可达时 Client 调用会失败,要配超时 + 重试 + 降级(Server 挂了别把对话链路带崩)。② Stdio 方式 Client 负责拉起子进程,进程管理(启停/僵尸)要小心,不适合生产多实例。③ 动态发现的 tools 数量可能变化,要监控"发现到的工具集"是否和预期一致。

四、MCP Server:用 Spring AI 暴露 Java Tool 为 MCP

4.1 能力

反过来,我们也可以把现有 Java 方法通过 Spring AI 的 @Tool + MCP Server starter 暴露成标准 MCP 协议,供任何 MCP Client(不限于 Spring AI)调用。

@Tool(description = "查询保单当前状态与保障范围")
public String queryPolicy(@ToolParam(description="保单号") String policyNo) { ... }

// 启动类加 @EnableMcpServer,starter 自动把 @Tool 暴露为 MCP tools
@SpringBootApplication
@EnableMcpServer
public class PolicyMcpServer { public static void main(String[] a){ SpringApplication.run(a); } }

4.2 价值

对多语言企业:Java 保单服务暴露成 MCP 后,数据科学团队的 Python Agent、前端团队的 TS Agent 都能直接调用,无需各自写适配。这是"工具资产化"的关键。
用 @Tool + @EnableMcpServer(MCP Server starter)可把 Java 方法暴露成标准 MCP 协议,任何 MCP Client 都能调。保单团队的 Java 资产零改造即可被多语言 Agent 复用。
① 暴露成 MCP 后等于对外开放入口,必须做鉴权(token/scope)与输入校验,防越权查他人保单。② Server 的工具 description 同样影响调用准确率,即便是"被别人调"也要写清。③ MCP Server 的传输协议(Stdio/HTTP)要和 Client 匹配,否则连不上。

五、同时做 Client 与 Server 的架构

一个 AI 平台应用常同时是:Client(调保单/规则 MCP Server)+ Server(把自己的特药推理能力暴露给上游)。

上游 Agent ──MCP──> 我的应用(MCP Server: 特药推理) │ 同时作为 MCP Client └──MCP──> 保单 Server / 规则 Server
这正是 W2"保单/规则 Server"思想的放大:W2 是手写单 Server;W7D3 用 Spring AI 同时做 Client(消费别人)+ Server(被别人消费),形成工具网络。保险平台里:底层是保单/药品/规则三个 MCP Server,上层是理赔 Agent 应用(既消费也暴露)。
企业工具网络 = 多个 MCP Server(各团队维护)+ 多个 MCP Client(各 AI 应用消费)。Gateway(W7D4)可在 MCP 传输层前面做统一鉴权/限流/成本,形成"MCP 网格"。
一个应用可同时是 MCP Client(调别人的保单/规则 Server)和 MCP Server(暴露自己的特药推理)。W2 是手写单 Server,W7D3 用 Spring AI 形成 Client+Server 双栈的工具网络,多个 Server 被多个应用消费。

六、Observability 概览(Micrometer / Actuator)

6.1 三大支柱

支柱作用Spring AI 落地
Logs结构化日志LoggingAdvisor + MDC(trace_id)
Metrics聚合指标Micrometer 计数器/计时器
Traces链路追踪Micrometer Tracing / Brave,串联调用

6.2 为什么 AI 应用更需要可观测

Observability 是"AI 应用能否上生产"的分水岭。没有 Trace,一次理赔答错你无法定位是"模型问题 / 工具返回错 / 记忆注入错"。Micrometer 是 Spring 生态统一观测门面,Actuator 暴露端点。
Observability 三支柱:Logs(结构化日志)、Metrics(聚合指标)、Traces(链路追踪)。AI 应用因调用不可预测、成本按 token、链路长,更需要可观测,Spring 生态用 Micrometer + Actuator 统一落地。

七、Trace 埋点(trace_id / model / tool)

7.1 要埋哪些字段

呼应 W4 定义的 Trace 字段,AI 调用至少要记:

字段含义
trace_id一次用户请求的全链路 ID
model实际调用的模型(Qwen/DeepSeek...)
tool本次调用的工具名(如 queryPolicy)
prompt_tokens / completion_tokenstoken 用量
latency_ms耗时
status成功/失败/降级

7.2 在 Advisor 里埋

public class TraceAdvisor implements Advisor {
  public AdvisedResponse adviseCall(AdvisedRequest req, CallAdvisorChain chain){
     String tid = MDC.get("trace_id"); // 由网关/入口传入
     long t0 = System.nanoTime();
     AdvisedResponse resp = chain.nextAroundCall(req);
     Metrics.timer("ai.call", "model", currentModel, "tool", currentTool)
             .record(System.nanoTime()-t0, TimeUnit.NANOSECONDS);
     return resp;
  }
}
把 trace_id 放进 MDC,日志自动带上;再用 Micrometer 记 timer/counter。这样一次理赔请求的"模型时延、token、工具调用"都能按 trace_id 聚合分析——直接对接 W4 的 Trace 字段设计。
AI 调用 Trace 至少埋 trace_id / model / tool / token / latency / status。在 Advisor 里用 MDC 传 trace_id + Micrometer 记指标,和 W4 的 Trace 字段设计对齐。

八、与 W4 Trace 字段打通

W4 我们设计了 Agent 的 Trace 字段规范(trace_id、model、tool、step、token、cost、latency、status、error)。W7D3 的任务就是把这套规范落到 Spring AI 的实现:用 Advisor 在调用前取/生成 trace_id,调用后写 model/tool/token/latency/status,统一上报到现有 APM(如 Prometheus + Grafana + 链路追踪)。
W4 Trace 规范(字段定义) ──实现──> W7D3 Advisor 埋点 + Micrometer 上报 ──> 现有监控(APM)
面试叙事:W4 是"要记什么"(规范/Why),W7D3 是"怎么记"(Advisor + Micrometer / How)。两者用同一个 trace_id 串联——Gateway 出口的 trace_id(W7D4)和 Advisor 内的 trace_id 必须是同一个,否则链路断。
W4 定义 Trace 字段规范(trace_id/model/tool/token/cost...),W7D3 用 Advisor 埋点 + Micrometer 把它实现并上报现有 APM。两者靠同一个 trace_id 串联,且要和 W7D4 Gateway 出口的 trace_id 一致,否则链路断裂。
① trace_id 必须在入口(网关/Controller)生成并贯穿全链路,Advisor 里只取不新建,否则每段对话各自生成 id 无法串联。② 工具调用的 trace 要能"展开"成子 span(模型→tool→回灌),扁平记一条会丢失因果。③ token/cost 字段要从 ChatResponse.getMetadata().getUsage() 取真实值,别估算。

九、Metrics 指标(token、延迟、调用次数)

9.1 关键指标

指标类型用途
ai.call.countCounter调用次数、按 model/tool/status 分维
ai.call.latencyTimerP50/P95/P99 时延,定位慢模型
ai.token.totalCountertoken 消耗,算成本
ai.tool.errorCounter工具失败率,告警

9.2 结合大数据背景

把 Micrometer 指标导出到 Prometheus,再接 Kafka + 数仓做"按用户/按场景"的成本与质量分析——这正是 36 岁大数据候选人的优势落点。

指标要按 model/tool/status 打标签(tag),否则无法下钻。成本指标直接喂 W7D4 Gateway 的成本统计与配额告警。延迟 P99 是 SLA 核心。
关键 Metrics:调用次数、时延(P50/P95/P99)、token 总量、工具错误率。按 model/tool/status 打 tag 才能下钻;指标导出 Prometheus,可接数仓做成本/质量分析。

十、候选人视角:企业 AI 平台可观测性定位

大数据背景优势:把 LLM 观测数据接入 Kafka + 数仓/实时计算,做成本分摊、质量趋势、异常检测;医疗保险背景优势:懂"理赔决策必须可追溯、可审计",Trace 不是可选项而是合规要求。
讲可观测性时突出"平台能力":统一 Trace(贯穿 Gateway→工具)、成本进数仓分摊、质量大盘告警、理赔决策可追溯合规。结合大数据(数仓分析)+医保(审计刚需)背景,比单纯会用 Micrometer 高一层。

十一、学习资源(中文 / 官方)

十二、面试达标线①:Spring AI 怎么同时做 MCP Client 和 Server

角色做法适用
MCP ClientMcpSyncClient 连 Server → listTools 发现 → 转 ToolCallback → ChatClient 调用消费别团队/跨语言的工具
MCP Server@Tool + @EnableMcpServer,把 Java 方法暴露成标准 MCP把自己的 Java 资产开放给多语言 Agent
双栈同一应用既消费也暴露,形成工具网络企业 MCP 网格
达标线①核心:MCP Client 用 McpSyncClient 连远端、动态发现 tools 转 ToolCallback;MCP Server 用 @Tool + @EnableMcpServer 把 Java 方法暴露成标准协议。同一应用可双栈,形成工具网络。传输 Stdio(调试)/HTTP(生产)。

十三、面试达标线②:Observability 怎么接 W4 的 Trace 字段

  1. 字段对齐:W4 定义的 trace_id / model / tool / token / cost / latency / status 字段,在 W7D3 通过 Advisor 埋点 + Micrometer 上报实现——W4 是"规范(Why)",W7D3 是"实现(How)"。
  2. trace_id 贯穿:入口(Gateway/Controller)生成 trace_id,Advisor 里只取不新建,贯穿 Gateway→应用→工具,且要和 W7D4 Gateway 出口的 trace_id 一致。
  3. 工具链路:工具调用要展开成子 span(模型→tool→回灌),不能扁平记一条;token/cost 取 ChatResponse 真实 Usage。
  4. 对接现有监控:Micrometer 导出 Prometheus + 链路追踪,接数仓做成本/质量分析(呼应大数据背景)。

十四、W7D3 自测清单

十五、高频面试题速记卡

Q:MCP 和 Function Calling 什么关系?
Function Calling 是模型厂商能力;MCP 是跨模型的"工具连接协议"。MCP 把工具标准化,Client/Server 按协议通信,两者可叠加。
Q:MCP Client 和本地 @Tool 区别?
Client 调远端工具、运行时 listTools 动态发现、有网络开销、跨团队;本地 @Tool 是同进程、编译期扫描。
Q:Stdio 还是 HTTP 传输?
Stdio 同机子进程、调试用;HTTP/SSE 独立部署、生产用(可扩缩、多应用共享、便于加鉴权限流)。
Q:怎么把 Java 方法暴露成 MCP?
@Tool 标注方法 + @EnableMcpServer(MCP Server starter),自动暴露成标准 MCP 协议,任何 Client 可调用。
Q:一个应用能同时 Client 和 Server 吗?
能。既调别团队的保单/规则 Server(Client),又暴露自己的特药推理(Server),形成工具网络/MCP 网格。
Q:AI 应用为什么更要可观测?
调用不可预测、成本按 token、工具链路长。没 Trace 一次答错无法定位是模型/工具/记忆哪层问题。
Q:AI 调用要埋哪些 Trace 字段?
trace_id / model / tool / prompt_tokens / completion_tokens / latency_ms / status,对应 W4 的 Trace 字段规范。
Q:W7D3 怎么和 W4 Trace 打通?
W4 定规范(Why),W7D3 用 Advisor 埋点+Micrometer 实现(How),靠同一 trace_id 串联,且和 W7D4 Gateway 出口 id 一致。
Q:trace_id 在哪里生成?
在入口(网关/Controller)生成并贯穿全链路,Advisor 里只取不新建,否则每段各自生成 id 无法串联。
Q:工具调用 Trace 怎么记才对?
展开成子 span(模型→tool→回灌)保留因果,token/cost 取 ChatResponse 真实 Usage,别扁平记一条或估算。
FDE W7D3 学习手册 · Spring AI MCP Client/Server 与 Observability(面试级)· 配合《FDE-W7D3-评测题.md》自测
📌 待查★ 重要