部署Higress让服务无痛实现MCP Server

2,331 阅读5分钟

前言

在前面的几小节MCP Server实现示例中都需要在服务中接入MCP的实现,这样做会存在以下几个问题:

  1. MCP Server的实现对JDK和tomcat等都有版本要求,导致很多已有项目接入MCP存在困难;
  2. 想要接入MCP Server都要写一套接入协议的代码,人力成本和时间成本投入线性增长;
  3. SSE通信方式需要维护session,项目复杂度和成本投入增大;

遇到这些问题的话,那么通过Higress来达到接入MCP的方式可以说是首选了。接下来就是实战如何部署配置Higress,并完成普通Restful接口实现MCP协议的过程。

Docker Compose配置编写

关于docker、docker-compose如何安装的问题不在此篇文章的研究范围,默认为已经安装好docker、docker-compose,下面是我们部署Higress示例的相关docker-compose.yaml配置:


version: "3"
services:
  higress-ai:
    image: "higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/all-in-one:latest"
    ports:
      - "8001:8001"
      - "8080:8080"
      - "8443:8443"
    volumes:
      - "./higress:/data"
  higress-redis:
    image: "higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/redis-stack-server:7.4.0-v3"
    ports:
      - "6379:6379"

我们通过下面命令直接把容器运行起来:


docker-compose up -d

Higress McpServer配置

我们在相对路径./higress/configmaps中,找到higress-config.yaml文件,需要新增以下配置:


apiVersion: v1
kind: ConfigMap
metadata:
  name: higress-config
  namespace: higress-system
  creationTimestamp: "2000-01-01T00:00:00Z"
  resourceVersion: "1"
data:
  higress: |-
    # 下面为新增配置
    mcpServer:
      # mcp server sse请求后缀,提供给mcp client访问
      sse_path_suffix: /sse
      enable: true
      # 解决session共享问题,交给redis存储
      redis:
        # redis的ip和端口,需要把$ip替换成redis的ip
        address: $ip:6379
        # redis用户名密码,根据实际来填写
        username: ""
        password: ""
        # 目标db
        db: 0
      # 指定映射规则,符合规则的请求会转成mcp sse请求
      match_list:
        - match_rule_domain: "*"
          match_rule_path: /mcp
          match_rule_type: "prefix"
      servers: []

重启Higress容器:


docker-compose restart higress-ai

上面的配置就是开启Higress Mcp Server的功能,并实现了分布式session共享,指定了相应的请求映射规则,这样的话,符合规则的请求都会按照MCP Server请求来处理,那么MCP Client就需要按照这个映射规则来配置请求MCP Server的SSE url。

测试一下服务是否启动成功,浏览器访问(云服务器需要确认8001端口是否开放):http://ip:8001/,成功后将出现Higress重置密码的界面。

准备业务服务

我们需要准备一个业务服务,比如查询天气,或者只返回hello world也行,对外提供restful接口,为了方便演示,我们做了一个Hello服务,代码如下:


@RestController  
public class HelloController {  
  
	@GetMapping("/hello")  
	public Map<String, String> hello() {  
		Map<String,String> result = new HashMap<>();  
		result.put("text","hello");  
		return result;
	}  
}

然后我们把这个服务打成war包,并部署起来。要求是该Hello服务提供的接口需要能被Higress所在的网络环境访问。 为了方便起见,我们同样使用docker来部署Hello服务,docker-compose配置如下:


  tomcat:
    image: "tomcat:10-jre17"
    ports:
      - "8081:8080"
    volumes:
      - "./tomcat/webapps:/usr/local/tomcat/webapps"

通过下面命令把tomcat镜像和服务运行起来:


docker-compose up -d tomcat

tomcat服务运行起来后,我们会看到对应的文件夹也创建好了,此时webapps里面并没有任何war包。接下来我们需要把打好的war包上传到webapps文件夹里面:

上传之前先把tomcat容器停止,避免上传过程中就被自动解包:


docker-compose stop tomcat

执行上传操作:


scp xxxxx.war root@ip:xxxx/tomcat/webapps/ROOT.war

上面命令中的xxxx需要替换成war包的名称和目标路径,ip需要替换成目标服务器的ip地址,可参考scp命令指南。

上传完毕后,启动tomcat容器:


docker-compose up -d tomcat

打开浏览器测试一下服务是否启动成功(云服务器需要确定安全组开启了8080端口):http://ip:8081/hello

配置Higress,接入MCP Server Tools

  1. 配置服务来源 现在我们需要在Higress上配置Hello服务,因为我们的Hello服务是单独部署的,没有接入任何注册中心,也没有配置域名,那么直接通过固定地址的方式配置: Pasted image 20250517194439.png

  2. 新增路由配置

    接下来就要配置路由,把用户请求路由到Hello服务上: Pasted image 20250517204917.png

    Pasted image 20250517205253.png

  3. 新增MCP Server Tools

    最后我们通过配置MCP服务器插件的方式,把目标接口配置成Tools给到MCP Client:

    Pasted image 20250529144705.png

    Pasted image 20250529145010.png 上述配置规则可参考MCP Server 插件配置

测试

我们依然可以使用cherry studio来测试是否成功生成MCP Server:

Pasted image 20250430151448.png

Pasted image 20250517211728.png

Pasted image 20250517211840.png

小结

至此,我们就实现了通过Higress让普通的restful服务无痛接入MCP Server协议的能力,通过统一的服务网关接入MCP Server协议,使得业务服务与MCP协议解耦,并轻松接入MCP Server,能够最大限度地降低项目复杂性和技术难度,极大地提高了开发效率,这种架构模式必然成为趋势。 在这小节中,我们主要做了以下几件事情:

1、部署Higress服务,使用redis作为session存储方案;

2、启动MCP Server配置,设置SSE匹配模式;

3、启动业务服务,开放业务接口(Hello服务);

4、配置Higress路由策略;

5、配置MCP Server Tools及服务接口;