SpringCloud-Nacos

Nacos介绍

nacos是一个构建云原生应、开源的动态服务发现、配置管理和服务管理平台。

nacos支持多种注册中心和配置管理器,包括SpringCloud Discovery、Dubbo、Kubernetes和Apache ServiceComb等。

nacos提供了REST、gPRC 和 Java SDK 等多种API,使得开发人员可以轻松地与Nacos进行交互。

Nacos提供的主要功能

服务发现与服务健康检查:使服务更容易注册,并通过DNS或HTTP接口发现其他服务,提供实时健康检查,防止向不健康的主机或服务实例发送请求。

**动态配置管理:**允许在所有环境中以集中和动态的方式管理所有服务的配置,消除在更新配置时重新部署应用程序的需求,使配置更改更加高效和灵活。

**动态DNS服务:**提供基于DNS协议的服务发现能力,支持异构语言的服务发现,方便三方应用查阅和发现。

服务和元数据管理:从微服务平台建设的视角管理数据中心的所有服务以及元数据,包括服务描述、生命周期、静态依赖分析、健康状态、流量管理、路由和安全策略。

Nacos两大组件

|--------------|-------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 组件 | 描述 | 功能 |
| Nacos Server | Nacos 服务端,与 Eureka Server 不同,Nacos Server 由阿里巴巴团队使用 Java 语言编写并将 Nacos Server 的下载地址给用户,用户只需要直接下载并运行即可。 | 1. Nacos Server 可以作为服务注册中心,帮助 Nacos Client 实现服务的注册与发现。 2. Nacos Server 可以作为配置中心,帮助 Nacos Client 在不重启的情况下,实现配置的动态刷新。 |
| Nacos Client | Nacos 客户端,通常指的是微服务架构中的各个服务,由用户自己搭建,可以使用多种语言编写。 | 1. Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-discovery,在服务注册中心(Nacos Server)中实现服务的注册与发现。 2. Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-config,在配置中心(Nacos Server)中实现配置的动态刷新。 |

数据模型(配置和服务的组织形式)

Nacos 数据模型 key 由三元组唯一确认。NameSpace默认是空串,公共命名空间(public)。分组默认是DEFAULT_GROUP。

命名空间(Namespace)

Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境(dev)和生产环境(pro)的资源(如配置、服务)隔离等。

可以隔离开发环境------测试环境和生产环境,因为它们的配置可能各不相同;

可以隔离不同的用户------不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或配置集。

配置分组(group)

Nacos 中的一组配置集,一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集,默认采用 DEFAULT_GROUP 。

配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。

配置集/配置集ID(Service/DataId)

配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。每个配置集都可以被一个有意义的名称标识------配置集 ID (Data ID)。

Nacos 实现原理

注册中心的原理

服务注册方法:

以Java nacos client v1.0.1 为例子,服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。涉及到了心跳机制。

配置中心管理

Nacos服务注册和订阅的完整流程

Nacos 客户端进行服务注册有两个部分组成,一个是将服务信息注册到服务端,另一个是像服务端发送心跳包,这两个操作都是通过 NamingProxy 和服务端进行数据交互的。

SpringCloud集成nacos

Nacos 融合 Spring Cloud,成为注册配置中心

Nacos动态DNS服务

Nacos支持基于DNS的服务发现模式。传统的DNS服务可以解析服务名到服务实例的IP地址,Nacos提供了类似的功能,允许服务通过DNS方式动态解析服务的地址。相比于传统的DNS服务,Nacos的DNS支持动态更新,能够反映服务实例的变动(新增、删除、健康检查等)

Nacos 心跳检测

为了保证服务状态是否可用,鼓舞提供者需要定期向Nacos发送心跳包。如果Nacos在一定时间内没有收到某个服务者的心跳,则会认为这个服务不可用,并将其从服务列表中进行删除。在Nacos中,默认情况下,服务提供者每5秒发送一次心跳包。如果超过15秒没有收到心跳指令,nacos会将还服务实例的健康状态标记为不健康;如果超过30秒没有收到心跳,Nacos会直接将服务实例从服务列表中剔除。当服务实例恢复正常并重新发送心跳时,Nacos会重新将其进行上线到服务列表中。

@RefreshScope 用于实现热插拔和动态刷新配置

@RefreshScope 注解修饰的类,可以保证修改完nacos之后,可以不用重启,获取的配置是修改之后的内容。

java 复制代码
package com.hb.config.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/config")
@RefreshScope // 用于实现热插拔和动态刷新配置
public class ConfigController {
    @Value("${city.address}") // 获取的事 appliaction.yml 中 的配置
    public String address;

    @Value("${user.name}")  // 获取的是  nacos中的配置
    public String username;

    @RequestMapping("/show")
    public String show(){
        System.out.println("address = " + address);
        System.out.println("username = " + username);
        return username;
    }
}

Nacos面试

1.Nacos是什么?有哪些核心功能?

Nacos是一个由阿里巴巴开源的、面向云原生应用的、高度可扩展的服务发现、配置管理和动态DNS服务平台、Nacos的核心功能包括:

服务发现:Nacos支持多种服务发现方式,如DNS方式、Http和RPC方式,帮助应用快速发现并连接到其他服务。

配置管理:Nacos提供了一个集中式的配置管理平台,使得应用可以通过配置文件的方式获取动态配置,无需重启应用即可生效。

动态DNS服务:Nacos提供了一个类似DNS的服务,用于解决服务之间的命名和寻址问题

2.Nacos的服务发现原理是什么?

Nacos的服务发现主要基于DNS方式。当一个应用需要发现其他服务时,它会向Nacos的DNS服务器发起请求。Nacos的DNS服务器会根据服务名称解析出对应的服务IP地址,并将结果返回给应用。

3.Nacos的配置管理原理是什么?

Nacos的配置管理分为两种模式:文件模式和控制台模式。文件模式下,应用通过读取Nacos提供的配置文件来获取动态配置;控制台模式下,应用可以通过控制台直接修改配置,Nacos会实时推送配置变更到应用。无论哪种模式,应用都不需要重启即可生效。

4.Nacos的动态DNS服务原理是什么?

Nacos 的动态 DNS 服务原理类似于传统 DNS 服务。当一个应用需要注册到 Nacos 时,它会向 Nacos 的 DNS 服务器发起请求。Nacos 的 DNS 服务器会根据应用提供的服务名称创建一个相应的 DNS 记录,并将该记录存储在 Nacos 的 DNS 解析中。当其他应用需要查询该服务的 IP 地址时,它可以通过 Nacos 的 DNS 服务器来获取结果。

5.Nacos 如何实现负载均衡?

Nacos 的负载均衡主要依赖于其服务发现功能。当一个应用需要负载均衡时,它可以通过 Nacos 的服务发现功能获取到所有可用的服务实例。然后,应用可以根据一定的策略(如轮询、最少连接数等)选择一个可用的服务实例进行请求。

6.Nacos 如何保证数据的一致性?

Nacos 提供了强一致性和最终一致性两种数据一致性保障策略。强一致性要求 Nacos 的所有节点必须保证数据的实时同步,适用于对数据一致性要求较高的场景;最终一致性则允许 Nacos 的节点在一段时间内数据不一致,但最终会达到一致状态,适用于对数据一致性要求不高的场景。

7.Nacos 如何实现高可用?

Nacos 提供了多种高可用策略,如主从复制、数据分片、多活等。主从复制策略下,Nacos 的所有数据都会在主节点和从节点之间实时同步,从而保证主节点故障时,从节点可以接管服务;数据分片策略下,Nacos 的数据会被切分成多个片段,存储在不同的节点上,从而提高数据的可用性;多活策略下,Nacos 支持多个节点同时对外提供服务,进一步提高服务的可用性。

8.Nacos服务是如何判定服务实例的状态?

通过发送心跳包,5秒发送一次,如果15秒没有回应,则说明服务出现了问题,

如果30秒后没有回应,则说明服务已经停止。

9.服务消费方是如何调用服务提供方的服务的?

通过创建RestTemplate对象来实现。

10.@LoadBalanced的作用是什么?

描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。

底层实现:

  • 拦截 RestTemplate 的请求
  • 去 Nacos 拉取这个服务名对应的所有可用实例 IP 列表
  • 用内置 LoadBalancer 负载均衡规则(轮询 / 随机等)挑一个实例
  • 把服务名自动替换成真实 IP + 端口,发起调用
相关推荐
却话巴山夜雨时i3 小时前
Java面试实录:从Spring Boot到Kafka的技术探讨
spring boot·微服务·kafka·grafana·prometheus·java面试
杰克尼4 小时前
springCloud_day06
后端·spring·spring cloud
Devin~Y5 小时前
高并发内容社区实战面试:从 Java 基础到 Spring Cloud、Kafka、Redis、RAG 搜索全解析
java·spring boot·redis·spring cloud·kafka·向量数据库·rag
小江的记录本5 小时前
【JEECG Boot】JEECG Boot 系统性知识体系全方位结构化总结
java·前端·spring boot·后端·python·spring·spring cloud
鬼先生_sir21 小时前
SpringBoot-基础面试篇
java·springboot·java面试
却话巴山夜雨时i1 天前
Java大厂面试:从Spring Boot到微服务的深度剖析
java·spring boot·spring cloud·微服务·分布式事务·大厂面试
nFBD29OFC1 天前
Spring Cloud生态地图——注册、配置、网关、负载均衡与可观测的组合拳
spring·spring cloud·负载均衡
總鑽風2 天前
单点登录springcloud+mysql
后端·spring·spring cloud
cheoyeon2 天前
ruoyi-cloud项目开发
spring·spring cloud·maven