目录
一、Nacos概述
1. Nacos 简介
2. Nacos 特性
2.1 服务发现与健康监测
2.2 动态配置管理
2.3 动态DNS服务
2.4 其他关键特性
二、 服务注册和发现
2.1 核心概念
2.2 Nacos注册中心
2.3 Nacos单机模式
2.4 案例——服务注册与发现
2.4.1 父工程
2.4.2 order-provider服务提供者
2.4.3 order-consumer服务消费者
2.5.4 实例结果
三、RestTemplate 远程调用
1. RestTemplate 简介
2. 常用请求方法
3. 集成 Nacos 服务发现
四、配置管理
1. 配置共享
1.1.添加共享配置
1.2.拉取共享配置
2. 配置热更新
2.1 nacos配置热更新前提
3. 共享配置和配置热更新
实践nacos服务注册发现和配置管理https://download.csdn.net/download/m0_74808313/90587372
一、Nacos概述
1. Nacos 简介
Nacos 是一个易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring Cloud Alibaba 的组件,主要负责服务注册、发现和配置。
Nacos(Dynamic Naming and Configuration Service)是 Spring Cloud Alibaba 的核心组件,提供两大核心能力:
-
服务发现与健康管理:微服务的注册、发现和健康监测。
-
动态配置管理:集中化管理所有微服务的配置,支持动态刷新。
2. Nacos 特性
2.1 服务发现与健康监测
-
多协议支持
-
同时支持 DNS-Based 和 RPC-Based(如Dubbo、gRPC)服务发现。
-
提供 OpenAPI 和 SDK 两种接入方式,兼容多种技术栈。
-
-
健康检查机制
-
双模式检测:
-
Agent上报模式:服务实例主动上报心跳(适合云环境)。
-
服务端主动探测:Nacos Server 定期检查实例状态(如TCP端口探测)。
-
-
多层级监测:支持传输层(端口存活)和应用层(如HTTP接口健康)检查。
-
-
流量管控
-
自动屏蔽不健康实例,结合 权重配置 实现灰度发布。
-
2.2 动态配置管理
-
核心能力
-
集中化存储:所有微服务配置统一管理,支持 YAML/Properties/JSON 格式。
-
动态刷新:通过
@RefreshScope
实时生效,无需重启服务。 -
版本控制:保留配置历史版本,支持一键回滚。
-
-
高级功能
-
金丝雀发布:按比例分批推送配置变更。
-
监听查询:实时跟踪客户端配置更新状态。
-
敏感配置加密:支持密码等敏感信息的加密存储。
-
2.3 动态DNS服务
-
权重路由
-
为服务实例分配权重(如新版本10%,旧版本90%),实现平滑迁移。
-
-
灵活路由策略
-
支持基于元数据(如机房、版本)的路由,适配多活架构。
-
2.4 其他关键特性
-
多环境隔离
-
通过 Namespace(开发/测试/生产)和 Group(业务分组)实现配置和服务隔离。
-
-
高可用架构
-
集群部署 + MySQL持久化,避免单点故障。
-
-
易用性
-
提供可视化控制台,支持服务拓扑图、配置diff对比等运维功能。
-
二、 服务注册和发现
2.1 核心概念
-
服务注册:微服务启动时向 Nacos Server 注册自己的信息(IP、端口、服务名等)。
-
服务发现:消费者通过服务名从 Nacos Server 获取可用服务实例列表。
-
健康检查:Nacos 主动监测服务实例的健康状态,自动剔除故障节点。
2.2 Nacos注册中心
Nacos 作为注册中心的核心功能是管理微服务的服务注册、服务发现和健康监测,其架构如下图所示:
[服务提供者] → 注册 → [Nacos Server] ← 发现 ← [服务消费者]
心跳维护 健康检查
工作流程
-
服务注册
-
服务启动时,通过
spring-cloud-starter-alibaba-nacos-discovery
向 Nacos Server 注册实例信息(IP、端口、服务名等)。 -
示例注册数据:
{ "serviceName": "user-service", "ip": "192.168.1.100", "port": 8080, "metadata": {"version": "v1", "zone": "shanghai"} }
-
-
服务发现
-
消费者通过服务名查询可用实例列表,默认采用 轮询负载均衡 策略。
-
发现示例代码:
@Autowired private DiscoveryClient discoveryClient; List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
-
-
健康维护
-
客户端每 5 秒发送一次心跳(可配置),Nacos Server 15 秒未收到心跳则标记实例为不健康。
-
不健康实例不会被返回给消费者。
-
2.3 Nacos单机模式
在使用 Nacos 之前,需要先下载并安装 Nacos Server。Nacos Server 有两种运行模式:
standalone(单机)和 cluster(集群)。Nacos Server 单机模式运行步骤如下所示。
Nacos Server 下载 | Nacos 官网https://nacos.io/download/nacos-server/
1. 在 Nacos 官方网站根据不同的操作系统选择相应的安装包进行下载。
2. 将下载的文件解压后进入 nacos\bin 目录,打开命令提示符窗口,执行 shell 命令 "startup.cmd -m standalone",以单机模式启动 Nacos,如图所示。
3. 在浏览器输入地址:http://127.0.0.1:8848/nacos 即可访问,默认账号和密码都是 nacos
。
2.4 案例——服务注册与发现
案例说明:创建两个简单的微服务来模拟服务提供者和服务消费者,并将其整合到nacos,实现服务的注册与发现。
2.4.1 父工程
父工程统一管理Spring Boot、Spring Cloud和Spring Cloud Alibaba。
父工程选用的版本如下:
- Spring Boot 2.7.12
- Spring Cloud 2021.0.3
- Spring Cloud Alibaba 2021.0.4.0
父工程的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.hl</groupId>
<artifactId>shop</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>order-consumer</module>
<module>order-provider</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud.version>2021.0.3</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
<spring-boot-web.version>2.7.12</spring-boot-web.version>
</properties>
<dependencyManagement>
<dependencies>
<!--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>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>
2.4.2 order-provider服务提供者
在order-provider的pom.xml
中添加依赖:
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在order-provider的application.yml
中添加nacos地址配置:
server:
port: 8081
spring:
application:
name: order-provider
profiles:
active: dev
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
在启动类追加@EnableDiscoveryClient注解开启服务注册与发现功能:
package com.hl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
2.4.3 order-consumer服务消费者
在order-consumer的pom.xml
中添加依赖:
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
在order-provider的application.yml
中添加nacos地址配置:
server:
port: 8082
spring:
application:
name: order-consumer
profiles:
active: dev
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
在启动类追加@EnableDiscoveryClient注解开启服务注册与发现功能:
package com.hl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
2.5.4 实例结果
单机模式启动nacos,在服务列表中可看到两个实例服务:
三、RestTemplate 远程调用
1. RestTemplate 简介
RestTemplate
是 Spring 提供的用于同步 HTTP 请求的客户端工具,支持 RESTful 风格的远程服务调用。在微服务架构中,通常配合 服务发现(如Nacos) 和 负载均衡 使用。
2. 常用请求方法
方法 | 说明 | 示例 |
---|---|---|
getForObject() | GET请求,返回响应体 | restTemplate.getForObject(url, String.class) |
getForEntity() | GET请求,返回完整响应(含状态码等) | restTemplate.getForEntity(url, User.class) |
postForObject() | POST请求,返回响应体 | restTemplate.postForObject(url, requestObj, String.class) |
exchange() | 通用请求(可指定HTTP方法) | restTemplate.exchange(url, HttpMethod.PUT, entity, String.class) |
delete() | DELETE请求 | restTemplate.delete(url) |
常见的Get、Post、Put、Delete请求都支持,如果请求参数比较复杂,还可以使用exchange方法来构造请求。
Map map = restTemplate.exchange("http://localhost:8082/order",
HttpMethod.GET,
null,
Map.class).getBody();
3. 集成 Nacos 服务发现
将RestTemplate注册为一个Bean:
@Bean
@LoadBalanced // 关键注解:启用服务名解析和负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
发起 HTTP 请求:
@Autowired
private RestTemplate restTemplate;
// 直接使用服务名(user-service)代替具体IP和端口
String url = "http://user-service/users/1";
String response = restTemplate.getForObject(url, String.class);
四、配置管理
Nacos 配置管理提供集中式、动态化的配置管理能力,解决微服务架构中配置分散、多环境管理等问题。
1. 配置共享
我们可以把微服务共享的配置抽取到Nacos中统一管理,这样就不需要每个微服务都重复配置了。分为两步:
-
在Nacos中添加共享配置
-
微服务拉取配置
1.1.添加共享配置
在配置管理
->配置列表
中新建一个配置:shared-jdbc.yaml
1.2.拉取共享配置
接下来,我们要在微服务拉取共享配置。将拉取到的共享配置与本地的application.yaml
配置合并,完成项目上下文的初始化。
读取Nacos配置是SpringCloud上下文(ApplicationContext
)初始化时处理的,发生在项目的引导阶段。然后才会初始化SpringBoot上下文,去读取application.yaml
。
SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml
(或者bootstrap.properties
)的文件,如果我们将nacos地址配置到bootstrap.yaml
中,那么在项目引导阶段就可以读取nacos中的配置了。
引入依赖:
<!--nacos配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--读取bootstrap文件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
在resource目录下新建bootstrap.yaml:
spring:
profiles:
active: dev
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
shared-configs: # 共享配置
- dataId: shared-jdbc.yaml
重启服务,项目正常运行则说明共享的配置拉取成功。
2. 配置热更新
配置热更新(Dynamic Configuration Update)指在应用程序不重启的情况下,实时修改并生效配置参数的能力。在微服务架构中,这是通过配置中心(如Nacos、Apollo)实现的。
2.1 nacos配置热更新前提
①文件的dataId格式:
[服务名]-[spring.active.profile].[后缀名]
文件名称由三部分组成:
-
服务名
:该微服务的名称 -
spring.active.profile
:就是spring boot中的spring.active.profile
,可以省略,则所有profile共享该配置 -
后缀名
:例如yaml
②微服务中要以特定方式读取要配置热更新的属性(两种)
方式1:
@Component
@ConfigurationProperties("order")
@Data
public class OrderProperties {
private String name;
private String address;
}
方式2:
@RestController
@RefreshScope // 关键注解:允许动态刷新
public class UserController {
@Value("${user.max-active}")
private Integer maxActive;
@GetMapping("/config")
public String getConfig() {
return "MaxActive: " + maxActive;
}
}
3. 共享配置和配置热更新
对于共享配置,默认不自动更新,可以在dataId后加refresh:true设置为自动更新;
对于热更新,微服务会自动拉取这类配置,因此无需在bootstrap中配置
spring:
cloud:
nacos:
config:
shared-configs:
- data-id: common.yaml
group: DEFAULT_GROUP
refresh: true