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 + 端口,发起调用
相关推荐
苏渡苇3 小时前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
叶总没有会3 小时前
Nacos—注册中心
spring cloud·微服务
cnkeysky9 小时前
SpringBoot 整合 nacos 配置中心
nacos·springboot
cnkeysky1 天前
docker 运行 nacos
docker·nacos
苏渡苇1 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
叶总没有会1 天前
微服务--分布式基础
java·spring·spring cloud·微服务
孙启超2 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
行百里er3 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
砍材农夫3 天前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud
weixin_BYSJ19874 天前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计