MCP 服务部署上线(sse 模式)
一、介绍
优化 mcp-server-csdn
、mcp-server-weixin
两个 MCP ,将部署方式改为 SSE 。
增加 Dockerfile 部署脚本,让服务支持以 sse 方式,被 ai-mcp-cactusli 调用。
二、流程梳理
如图,以 sse 方式,构建服务打包上线;

Server-Sent Events
(SSE) ,是一种基于 HTTP 的服务器向客户端单向实时推送数据 的通信技术,常用于实现实时更新功能。- 在 Spring AI 框架中,SSE 的实现方式包括
spring-ai-starter-mcp-server
、spring-ai-starter-mcp-server-webflux
两种框架实现。课程以 webflux 进行使用。 - SSE 的部署方式,要把每个
mcp
服务,通过docke
r 进行部署,提供出可用的接口。之后ai-mcp-cactusli
工程则配置 sse 方式进行使用。
三、服务实现
1. 调整配置 mcp-server-csdn

1.1 pom 配置
<!-- 启用 Reactive Web 支持 && sse 模式需要配置 webflux -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
</dependency>
<!-- stdio 模式打开,sse 模式,注释掉。 -->
<build>
<finalName>mcp-server-csdn-app</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<skipTests>true</skipTests>
<testFailureIgnore>false</testFailureIgnore>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.4.3</version>
<configuration>
<mainClass>cn.cactusli.mcp.csdn.McpServerCsdnApplication</mainClass>
<layout>JAR</layout>
</configuration>
</plugin>
<!-- <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>-->
</plugins>
</build>
应用名称是为了打包使用的,注意配置,cn.cactusli.mcp.csdn.McpServerCsdnApplication
配置你的路径的名称。
1.2 配置本地用户名密码
vim .local-config
USERNAME=你的账号
PASSWORD=你的密码
1.3 Dockerfile
# 基础镜像,可以先执行 docker pull openjdk:17-jdk-slim
FROM openjdk:17-jdk-slim
# 作者
MAINTAINER cactusli
# 配置
ENV PARAMS=""
# 时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 添加应用
ADD target/mcp-server-csdn-app.jar /mcp-server-csdn-app.jar
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /mcp-server-csdn-app.jar $PARAMS"]
注意 mcp-server-csdn-app
名称要全局一样!!!
1.4 build.sh 构建脚本
# 普通镜像构建,随系统版本构建 amd/arm ./build.sh
docker build -t cactuslixf/mcp-server-csdn-app:1.0 -f ./Dockerfile .
# 兼容 amd、arm 构建镜像
# docker buildx build --load --platform liunx/amd64,linux/arm64 -t cactuslixf/mcp-server-csdn-app:1.0 -f ./Dockerfile . --push
2. 调整配置 mcp-server-weixin
2.1 pom 配置
<!-- 启用 Reactive Web 支持 && sse 模式需要配置 webflux -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
</dependency>
<!-- stdio 模式打开,sse 模式,注释掉。 -->
<build>
<finalName>mcp-server-weixin-app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.4.3</version>
<configuration>
<mainClass>cn.cactusli.mcp.weixin.McpServerApplication</mainClass>
<layout>JAR</layout>
</configuration>
</plugin>
<!-- <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>-->
</plugins>
</build>
2.2 配置本地用户名密码
vim .local-config
USERNAME=你的账号
PASSWORD=你的密码
2.3 Dockerfile
# 基础镜像,可以先执行 docker pull openjdk:17-jdk-slim
FROM openjdk:17-jdk-slim
# 作者
MAINTAINER cactusli
# 配置
ENV PARAMS=""
# 时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 添加应用
ADD target/mcp-server-weixin-app.jar /mcp-server-weixin-app.jar
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /mcp-server-weixin-app.jar $PARAMS"]
2.4 build.sh 构建脚本
# 普通镜像构建,随系统版本构建 amd/arm ./build.sh
docker build -t cactuslixf/mcp-server-weixin-app:1.0 -f ./Dockerfile .
# 兼容 amd、arm 构建镜像
# docker buildx build --load --platform liunx/amd64,linux/arm64 -t cactuslixf/mcp-server-weixin-app:1.0 -f ./Dockerfile . --push
3. 调整配置 ai-mcp-cactusli


如图,修改 ai-mcp-cactusli
配置,以 sse 方式引入 mcp 服务端对接。账号添加 tag-v2 部署脚本。
3.1 sse 配置
ai:
mcp:
client:
# stdio:
# servers-configuration: classpath:/config/mcp-servers-config-3.json
sse:
connections:
mcp-server-csdn:
url: http://192.168.1.218:8101
mcp-server-weixin:
url: http://192.168.1.218:8102
request-timeout: 521s
主要配置个请求超时时间 521s,避免网络调用有超时可不用。see 服务地址分别是http://192.168.1.218:8101、http://192.168.1.218:8102。
3.2 客户端构建
@Configuration
public class OpenAIConfig {
@Bean
public ChatClient chatClient(OpenAiChatModel openAiChatModel, ToolCallbackProvider tools) {
DefaultChatClientBuilder defaultChatClientBuilder = new DefaultChatClientBuilder(openAiChatModel, ObservationRegistry.NOOP, (ChatClientObservationConvention) null);
return defaultChatClientBuilder
.defaultToolCallbacks(tools)
.defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory()).build())
.build();
}
@Bean
public ChatMemory chatMemory() {
return MessageWindowChatMemory.builder()
.maxMessages(5000)
.build();
}
/* @Bean
public ChatClient.Builder chatClientBuilder(OpenAiChatModel openAiChatModel) {
return new DefaultChatClientBuilder(openAiChatModel, ObservationRegistry.NOOP, (ChatClientObservationConvention) null);
}*/
}
构建 ChatClient 客户端,并指定 syncMcpToolCallbackProvider tool,以及使用 chatMemory 方式记忆对话上下文,此处 gpt-4.1 的模型,配置了到了配置文件里。
3.3 构建镜像
docker build -t cactuslixf/ai-mcp-cactusli-app:1.0 -f ./Dockerfile .
# 兼容 amd、arm 构建镜像
# docker buildx build --load --platform liunx/amd64,linux/arm64 -t cactuslixf/ai-mcp-cactusli-app:1.0 -f ./Dockerfile . --push
构建完成镜像后,使用 push.sh 脚本进行推送!
3.4 部署配置
# docker-compose -f docker-compose-app-v1.0.yml up -d
services:
# ai-mcp-cactusli-app
ai-mcp-cactusli-app:
image: cactuslixf/ai-mcp-cactusli-app:1.0
container_name: ai-mcp-cactusli-app
restart: always
ports:
- "8090:8090"
volumes:
- ./log:/data/log
- ./mcp/config:/mcp/config
- ./mcp/jar:/mcp/jar
environment:
- TZ=PRC
- SERVER_PORT=8090
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=postgres
- SPRING_DATASOURCE_URL=jdbc:postgresql://vector_db:5432/ai-rag-cactusli
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver
- SPRING_AI_OLLAMA_BASE_URL=http://118.189.227.190:11434
- SPRING_AI_OLLAMA_EMBEDDING_OPTIONS_NUM_BATCH=512
- SPRING_AI_OLLAMA_MODEL=nomic-embed-text
- SPRING_AI_OPENAI_BASE_URL=https://api.openai.com/
- SPRING_AI_OPENAI_API_KEY=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
- CRON_EXPRESSION=0 * * * * ?
- SPRING_AI_OPENAI_EMBEDDING_OPTIONS_MODEL=text-embedding-3-small
- SPRING_AI_RAG_EMBEDDING=text-embedding-3-small
- SPRING_AI_MCP_CLIENT_SSE_CONNECTIONS_MCP_SERVER_CSDN_URL=http://mcp-server-csdn-app:8101
- SPRING_AI_MCP_CLIENT_SSE_CONNECTIONS_MCP_SERVER_WEIXIN_URL=http://mcp-server-weixin-app:8102
- REDIS_SDK_CONFIG_HOST=redis
- REDIS_SDK_CONFIG_PORT=6379
- REDIS_SDK_CONFIG_PASSWORD=0691bcb6
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
depends_on:
- mcp-server-csdn-app
- mcp-server-weixin-app
networks:
- my-network
mcp-server-csdn-app:
image: cactuslixf/mcp-server-csdn-app:1.0
container_name: mcp-server-csdn-app
restart: always
ports:
- "8101:8101"
volumes:
- ./log:/data/log
environment:
- TZ=PRC
- SERVER_PORT=8101
- CSDN_API_CATEGORIES=Spring boot 实战
- CSDN_API_COOKIE=xxxx
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- my-network
mcp-server-weixin-app:
image: cactuslixf/mcp-server-weixin-app:1.0
container_name: mcp-server-weixin-app
restart: always
ports:
- "8102:8102"
volumes:
- ./log:/data/log
environment:
- TZ=PRC
- SERVER_PORT=8102
- WEIXIN_API_ORIGINAL_ID=gh_c696922683xxx
- WEIXIN_API_APP_ID=wxfe46bdxxx
-
- WEIXIN_API_APP_SECRET=5dd00bbd03649653374d0a3ecafxxxb59xxx
- WEIXIN_API_TEMPLATE_ID=_o0NUW56X6taN7nQuXJEtWJ6eJrvxxx
- WEIXIN_API_TOUSER=oTyc4vjtv0cxRYt82xxxAxxx
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- my-network
networks:
my-network:
driver: bridge
配置mcp-server-weixin-app、mcp-server-csdn-app 服务。配置好 environment 信,这里需要配置你自己的参数。
在 ai-mcp-cactusli-app 启动时候依赖于两个mcp启动后,并配置 mcp 地址,如;
http://mcp-server-csdn-app:8101
为什么可以直接使用http://mcp-server-csdn-app:8101进行访问?
这是因为Docker 网络系统中的一个核心机制 —— Docker 自定义网络(Bridge 类型或 Overlay 类型)提供了内建的 DNS 服务,使得容器在同一网络中可以通过容器名互相解析并访问服务。
四、服务部署
1. 构建镜像
mcp-server-csdn、mcp-server-weixin、ai-rag-cactusli,3个工程都需要打包,构建,推送镜像到Docker hub。
2. 上传脚本

- 这里需要注意文件上传的路径
- 最后还需要确认下各个配置文件是否都修改为你的配置,如openai、微信公众号、csdn等
3. 执行脚本
执行环境安装命令

root@rag-host:/work/devops/ai-mcp-cactusli-tag-v2# docker compose -f docker-compose-environment.yml up -d
执行服务安装

root@rag-host:/work/devops/ai-mcp-cactusli-tag-v2# docker compose -f docker-compose-app-v2.0.yml up -d
4. 验证是否启动成功

- 通过 sse 通信,你可以查看执行日志,做到这,你就可以通过 sse 链接你的 mcp 服务进行通信了。