Nacos服务发现和配置管理

目录

一、Nacos概述

[1. Nacos 简介](#1. Nacos 简介)

[2. Nacos 特性](#2. Nacos 特性)

[2.1 服务发现与健康监测](#2.1 服务发现与健康监测)

[2.2 动态配置管理](#2.2 动态配置管理)

[2.3 动态DNS服务](#2.3 动态DNS服务)

[2.4 其他关键特性](#2.4 其他关键特性)

[二、 服务注册和发现](#二、 服务注册和发现)

[2.1 核心概念](#2.1 核心概念)

[2.2 Nacos注册中心](#2.2 Nacos注册中心)

[2.3 Nacos单机模式](#2.3 Nacos单机模式)

[2.4 案例------服务注册与发现](#2.4 案例——服务注册与发现)

[2.4.1 父工程](#2.4.1 父工程)

[2.4.2 order-provider服务提供者](#2.4.2 order-provider服务提供者)

[2.4.3 order-consumer服务消费者](#2.4.3 order-consumer服务消费者)

[2.5.4 实例结果](#2.5.4 实例结果)

[三、RestTemplate 远程调用](#三、RestTemplate 远程调用)

[1. RestTemplate 简介](#1. RestTemplate 简介)

[2. 常用请求方法](#2. 常用请求方法)

[3. 集成 Nacos 服务发现](#3. 集成 Nacos 服务发现)

四、配置管理

[1. 配置共享](#1. 配置共享)

1.1.添加共享配置

1.2.拉取共享配置

[2. 配置热更新](#2. 配置热更新)

[2.1 nacos配置热更新前提](#2.1 nacos配置热更新前提)

[3. 共享配置和配置热更新](#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] ← 发现 ← [服务消费者]
             心跳维护             健康检查

工作流程

  1. 服务注册

    • 服务启动时,通过 spring-cloud-starter-alibaba-nacos-discovery 向 Nacos Server 注册实例信息(IP、端口、服务名等)。

    • 示例注册数据:

      复制代码
      {
        "serviceName": "user-service",
        "ip": "192.168.1.100",
        "port": 8080,
        "metadata": {"version": "v1", "zone": "shanghai"}
      }
  2. 服务发现

    • 消费者通过服务名查询可用实例列表,默认采用 轮询负载均衡 策略。

    • 发现示例代码:

      java 复制代码
      @Autowired
      private DiscoveryClient discoveryClient;
      
      List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
  3. 健康维护

    • 客户端每 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 官方网站根据不同的操作系统选择相应的安装包进行下载。
  1. 将下载的文件解压后进入 nacos\bin 目录,打开命令提示符窗口,执行 shell 命令 "startup.cmd -m standalone",以单机模式启动 Nacos,如图所示。
  1. 在浏览器输入地址: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 复制代码
<?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中添加依赖:

XML 复制代码
<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在order-provider的application.yml中添加nacos地址配置:

XML 复制代码
server:
  port: 8081
spring:
  application:
    name: order-provider
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址

在启动类追加@EnableDiscoveryClient注解开启服务注册与发现功能:

java 复制代码
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中添加依赖:

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地址配置:

XML 复制代码
server:
  port: 8082
spring:
  application:
    name: order-consumer
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址

在启动类追加@EnableDiscoveryClient注解开启服务注册与发现功能:

java 复制代码
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方法来构造请求。

java 复制代码
Map map = restTemplate.exchange("http://localhost:8082/order",
                HttpMethod.GET,
                null,
                Map.class).getBody();

3. 集成 Nacos 服务发现

将RestTemplate注册为一个Bean:

java 复制代码
@Bean
@LoadBalanced  // 关键注解:启用服务名解析和负载均衡
public RestTemplate restTemplate() {
    return new RestTemplate();
}

发起 HTTP 请求:

java 复制代码
@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中的配置了。

引入依赖:

XML 复制代码
  <!--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:

XML 复制代码
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:

java 复制代码
@Component
@ConfigurationProperties("order")
@Data
public class OrderProperties {
    private String name;
    private String address;
}

方式2:

java 复制代码
@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中配置

java 复制代码
spring:
  cloud:
    nacos:
      config:
        shared-configs:
          - data-id: common.yaml
            group: DEFAULT_GROUP
            refresh: true
相关推荐
考虑考虑1 小时前
JDK26中的List.ofLazy()
java·后端·java ee
小蒜学长1 小时前
基于SpringBoot的公寓报修管理系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·公寓报修管理系统·多角色协同
for_ever_love__1 小时前
MySQL 主从复制讲透:binlog 原理、搭建步骤与读写分离
java·数据库·mysql·binlog·读写分离·原理·主从复制
小π军4 小时前
操作系统面试题
java·linux·服务器
倔强的石头1064 小时前
应用账号最小权限实践:读写账号、报表账号、运维账号分层
java·运维·开发语言
Shaoshing4 小时前
ThreadLocal
java·jvm·threadlocal
写后端的胖头鱼5 小时前
一文详解CAS
java·jvm·spring·cas·乐观锁·自旋
鱼宵5 小时前
Spring AI 提示词模板:{变量} 参数化 + few-shot,一条提示词反复用
java·人工智能·spring·few-shot·提示词工程·springai
蜗牛互联网5 小时前
Python消费Responses SSE事件:增量文本、超时与取消
java·开发语言·人工智能·后端·python