Nacos官网:Nacos 融合 Spring Cloud,成为注册配置中心 | Nacos 官网 

一、结构说明:基于Spring Cloud Alibaba的微服务示例,包含两个主要模块

nacos-spring-cloud-consumer-example : 服务消费者

nacos-spring-cloud-provider-example :    服务提供者

二、技术栈:Spring Boot+Spring Cloud+Spring Cloud Alibaba Nacos + OpenFeign(用于服务调用)+ Spring Cloud LoadBalancer(负载均衡)

三、使用环境

安装nacos参考:Nacos 安装配置步骤详解_nacos:2.5.1 mysql-CSDN博客

  • 安装Nacos服务(nacos-server-2.5.1)
  • 确保JDK17环境(根据pom.xml中的配置)
  • Maven环境 3.6.3 +

四、项目结构示例:

五、代码说明:

(1):nacos-spring-cloud-example----父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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-spring-cloud-example</artifactId>
    <packaging>pom</packaging>
    <version>0.2.0-SNAPSHOT</version>


    <modules>
        <module>nacos-spring-cloud-provider-example</module>
        <module>nacos-spring-cloud-consumer-example</module>
    </modules>

    <properties>
        <spring-boot.version>3.0.2</spring-boot.version>
        <spring-cloud.version>2022.0.0</spring-cloud.version>
        <spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>

        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

(2):服务提供者 nacos-spring-cloud-provider-example 

   1、添加依赖:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>nacos-spring-cloud-example</artifactId>
        <groupId>com.alibaba.nacos</groupId>
        <version>0.2.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>nacos-spring-cloud-provider-example</artifactId>

    <dependencies>
         <!-- Spring Boot Web 启动器
             提供 Web 开发相关的依赖,包含:
             - 内嵌的 Tomcat 服务器
             - Spring MVC 框架
             - RESTful 支持
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Nacos 服务注册与发现依赖
             提供服务注册到 Nacos 的能力,包含:
             - 服务注册
             - 服务发现
             - 服务健康检查
        -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
         <!-- Nacos 客户端依赖
             提供与 Nacos 服务器通信的基础能力,包含:
             - 服务器通信
             - 配置管理
             - 服务管理
        -->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
2、配置服务提供者,从而服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上

在 application.properties 中配置 Nacos server 的地址:

server:
  port: 8070
spring:
  application:
    name: service-provider           #服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  # Nacos服务地址
        namespace: public            # 如果非默认命名空间,需明确指定
        group: DEFAULT_GROUP         # 如果使用自定义分组
3、启动类添加:@EnableDiscoveryClient注解 开启服务注册发现功能
package com.alibaba.nacos.example.spring.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
 * 将服务注册到 Nacos 注册中心
 * 允许服务被其他服务发现和调用
 * 自动配置服务注册相关的组件
 */
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}
4、 创建一个serviceController :服务者接口
package com.alibaba.nacos.example.spring.cloud;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/service")
public class serviceController {
    @GetMapping(value = "/echo/{str}")
    public String echo(@PathVariable String str) {
        return "Hello Nacos Discovery " + str;
    }
}

(3):服务消费者 nacos-spring-cloud-provider-example 

   1、添加依赖:
<?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">
    <parent>
        <artifactId>nacos-spring-cloud-example</artifactId>
        <groupId>com.alibaba.nacos</groupId>
        <version>0.2.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-spring-cloud-consumer-example</artifactId>

    <dependencies>
<!-- Spring Boot Web 启动器
         提供 Web 开发相关的依赖,与提供者相同
    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
  <!-- OpenFeign 依赖
         提供声明式的服务调用能力,包含:
         - 服务接口代理
         - HTTP 客户端封装
         - 服务调用
    -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  <!-- Spring Cloud LoadBalancer 依赖
         提供负载均衡能力,包含:
         - 客户端负载均衡
         - 服务实例选择策略
         - 替代了旧版本的 Ribbon
    -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>3.1.9</version>
        </dependency>
 <!-- Nacos 服务注册与发现依赖
         与提供者相同,用于:
         - 服务发现
         - 服务列表获取
         - 服务健康检查
    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
 <!-- Spring Boot Maven 插件
             用于构建可执行的 Spring Boot 应用,提供:
             - 打包成可执行 jar
             - 包含所有依赖
             - 提供运行时支持
        -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
 <!-- Maven 编译插件
             指定 Java 编译版本,设置:
             - 源代码兼容性级别
             - 目标字节码级别
             - 这里使用 Java 17
        -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
2、配置服务消费者,从而服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务

在 application.properties 中配置 Nacos server 的地址:

server:
  port: 8080
spring:
  application:
    name: service-consumer           #服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  # Nacos服务地址
        namespace: public            # 如果非默认命名空间,需明确指定
        group: DEFAULT_GROUP         # 如果使用自定义分组
    openfeign:  #超时控制
      client:
        config:
          default: # 全局配置
            connectTimeout: 3000  # 连接超时(毫秒)
            readTimeout: 5000    # 读取超时
          service-provider: # 针对特定服务
            readTimeout: 10000
3、启动类添加:@EnableFeignClients 注解------启用 Feign 客户端
package com.alibaba.nacos.example.spring.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @EnableFeignClients 在消费者中主要用于:
 * 发现其他服务
 * 获取服务列表
 * 实现负载均衡
 * OpenFeign 是 Spring Cloud 提供的 声明式 HTTP 客户端,通过接口和注解即可定义远程服务调用,底层自动集成负载均衡(如 Ribbon/Nacos)
 */
@SpringBootApplication
@EnableFeignClients(basePackages = "com.alibaba.nacos.example.spring.cloud")  // 启用 OpenFeign
public class NacosConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }
}
4、创建EchoService---定义 Feign 客户端接口
package com.alibaba.nacos.example.spring.cloud;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * OpenFeign 是 Spring Cloud 提供的 声明式 HTTP 客户端,用于简化微服务间的远程调用。开发者只需定义接口并添加注解,
 * OpenFeign 会自动生成实现类并处理 HTTP 请求,使远程调用像本地方法调用一样简单
 * 定义 Feign 客户端
 */
@FeignClient(name = "service-provider") // 指定服务名 :就是服务提供者spring:application:name: service-provider
public interface EchoService {
    @GetMapping(value = "/service/echo/{str}") // 与服务提供者的接口一致,包括接口名
    public String echo(@PathVariable("str") String str); //特别注意如果有参数,别忘了带参数注解
}
5、 创建一个consumerController :消费者者接口: 调用远程服务
package com.alibaba.nacos.example.spring.cloud;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 调用远程服务
 */
@RestController
@RequestMapping("/consumer")
public class consumerController {
    @Autowired
    private EchoService echoService;
    @GetMapping("/call/{msg}")
    public String call(@PathVariable String msg) {
        return echoService.echo(msg);  // 像调用本地方法一样
    }
}

(4):测试流程

1、启动Nacos服务:
2、启动服务提供者:启动成功:nacos服务中心---自动注册到服务列表

访问提供者服务的接口成功返回

3、启动服务消费者:启动成功:nacos服务中心---自动注册到服务列表

访问消费者接口,其实就是OpenFeign 远程服务调用消费者的接口,返回成功

执行消费者接口后:服务提供者被订阅,在订阅者列表中可查看,也就是说这个接口被订阅

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐