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 {@Autowiredprivate EchoService echoService;@GetMapping("/call/{msg}")public String call(@PathVariable String msg) {return echoService.echo(msg); // 像调用本地方法一样}
}
(4):测试流程
1、启动Nacos服务:
2、启动服务提供者:启动成功:nacos服务中心---自动注册到服务列表
访问提供者服务的接口成功返回
3、启动服务消费者:启动成功:nacos服务中心---自动注册到服务列表
访问消费者接口,其实就是OpenFeign 远程服务调用消费者的接口,返回成功