基于nacos2.5.1的MCP客户端微服务项目开发环境配置简介

MCP客户端常用的有两个:
spring-ai-starter-mcp-client:核心组件提供STDIO和基于HTTP的SSE支持
spring-ai-starter-mcp-client-webflux:基于SSE的WebFlux传输
这里我们选择基于基础的HTTP的SSE支持的依赖。

org.springframework.ai spring-ai-bom 1.0.0-M7 pom import org.springframework.ai spring-ai-starter-mcp-client org.springframework.ai spring-ai-starter-model-ollama org.springframework.ai spring-ai-starter-model-openai 1.0.0-M7

引用组件包版本关系
JDK 17
spring-boot: 3.3.4
spring-cloud: 2023.0.3
spring-cloud-alibaba:2023.0.3.2
spring-ai.version:1.0.0-M7
spring-ai-alibaba:1.0.0-M7.1
dashscope-sdk-java:2.20.1

工程启动运行图:
在这里插入图片描述

一、创建java工程
maven/quickstart工程模板
org.apache.maven.archetypes:maven-archetype-quickstart

Project SDK ms-17 version 17.0.14

pom.xml引用组件配置情况:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/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.3.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cwgis</groupId>
    <artifactId>galaxy-mcp-client</artifactId>
    <version>1.0.0</version>
    <name>galaxy-mcp-client</name>
    <description>galaxy-mcp-client</description>

    <properties>
        <java.version>17</java.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>

        <spring-boot.version>3.3.4</spring-boot.version>

        <!-- Spring AI -->
        <spring-ai.version>1.0.0-M7</spring-ai.version>
        <spring-ai-alibaba.version>1.0.0-M7.1</spring-ai-alibaba.version>
        <dashscope-sdk-java.version>2.20.1</dashscope-sdk-java.version>

        <spring-cloud.version>2023.0.3</spring-cloud.version>
        <spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- Nacos Discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>



        <!--big model openai jar -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-openai</artifactId>
            <version>${spring-ai.version}</version>
        </dependency>

        <!--big model ollama jar -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-ollama</artifactId>
            <version>${spring-ai.version}</version>
        </dependency>

        <!-- mcp实际要用到的依赖 -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-mcp-client</artifactId>
            <version>${spring-ai.version}</version>
        </dependency>

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


    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- open ai jar -->
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-openai</artifactId>
                <version>${spring-ai.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud.ai</groupId>
                <artifactId>spring-ai-alibaba-starter</artifactId>
                <version>${spring-ai-alibaba.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
            </dependency>

            <!-- SpringCloud 微服务 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- SpringCloud 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>

            <!-- SpringBoot 依赖配置 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--add alibaba java lib -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dashscope-sdk-java</artifactId>
                <version>${dashscope-sdk-java.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-api</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-simple</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

        </dependencies>
    </dependencyManagement>

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

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

        <repository>
            <id>sonatype-nexus-staging</id>
            <name>Nexus Release Repository</name>
            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
        </repository>
        <repository>
            <id>aliyun-central</id>
            <name>aliyun-central</name>
            <url>https://maven.aliyun.com/repository/central</url>
        </repository>
        <repository>
            <id>aliyun-public</id>
            <name>aliyun-public</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </repository>
        <repository>
            <id>aliyun-snapshots</id>
            <name>aliyun-snapshots</name>
            <url>https://maven.aliyun.com/repository/apache-snapshots</url>
        </repository>
        <repository>
            <id>aliyun-plugin</id>
            <name>aliyun-plugin</name>
            <url>https://maven.aliyun.com/repository/gradle-plugin</url>
        </repository>
        <repository>
            <id>osgeo</id>
            <name>OSGeo Release Repository</name>
            <url>https://repo.osgeo.org/repository/release/</url>
        </repository>
    </repositories>

</project>

src/main/resources/application.yml配置情况:

server.port: 9010
server.tomcat.max-http-form-post-size: 5120MB
#
spring:
  application:
    name: galaxy-mcp-client
  config:
    import: nacos:192.168.30.33:8848
  ai:
    dashscope:
      api-key: sk-1
      chat:
        options:
          model: deepseek-r1
    openai:
      api-key: None
      base-url: http://192.168.3.88:8000/
      chat:
        #model: qwq32b-q8
        options:
          model: qwq32b-q8
          temperature: 0.7
    ollama:
      base-url: http://192.168.1.82:11434/
      chat:
        #model: qwen2.5-coder:7b       #deepseek-r1:7b这个不支持mcp@tool
        options:
          temperature: 0.7
          model: qwen2.5-coder:7b

    # MCP
    mcp:
      client:
        name: galaxy-mcp-client
        toolcallback:
          enabled: true
        sse:
          connections:
            server1:
              url: http://192.168.30.33:9001  #http://192.168.1.82:9001     #http://192.168.30.33:9001
  cloud:
    nacos:
      config:
        server-addr: 192.168.30.33:8848
        #namespace: 'cwgis'
        group: 'mcp'
        username: 'nacos'
        password: 'nacos'
        file-extension: yaml
        enable: true
        refresh-enabled: true
      discovery:
        # Nacos
        server-addr: 192.168.30.33:8848
        #namespace: 'cwgis'
        group: 'mcp'
  management:
    endpoint:
      health:
        show-details: always
    endpoints:
      web:
        exposure:
          include: '*'
  logging:
    level:
      com.alibaba.cloud.nacos.configdata: debug

open ai 定义的Controller.java

package com.cwgis.galaxymcpclient.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FooController {

    @Autowired
    private ToolCallbackProvider toolCallbackProvider;

    @Autowired
    private OpenAiChatModel openAiChatModel;


    @GetMapping("/ai/generate")
    public String generate(@RequestParam(value = "message", defaultValue = "推荐一个公众号") String message) {
        //defaultTools 注入mcp的tool功能
        System.out.println(message);
        //
        ChatClient chatClient = ChatClient.builder(openAiChatModel)
                .defaultTools(toolCallbackProvider.getToolCallbacks())
                .build();
        ChatClient.CallResponseSpec call = chatClient.prompt(message).call();
        String content = call.content();
        System.out.println(content);
        return content;
    }
}


ollama ai定义的controller.java

package com.cwgis.galaxymcpclient.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OllamaController {

    @Autowired
    private OllamaChatModel ollamaChatModel;

    @Autowired
    private ToolCallbackProvider toolCallbackProvider;


    @GetMapping("/ai/generateOllama")
    public String generate(@RequestParam(value = "message", defaultValue = "推荐一个公众号") String message) {
        //defaultTools 注入mcp的tool功能
        System.out.println(message);
        //
        String content="";
        try {
            ChatClient chatClient = ChatClient.builder(ollamaChatModel)
                    .defaultTools(toolCallbackProvider.getToolCallbacks())
                    .build();
            ChatClient.CallResponseSpec call = chatClient.prompt(message).call();
            content = call.content();
        }
        catch (Exception ex)
        {
            content=ex.getMessage();
            ex.printStackTrace();
        }
        if(content.length()<=0)
        {
            content="现无返回内容";
        }
        System.out.println(content);
        return content;
    }
}

NacosConfigManager定义类

package com.cwgis.galaxymcpclient.config;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;
import java.util.concurrent.Executor;

public class NacosConfigManager {
    private static final String SERVER_ADDR = "192.168.30.33:8848"; // Nacos服务器地址
    private static final String DATA_ID = "cwgis"; // 配置ID   your-data-id
    private static final String GROUP = "mcp"; // 配置分组
    private static final Integer CONNECTION_POOL_SIZE=50;

    private ConfigService configService;

    public NacosConfigManager() {
        try {
            Properties properties = new Properties();
            properties.put("serverAddr", SERVER_ADDR);
            //properties.put("namespace", DATA_ID);
            //properties.put("group", GROUP);
            //添加附加配置参数
            //properties.put("encode", "UTF-8");
            //properties.put("DASHSCOPE_CONNECTION_POOL_SIZE", CONNECTION_POOL_SIZE);
            //properties.put("DASHSCOPE_CONNECTION_TIMEOUT",5000);
            //properties.put("DASHSCOPE_MAXIMUM_ASYNC_REQUESTS",100);
            //properties.put("DASHSCOPE_MAXIMUM_ASYNC_REQUESTS_PER_HOST",100);
            //properties.put("DASHSCOPE_READ_TIMEOUT",30000);
            //properties.put("DASHSCOPE_WRITE_TIMEOUT",30000);
            //properties.put("DASHSCOPE_CONNECTION_IDLE_TIME",500000);
            //
            configService = NacosFactory.createConfigService(properties);
        } catch (NacosException e) {
            e.printStackTrace();
        }
    }

    // 获取配置
    public String getConfig() {
        try {
            return configService.getConfig(DATA_ID, GROUP, 5000);    //5000 是超时ms
        } catch (NacosException e) {
            e.printStackTrace();
            return null;
        }
    }

    // 添加配置监听器
    public void addListener() {
        try {
            configService.addListener(DATA_ID, GROUP, new Listener() {
                @Override
                public Executor getExecutor() {
                    return null;
                }

                @Override
                public void receiveConfigInfo(String configInfo) {
                    System.out.println("配置更新: " + configInfo);
                    // 处理配置更新事件
                }
            });
        } catch (NacosException e) {
            e.printStackTrace();
        }
    }

    // 发布配置
    public boolean publishConfig(String content) {
        try {
            return configService.publishConfig(DATA_ID, GROUP, content);
        } catch (NacosException e) {
            e.printStackTrace();
            return false;
        }
    }
}

main入口类

package com.cwgis.galaxymcpclient;

import com.cwgis.galaxymcpclient.config.NacosConfigManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GalaxyMcpClientApplication {

    public static void main(String[] args) {
        // 初始化Nacos配置管理器
        NacosConfigManager configManager = new NacosConfigManager();
        // 获取初始配置
        String config = configManager.getConfig();
        System.out.println("初始配置: " + config);
        // 添加配置监听器
        configManager.addListener();

        SpringApplication.run(GalaxyMcpClientApplication.class, args);
    }

}

19:33:23.864 [main] INFO com.alibaba.nacos.plugin.auth.spi.client.ClientAuthPluginManager -- [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.impl.NacosClientAuthServiceImpl success.
19:33:23.864 [main] INFO com.alibaba.nacos.plugin.auth.spi.client.ClientAuthPluginManager -- [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.ram.RamClientAuthServiceImpl success.

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.3.4)

2025-06-06T19:33:24.107+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] c.c.g.GalaxyMcpClientApplication         : Starting GalaxyMcpClientApplication using Java 17.0.14 with PID 28268 (D:\cwgis_nacos\galaxy-mcp-client\target\classes started by Administrator in D:\cwgis_nacos\galaxy-mcp-client)
2025-06-06T19:33:24.108+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] c.c.g.GalaxyMcpClientApplication         : No active profile set, falling back to 1 default profile: "default"
2025-06-06T19:33:24.276+08:00  WARN 28268 --- [galaxy-mcp-client] [           main] c.a.c.n.c.NacosConfigDataLoader          : [Nacos Config] config[dataId=192.168.30.33:8848, group=mcp] is empty
2025-06-06T19:33:25.104+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=47075fb5-4ac6-3d7d-8060-ec17910bdd85
2025-06-06T19:33:25.125+08:00  WARN 28268 --- [galaxy-mcp-client] [           main] trationDelegate$BeanPostProcessorChecker : Bean 'com.alibaba.cloud.nacos.NacosConfigAutoConfiguration' of type [com.alibaba.cloud.nacos.NacosConfigAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). The currently created BeanPostProcessor [nacosAnnotationProcessor] is declared through a non-static factory method on that class; consider declaring it as static instead.
2025-06-06T19:33:25.333+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 9010 (http)
2025-06-06T19:33:25.346+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-06-06T19:33:25.346+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.30]
2025-06-06T19:33:25.409+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2025-06-06T19:33:25.409+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1130 ms
2025-06-06T19:33:25.989+08:00  INFO 28268 --- [galaxy-mcp-client] [ient-1-Worker-0] i.m.client.McpAsyncClient                : Server response with Protocol: 2024-11-05, Capabilities: ServerCapabilities[experimental=null, logging=LoggingCapabilities[], prompts=null, resources=null, tools=ToolCapabilities[listChanged=true]], Info: Implementation[name=galaxy-mcp-server, version=1.0.0] and Instructions null
2025-06-06T19:33:26.833+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 9010 (http) with context path '/'
2025-06-06T19:33:26.896+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] c.a.n.p.a.s.c.ClientAuthPluginManager    : [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.impl.NacosClientAuthServiceImpl success.
2025-06-06T19:33:26.896+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] c.a.n.p.a.s.c.ClientAuthPluginManager    : [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.ram.RamClientAuthServiceImpl success.
2025-06-06T19:33:26.929+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, mcp galaxy-mcp-client 192.168.1.82:9010 register finished
2025-06-06T19:33:26.989+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] c.c.g.GalaxyMcpClientApplication         : Started GalaxyMcpClientApplication in 3.462 seconds (process running for 5.165)
2025-06-06T19:33:26.995+08:00  INFO 28268 --- [galaxy-mcp-client] [           main] c.a.c.n.refresh.NacosContextRefresher    : [Nacos Config] Listening config: dataId=192.168.30.33:8848, group=mcp
2025-06-06T19:33:34.007+08:00  INFO 28268 --- [galaxy-mcp-client] [nio-9010-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-06-06T19:33:34.008+08:00  INFO 28268 --- [galaxy-mcp-client] [nio-9010-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2025-06-06T19:33:34.009+08:00  INFO 28268 --- [galaxy-mcp-client] [nio-9010-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
列出公众号中最好的文章名称列表
公众号【编程朝花夕拾】的文章内容偏向技术干货,对于技术爱好者来说都是很好的内容。不过,具体的最佳文章名称列表并未提供。如果您需要更详细的信息,可以访问该公众号查看其文章列表。
推荐一个电影
推荐一个电影
现无返回内容
现无返回内容
推荐一个技术公众号
推荐【编程朝花夕拾】公众号,该公众号精选编程干货,回顾技术经典,分享实战经验,可以助你温故知新、在代码世界不断精进。
推荐一个电影
我无法直接推荐电影,但你可以告诉我你喜欢的电影类型,我可以给你一些建议或者引导你到合适的平台去寻找。比如,如果你喜欢动作片,我可以推荐一些经典的动作电影;如果喜欢喜剧,也可以给你一些有趣的喜剧片。你有什么偏好吗?
推荐一个电影
我无法直接推荐电影,但你可以告诉我你喜欢的电影类型,我可以给你一些建议或者指导你如何找到适合你的电影。
推荐一个科幻电影
我不能直接推荐电影,但你可以尝试观看《盗梦空间》(Inception),这是一部由克里斯托弗·诺兰执导的科幻电影,讲述了一群盗梦者通过潜入他人梦境来窃取秘密的故事。这部电影在科幻元素和剧情设计上都有很高的评价。

显示下面一行字符串表示启动运行成功
Info: Implementation[name=galaxy-mcp-server, version=1.0.0] and Instructions null
2025-06-06T19:33:26.833+08:00 INFO 28268 —

[galaxy-mcp-client] [ient-1-Worker-0] 
i.m.client.McpAsyncClient : Server response with Protocol: 2024-11-05, 
Capabilities: ServerCapabilities[experimental=null,
 logging=LoggingCapabilities[], 
 prompts=null, 
 resources=null, 
 tools=ToolCapabilities[listChanged=true]], 
 Info: Implementation[name=galaxy-mcp-server, 
 version=1.0.0] and Instructions null
2025-06-06T19:33:26.833+08:00  INFO 28268 --- 

访问rest api地址:
测试访问地址

open ai connect local model
http://192.168.1.82:9010/ai/generate?message=推荐一个公众号
http://192.168.1.82:9010/ai/generate?message=推荐一个电影
http://192.168.1.82:9010/ai/generate?message=公众号中最好的文章

ollama model local model
http://192.168.1.82:9010/ai/generateOllama?message=推荐一个公众号
http://192.168.1.82:9010/ai/generateOllama?message=推荐一个电影

本blog地址:https://blog.csdn.net/hsg77

更多推荐