SpringCloud--Nacos解析

news2025/1/23 6:42:35

一、Nacos简介

Spring Cloud Alibaba Nacos是一个用于动态服务发现、配置管理和服务管理的平台,是阿里巴巴开源的一个项目,旨在简化微服务架构中的服务治理。Nacos 提供了一组简单易用的特性集,可以快速的实现动态服务发现、服务配置、服务元数据及流量管理。

二、Nacos基本概念

  1. 命名空间(Namespace):命名空间是用来隔离不同租户或不同环境的配置和服务的逻辑区域。在一个Nacos集群中可以定义多个命名空间,不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。
  2. 集群(Cluster):集群是指一组协同工作的Nacos服务器实例,可以提供高可用性。
  3. 配置(Configuration):配置是指应用程序运行所需的外部参数,如数据库连接字符串、外部服务地址等。Nacos提供了中心化的配置管理,允许动态地更改和分发配置。
  4. 配置数据ID(Configuration Data ID):配置数据ID是配置的唯一标识符,用于区分不同的配置集合。
  5. 配置分组(Configuration Group):配置分组用于将配置信息分组,便于管理。
  6. 配置管理(Configuration Management):Nacos提供配置的动态管理,包括配置的创建、获取、修改和删除等操作。
  7. 配置监听(Configuration Listen):应用可以订阅配置变更事件,当配置更新时,应用可以得到通知并重新加载配置。
  8. 服务(Service):服务是指一组提供相同功能的服务实例的集合,是微服务架构中的基本单位。
  9. 服务实例(Service Instance):服务实例指服务的一个具体运行实例,每个实例都有唯一的标识,并向Nacos注册自己的信息。
  10. 分组(Group):分组是服务实例的逻辑分类,可以根据不同的需求将服务实例划分为不同的组。
  11. 动态服务发现(Dynamic Service Discovery):服务实例可以动态地向Nacos注册和注销,其他服务可以动态地发现这些服务实例。
  12. 服务元数据(Service Metadata):服务元数据是关于服务实例的附加信息,如版本号、权重等。
  13. 动态DNS服务(Dynamic DNS):Nacos提供动态DNS服务,当服务实例的IP地址或端口号发生变化时,DNS记录会自动更新。
  14. 服务健康检查(Service Health Check):Nacos定期检查服务

三、数据模型

Nacos 数据模型 Key 由三元组(Namespace、Group、Data ID)唯一确定,Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
在这里插入图片描述

四、Nacos的核心功能

  1. 服务注册与发现:服务提供者在启动时将自己的信息注册到Nacos服务器上,服务消费者可以通过Nacos查询到可用的服务实例列表,并据此进行调用。
  2. 配置管理:Nacos支持配置的集中管理和动态刷新。服务提供者和消费者可以订阅配置的变化,当配置发生变更时,无需重启应用即可实时更新配置。
  3. 动态DNS服务:Nacos提供了动态DNS服务,使得服务提供者和消费者可以通过服务名来解析服务的IP地址,从而实现服务之间的通信。
  4. 流量管理:Nacos支持流量管理功能,如权重路由、流量分割等,帮助实现复杂的流量控制策略。
  5. 服务元数据管理:除了服务名称和IP地址外,Nacos还允许存储和管理额外的服务元数据。

五、Nacos 使用前提条件

5.1 环境准备

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;
  3. Maven 3.2.x+;
5.2 启动Nacos服务器

可以通过 Github下载nacos-server-$version.zip 包,再将其解压出来启动。在2.2.0.1和2.2.1版本时,必须修改conf目录下的application.properties文件,设置其中的nacos.core.auth.plugin.nacos.token.secret.key值,否则无法启动。
在这里插入图片描述

5.3 登录Nacos管理页面

在Nacos server 成功启动后,可以通过在浏览器中输入http://ip:8848/nacos,使用默认账号密码:nacos/nacos 登录管理平台。
在这里插入图片描述

六、服务注册与发现

如果只是启动 Nacos server 的话,在Naocs的管理平台里面是没有管理的服务列表数据的。如果想要将某个服务注册到Nacos上管理的话,需要对客户端服务进行如下修改:

  1. 在pom文件中添加依赖,注意与 Spring Boot 版本之间的对应关系。
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>${latest.version}</version>
</dependency>
  1. 在application.properties或application.yml文件中配置 Nacos server 的地址,以便指定客户端服务需要注册到哪个Nacos server 上。
server.port=8070
spring.application.name=your-service-name
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  1. 在启动类上添加Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。
@SpringBootApplication
@EnableDiscoveryClient
public class NacosClientApplication {

  public static void main(String[] args) {
    SpringApplication.run(NacosClientApplication.class, args);
  }
}
  1. 启动客户端服务,当客户端服务成功启动后,便可以在Nacos管理平台服务列表中看到这个服务的相关状态信息。
    在这里插入图片描述

七、配置管理

如果还想要在 Nacos 上实现客户端配置的管理的话,需要在客户端服务进行如下修改:

  1. 在pom文件中添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>${latest.version}</version>
</dependency>
<!-- bootstrap 配置加载 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
  1. 将application.properties或application.yml文件改成bootstrap.properties或bootstrap.yml,再增加以下配置:
spring:
  application:
    name: snowy-web-app
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        namespace: snowy-cloud-2x-ent-${spring.profiles.active}
        group: ${spring.profiles.active}
        prefix: ${spring.application.name}
        file-extension: yaml
        username: nacos
        password: nacos

在上面的配置中,由${prefix}-${spring.profiles.active}.${file-extension}共同组成Nacos管理页面中配置列表中的Data Id,这个Data Id也是服务配置信息的唯一标识。其中:

  • prefix:默认为 spring.application.name 的值,也就是当前的服务名,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active:即为当前环境对应的 profile,上面配置中就是dev。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,Data Id 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension:为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
  1. 在Nacos控制台中创建配置文件,要保证创建的配置文件的Data Id 与上面${prefix}-${spring.profiles.active}.${file-extension}组成的一致,否则服务启动时读取不到Nacos上的配置信息。再填写相应的配置内容,配置内容的格式主要有Properties、YAML、HTML、XML、JSON、TEXT。一般使用YAML格式,更加美观一点,下面是Nacos上配置内容相关属性的设置:
iam:
  key: JLB6L6MJVIT5Z7IL
  username: njh
  password: 123456
  1. 在客户端代码中可以使用@Value注解来获取Nacos上的配置属性。同时可以使用@RefreshScope注解来实现配置自动更新,即在Nacos管理平台修改服务的配置信息后,无需重启服务就能获取到最新修改的配置属性值。
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${iam.key}")
 	private String key;
}

八、服务元数据管理

在Spring Cloud Nacos中,服务元数据管理是指对服务实例附加额外的键值对信息,以便在服务注册和发现过程中提供更多的上下文信息。服务元数据可以用于多种场景,例如区分服务版本、配置服务特定属性或者实现基于元数据的服务路由。要在Spring Cloud Nacos中管理服务元数据,你可以按照下面的步骤操作:

  1. 注册服务时设置元数据:当服务实例注册到Nacos时,可以在服务实例的配置中添加元数据。例如,在bootstrap.properties或application.properties文件中,可以定义元数据键值对,如下所示:
spring:
  cloud:
    nacos:
      discovery:
        metadata:
          my-key: my-value
  1. 通过Nacos控制台设置元数据:登录到Nacos控制台,手动编辑已注册服务的元数据。在服务列表中选择特定的服务实例,然后在“编辑”界面可以添加或编辑元数据。
  2. 查询服务实例的元数据:当需要获取服务实例的元数据时,可以使用Nacos客户端API查询。例如,在Spring Cloud应用程序中,可以注入NamingService接口,并使用它来检索服务实例的元数据:
@Autowired
private NamingService namingService;

public void getServiceInstanceMetadata(String serviceName) throws NacosException {
    List<Instance> instances = namingService.getAllInstances(serviceName);
    for (Instance instance : instances) {
        Map<String, String> metadata = instance.getMetadata();
        // 处理元数据
    }
}
  1. 使用元数据进行服务发现和路由:在服务消费方,可以根据服务实例的元数据来决定调用哪个实例。例如,可以编写代码仅选择具有特定版本元数据的服务实例。
  2. 动态更新元数据:元数据可以动态更新,无需重启服务。当你通过控制台或API更新了服务实例的元数据后,服务消费者会立即看到这些变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1474527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻量级模型,重量级性能,TinyLlama、LiteLlama小模型火起来了,针对特定领域较小的语言模型是否与较大的模型同样有效?

轻量级模型&#xff0c;重量级性能&#xff0c;TinyLlama、LiteLlama小模型火起来了&#xff0c;针对特定领域较小的语言模型是否与较大的模型同样有效? 当大家都在研究大模型&#xff08;LLM&#xff09;参数规模达到百亿甚至千亿级别的同时&#xff0c;小巧且兼具高性能的小…

【基于React实现共享单车管理系统】—项目简介(一)

【基于React实现共享单车管理系统】—项目简介&#xff08;一&#xff09; 一、项目整体架构

【自然语言处理三-自注意self attention】

自然语言处理三-自注意力 self attention 自注意力是什么&#xff1f;自注意力模型出现的原因是什么&#xff1f;词性标注问题解决方法1-扩展window&#xff0c;引用上下文解决方法2-运用seq2seq架构新问题来了&#xff1a;参数量增加、无法并行的顽疾 自注意力self attention模…

kali Linux 渗透系统的安装、提权与汉化(初识 Linux 系统)

目录 一、安装 kali 二、汉化 kali 三、kali 提权 1、暂时提权 root 2、永久提权 root 四、Linux 常用命令 一、安装 kali 官方镜像下载地址 https://www.kali.org/get-kali/#kali-virtual-machines 我这里推荐的是下载 vmx 文件&#xff0c;下载后解压&#xff0c;在 …

牛客前端八股文(每日更新)

1.说说HTML语义化&#xff1f; 得分点&#xff1a;语义化标签、利于页面内容结构化、利于无CSS页面可读、利于SEO、利于代码可读 1&#xff0c;标签语义化是指在开发时尽可能使用有语义的标签&#xff0c;比如header&#xff0c;footer&#xff0c;h&#xff0c;p&#xff0c…

uniapp实现单选框

采用uniapp-vue3实现的一款单选框组件&#xff0c;提供丝滑的动画选中效果&#xff0c;支持不同主题配置&#xff0c;适配web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net…

【X806开发板试用】串口数据透传阿里云IOT

上成果 阿里云对接需要用的是PRODUCTKEY&#xff0c;DEVICENAME和DEVICESECRET&#xff0c;开始直接用MQTT的例子硬怼&#xff0c;没成功&#xff0c;后面看了文档&#xff0c;发现阿里云对接的client_id,username和password是通过三要素生成的。 找了一下代码&#xff0c;发…

禁止safari浏览器网页双击缩放功能

普通浏览器 普通浏览器&#xff0c;只需要增加meta标签禁止缩放功能就行了 <meta content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0;" name"viewport" /> user-scalableno或0 //禁止双指缩放页面initial-scale1.0…

nginx平滑升级,信号使用,分割日志

信号 kill -l 看信号大全 nginx -h 中可以看到的信号较少 s signal : send signal to a master process: stop, quit, reopen, reload 可以使用man手册来查看详细的信号 如果没安装&#xff0c;去源码包里找到man文件 man 路径/nginx.8 不加路径打不开man帮助 st…

【这个词(Sequence-to-Sequence)在深度学习中怎么解释,有什么作用?】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习笔记 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Sequence-to-Sequence&#xff08;Seq2Seq&#xff09; Sequence-to-Sequence&#xff08;Seq2Seq…

继电器测试中需要注意的安全事项有哪些?

继电器广泛应用于电气控制系统中的开关元件&#xff0c;其主要功能是在输入信号的控制下实现输出电路的断开或闭合。在继电器测试过程中&#xff0c;为了确保测试的准确性和安全性&#xff0c;需要遵循一定的安全事项。以下是在进行继电器测试时需要注意的安全事项&#xff1a;…

leetcode:46.全排列

1.什么是排列&#xff1f; 有顺序&#xff01;&#xff01; 2.树形结构&#xff1a; 使用used数组进行标记取过的元素&#xff0c;一个元素一个元素地进行取值&#xff0c;取完之后将used数组进行标记。 3.代码实现&#xff1a;&#xff08;循环从i0开始&#xff0c;而不是…

【Java EE初阶二十五】简单的表白墙(一)

1. 前端部分 1.1 前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

python Matplotlib Tkinter--pack 框架案例

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 版本一 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的遥感目标检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本文介绍了一种基于深度学习的遥感目标检测系统系统的代码&#xff0c;采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果&#xff0c;能够准确识别图像、视频、实时视频流以及批量文件中的遥感目标。文章详细解释了YOLOv8算法的原理&#xff0…

路坦利集群虚拟机断网处理方法

路坦利集群虚拟机断网处理方法 问题描述&#xff1a; 在路坦利集群中&#xff0c;虚拟机时不时断网&#xff0c;导致业务中断&#xff0c;临时解决办法为新增网卡配置相同IP&#xff0c;然后禁用旧网卡网络临时恢复。 注&#xff1a; 该配置必须让虚拟化平台上层交换机和宿…

GPT 的基础 - T(Transformer)

我们知道GPT的含义是&#xff1a; Generative - 生成下一个词 Pre-trained - 文本预训练 Transformer - 基于Transformer架构 我们看到Transformer模型是GPT的基础&#xff0c;这篇博客梳理了一下Transformer的知识点。 BERT:通过自监督的方式,在大规模语料上预训练得到的Tran…

[C++核心编程](二):引用

目录 基本语法 引用做函数参数 引用做函数返回值 常量引用 基本语法 给变量取别名&#xff1a;数据类型 &别名 原名&#xff1b; 本质&#xff1a;指针常量&#xff08;指针的指向不可改&#xff0c;指向的值可改&#xff09; int value 10;int &index value; …

【Linux】head命令使用

head命令 head是一个在 Unix 和 Unix-like 操作系统中常用的命令行工具&#xff0c;用于输出文件的前 n 行。默认为 10&#xff0c;即显示 10 行的内容。 语法 head [options] [file(s)] head命令 -Linux手册页 选项及作用 执行令 &#xff1a; head --help 执行命令结果…

如何使用GAP-Burp-Extension扫描潜在的参数和节点

关于GAP-Burp-Extension GAP-Burp-Extension是一款功能强大的Burp扩展&#xff0c;该工具在getAllParams扩展的基础上进行了升级&#xff0c;该工具不仅可以帮助广大研究人员在安全审计过程中扫描潜在的参数&#xff0c;而且还可以搜索潜在的链接并使用这些参数进行测试&#…