Nacos 服务注册发现案例:nacos-spring-cloud-example 详解
·

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 远程服务调用消费者的接口,返回成功

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

更多推荐
所有评论(0)