Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)

Nacos

先来一个注意:以下涉及到配置和项目的创建,我的jdk是jdk17,idea是2023.2.4,并且是社区版的idea

1.什么是Nacos

Nacos是Dyamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助我们发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助我们快速实现动态服务发现,服务配置,服务元数据及流量管理。Nacos帮助我们更敏捷和容易的构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构。

2.上面的话我想你听了肯定还很摸棱两可,下面我用通俗易懂的话来解释一下!!!

想象一下,你是一个指挥家,负责指挥一个由许多乐器组成的交响乐团。每个乐器就像是一个微服务,它们各自演奏自己的部分,但需要协调一致才能演奏出美妙的音乐。在这个比喻中,Nacos 就像是你的助手,帮助你管理这些乐器(微服务)。

服务发现和管理:就好比乐器需要知道何时该演奏,何时该停止。Nacos 会告诉每个微服务(乐器)其他服务(乐器)的位置和状态,确保它们能够协调一致地工作。

配置管理:想象一下,如果乐团中某个部分的演奏风格或速度需要改变,你需要通知到相关的乐器。Nacos 允许你轻松地调整和传达这些改变(配置),确保每个微服务都按照最新的要求来执行。

服务健康监测:这就像确保每个乐器都能正常演奏,没有出现问题。Nacos 不断检查每个微服务的健康状态,如果发现问题,就会及时通知,确保整个系统的稳定运行。

所以,Nacos 基本上是在帮助你指挥这个庞大的微服务交响乐团,确保每个部分都能和谐地工作,最终演奏出美妙的“音乐”(即流畅、高效的应用程序)

3.Nacos功能

Nacos主要功能主要有以下两个
1.配置中心
2.注册中心

3.1配置中心

配置中心是一种集中化管理配置的服务,它的主要作用主要有以下几个:
1.集中管理配置信息:配置中心将不同服务的配置信息集中放在一起进行管理,实现了配置信息的集中存储
2.动态更新配置:配置中心的配置信息可以通过操作界面或者API进行动态更新,无需重启服务就可以应用到最新的配置信息
3.配置信息共享:将配置集中在配置中心中,不同的服务实例可以共享同一套配置信息
4.配置信息安全:配置中心可以对配置信息提供安全管理,权限控制等管理功能
5.信息追溯:指出配置版本管理,历史记录等管理功能

下面我来对上面五条用人话解释
集中管理配置信息:
比方说,你有一个在线购物应用,其中包含用户服务、订单服务和支付服务等微服务。每个服务都有自己的配置信息,例如数据库连接、缓存设置等。通过配置中心,你可以将这些服务的配置信息集中存放和管理,而不是分散在各个服务中。

动态更新配置:
假设你的购物应用需要更改支付服务的某个参数,比如交易超时时间。通过配置中心,你可以直接更新这个参数,而不需要重启支付服务。服务会自动获取最新的配置并应用更改。

配置信息共享:
如果你的购物应用的多个服务都需要访问相同的数据库,你可以在配置中心设置数据库连接信息。这样,所有服务都可以共享这一配置,而无需在每个服务中单独配置数据库信息。

配置信息安全:
在配置中心,你可以设置权限,以确保只有授权的人员能够访问和修改配置信息。比如,你可能只允许高级开发人员修改数据库的连接字符串,以防止未授权的更改。

信息追溯:
假设你更新了购物应用中某个服务的配置,但这导致了一些问题。通过配置中心的版本管理和历史记录功能,你可以轻松查看哪些更改被做了,并且回滚到之前的配置版本,恢复服务的正常运行。

3.2注册中心

注册中心是微服务架构一个重要的组件,用于实现服务的注册与发现,注册中心的主要作用包括以下几个:
1.服务注册: 服务实例启动的时候,将自身信息注册到注册中心,包括服务名称、地址、端口等。
2.服务发现: 消费者向注册中心查询服务,并获取服务实例来访问服务
3.服务健康检查: 注册中心定期检查服务实例健康情况,过滤不健康实例
4.服务路由: 提供服务的路由与负载均衡功能
5.服务监控: 统计服务调用次数,时长等,用于监控服务状态
6.服务更新: 当服务实例信息变更时,向注册中心发送更新信息通知

人话解释
服务注册:

假设你有一个在线书店应用,其中包含一个"书籍搜索服务"。当这个服务启动时,它会向Nacos注册中心注册自己的信息,如服务名称是"book-search-service",地址可能是"192.168.1.5",端口是8080。这样,注册中心就知道了这个服务的存在和如何访问它。

服务发现:
在同一个在线书店应用中,假设有一个"用户界面服务"需要调用"书籍搜索服务"来显示书籍数据。"用户界面服务"会询问Nacos注册中心"书籍搜索服务"的位置,注册中心返回"书籍搜索服务"的地址和端口,然后"用户界面服务"可以直接调用该服务。

服务健康检查:
Nacos定期检查"书籍搜索服务"是否正常运行,例如通过发送心跳信号或进行实际的服务调用。如果服务没有响应或响应时间过长,Nacos会认为这个实例不健康,并从可用服务列表中移除它。

服务路由和负载均衡:
假设"书籍搜索服务"有多个实例运行在不同的服务器上。当"用户界面服务"请求"书籍搜索服务"时,Nacos根据设定的路由策略(如轮询、最少连接等)决定应该将请求发送到哪个实例,实现负载均衡。

服务监控:
Nacos可以记录每次对"书籍搜索服务"的调用次数、响应时间等信息。这些数据可以用于监控服务的性能、发现潜在的问题或进行容量规划。

服务更新:
如果"书籍搜索服务"的某个实例因为升级或维护改变了其地址或端口,该实例会向Nacos发送更新信息。Nacos注册中心会更新其记录,确保其他服务能够获取到最新的访问信息。

4.Nacos优点

1.简单易用: 例如,一个小型创业团队正在开发一个电子商务应用。他们选择使用Nacos,因为它提供了简单直观的界面来管理服务注册和配置。即便是没有丰富微服务经验的开发者,也能轻松上手,快速部署和管理他们的服务。
2.特性丰富: 假设有一个企业正在进行数字化转型,他们需要管理多种语言编写的微服务(如Java、Python、Node.js)。Nacos提供了服务发现、动态配置管理、服务健康检查等多种特性,可以跨语言和环境支持这些微服务的运行和协作。
3.超高性能: 想象一个大型在线零售商在双11大促销期间,面临巨大的访问量。Nacos能够快速处理成千上万个服务实例的注册和发现请求,确保整个微服务架构的高效运行,没有性能瓶颈。
4.超大容量: 对于一个全球性的金融服务公司来说,他们可能在全球部署了数以千计的微服务实例。Nacos可以轻松管理如此大规模的服务实例,不会因为服务数量的增加而影响其性能和稳定性。
5.高可用: 在一个在线视频流服务平台,稳定性是关键。Nacos提供了高可用的配置,即使在部分服务节点发生故障的情况下,也能保证服务注册和配置的持续可用,确保用户体验不受影响。

5.Nacos使用场景举例

例子背景
假设我们有一个在线购物平台,该平台包括商品服务、订单服务、用户服务等微服务。随着业务的增长和技术的演进,这些服务可能需要频繁地进行扩展、更新或迁移。
使用Nacos的场景

1.服务发现和注册
场景描述:在微服务架构中,服务实例经常动态变化(如因扩展、更新或故障恢复)。例如,如果订单服务需要调用商品服务,它需要知道商品服务的当前可用实例和它们的网络位置。
Nacos的作用:商品服务的所有实例在启动时向Nacos注册自己的信息(如IP地址和端口)。订单服务通过查询Nacos获取商品服务的实时实例列表,从而知道该向哪个实例发送请求。
2. 动态配置管理
场景简化:假设在线购物平台的商品服务需要根据特定节日或促销活动调整其显示的商品类型或数量。这种调整通常涉及更改服务的配置,例如修改推荐商品的数量或类型。
如何使用Nacos:
在没有Nacos的情况下,每次更改配置可能需要重新启动服务,这会导致服务中断。
使用Nacos后,可以将这些配置存储在Nacos的配置中心。
当配置需要更改时,只需在Nacos中更新配置,Nacos会自动通知商品服务。
商品服务接收到更新通知后,动态读取新的配置,而无需重启服务。
这样可以实现无缝地调整服务行为,响应业务需求的变化。
3. 服务健康监控
场景描述:确保所有微服务正常运行是至关重要的。如果用户服务出现故障,可能会影响整个购物体验。
Nacos的作用:Nacos提供服务健康检查,可以监控服务是否运行正常。如果检测到服务实例不健康,Nacos将从服务列表中剔除该实例,保证请求不会被路由到故障的实例上。
4.流量管理和路由
假设你有一个网上商店,在大促销日(比如“双十一”)那天,你的网站会有很多访客。这时候,你需要确保网站运行流畅,让每个人都能快速浏览和购买商品。

使用Nacos的流量管理和路由,可以这样操作:
(1).准备多个服务器:你有好几台服务器来支持网站。有些是旧服务器,运行稳定;有些是新服务器,上面有最新的功能。
(2).分配访客:在大促销日,你想要让更多的访客去使用那些新服务器,因为新服务器更快更强大。
(3).Nacos的作用:
智能分流:Nacos可以自动帮你把访客分配到不同的服务器。比如,它可以让来自北京的访客使用一个服务器,上海的访客使用另一个服务器。
灰度测试:如果你想试试新功能,又不想让所有人都立刻用上这个功能,Nacos可以只让一部分人(比如10%的访客)使用有新功能的服务器。
结果:这样一来,你的网站既可以应对大量访客,又可以平稳地测试和推出新功能,而不会影响所有人的使用体验。
简单来说:Nacos就像是一个聪明的交通指挥官,它可以根据你的需求,把网站的访客智能地分配到不同的服务器,确保网站运行顺畅,同时也能在需要时试验新功能。

6.Nacos基本使用

6.1部署方式

Nacos有以下三种部署方式:
1.单机模式:将注册中心、配置中心等功能集成在一个进程内,全部部署在一台及其上,适用于测试和单机试用
2.集群模式:多个Nacos服务器实例组成一个集群。这些实例通过相互通信和协调工作,共同提供服务注册、配置管理和服务发现等功能。在集群模式下,所有的实例共享相同的数据,数据变更会自动同步到所有的实例中,客户端可以随机选择任意一个实例进行注册和发现服务。
3.多集群模式:多集群模式是为了在满足不同区域或者网络中进行部署或者扩展的需求。在多集群模式中,可以选择不同的nacos实例组成多个相互独立的集群,每个集群可以拥有自己独立的配置和注册中心,并且可以跨集群进行服务注册和发现。多集群模式适用于分布式系统的多区域部署,并可以使用不同的网络和存储设施。每个集群具有独立的数据和配置,但是可以通过自定义的同步机制在集群之间共享数据。
多集群的作用:
不同机房的部署:将Nacos集群分布在不同的机房,实现异地多活,提高服务的可用性。当单个机房不可用的时候,通过域名解析可以快速切换到另一个机房
不同运营商的部署:跨运营商部署Nacos集群,避免单一运营商网络问题导致服务中断

上面的集群模式和但集群模式你可能模糊不清,下面我还是用人话来解释
Nacos集群部署模式:
场景:想象一个在线教育平台,他们的服务需求随着用户数量的增长而增长,需要保证服务的高可用性和负载均衡。
部署方式:在这种情况下,他们可能会在一个数据中心内部署一个Nacos集群。这个集群包括多个Nacos服务器节点,这些节点之间相互协作,以确保服务注册和配置信息的高可用性。
优势:如果其中一个节点发生故障,其它节点能够接管工作,保证服务的连续性。此外,集群模式还可以平衡负载,提高处理请求的能力。

Nacos多集群部署模式:
场景:假设有一家全球运营的电商企业,他们在多个地理位置(例如北美、欧洲和亚洲)有运营中心。
部署方式:为了更好地服务于全球用户并保证服务的高可用性,他们可能在每个主要的地理位置部署一个Nacos集群。这些集群彼此独立,但通过网络相互连接,形成一个多集群部署。
优势:这种部署方式使得每个地区的用户都能快速访问到最近的服务实例,降低了延迟,并且在一个地区的集群出现问题时,不会影响到其它地区的服务。

在这两种部署模式中,集群部署模式主要用于提高单个数据中心的可用性和负载能力,而多集群部署模式更适用于跨地域的全球服务需求,旨在提高跨地域的服务可用性和用户体验。

6.2安装并启动

1.预备环境准备:
Nacos安装和运行需要依赖JDK环境,因此在安装之前,需要先在电脑安装JDK1.8+的环境
2.安装并启动
Nacos有两种安装方式
1).源码安装
2).编译压缩包安装
PS:推荐使用编译压缩包安装,操作更简单,出现问题的概率更小
下面我只说编译压缩包安装流程
第一步:你先下载压缩包:点击这里下载最新的版本
第二步:把它解压,这步太简单了,不教了
第三步:打开你电脑的终端,进入你的nacos的bin目录
在这里插入图片描述
第四步:启动Nacos服务
Linus/MacOS输入命令:sh startup.sh -m standalone 启动
Windows:startup.cmd -m standalone 启动
下图就是启动成功了
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第1张图片
然后你就找下图这个链接,把它复制
在这里插入图片描述
但是注意来了,你先在你的浏览器上粘贴上述链接,但是先别进去呢,你还得改呢,改成
localhost:8848/nacos/index.html
再进去
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第2张图片
第五步:配置数据源
Nacos单机模式默认使用的是内置的嵌入式数据库Derby,但是它不适合承载生产环境大规模部署,因为它有以下限制:
1.数据存储容量最大只有2GB
2.不支持集群模式下数据的高可用性
3.性能和并发能力有限
因此在使用单机模式的Nacos的时候,可以把数据库换了,比如我使用的就是mysql,下面我说一下切换mysql的步骤
1.安装mysql数据库,版本需要5.6.5+
2.下载完了之后在你的mysql直接复制下面代码

drop DATABASE if EXISTS nacos;
CREATE DATABASE nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
use nacos;

/******************************************/
/*   表名称 = config_info                  */
/******************************************/
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',
  `c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',
  `effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述',
  `type` varchar(64) DEFAULT NULL COMMENT '配置的类型',
  `c_schema` text COMMENT '配置的模式',
  `encrypted_data_key` text NOT NULL COMMENT '密钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/*   表名称 = config_info_aggr             */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/*   表名称 = config_info_beta             */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '密钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/*   表名称 = config_info_tag              */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/*   表名称 = config_tags_relation         */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识',
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/*   表名称 = group_capacity               */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/*   表名称 = his_config_info              */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(20) unsigned NOT NULL COMMENT 'id',
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `op_type` char(10) DEFAULT NULL COMMENT 'operation type',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '密钥',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


/******************************************/
/*   表名称 = tenant_capacity              */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE `users` (
	`username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',
	`password` varchar(500) NOT NULL COMMENT 'password',
	`enabled` boolean NOT NULL COMMENT 'enabled'
);

CREATE TABLE `roles` (
	`username` varchar(50) NOT NULL COMMENT 'username',
	`role` varchar(50) NOT NULL COMMENT 'role',
	UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL COMMENT 'role',
    `resource` varchar(255) NOT NULL COMMENT 'resource',
    `action` varchar(8) NOT NULL COMMENT 'action',
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

3.修改Nacos安装目录下的conf文件下的application.properties文件(你可以安装一个VSCode,用它打开,反正我是这么打开的),增加如下代码

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=021018

这个password是你自己的mysql设置的密码,没有就不写
第六步:
开启登录权限,也就是上面我让你往下看的那个图
还是在Nacos安装目录下的conf文件下的application.properties里面加如下代码

nacos.core.auth.enabled=true
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos

有注意事项了:
第五步和第六步加代码的时候,你可以用vscode的搜索功能看看有没有代码,比如人家原始的代码可能把需要加的注释掉了,你只需要去掉注释就行了,或者人家原始代码最后是false,你只需要变成true就行了

7.注意

Nacos安装注意事项:
1.不要将Nacos安装在C盘下
2安装包不能出现在中文路径下!!!

Nacos启动注意事项:
1.本地权限
2.JDK的版本
3.口令输入的是否正确

部署问题:此处我的安装部署只是第一种单机部署

8.配置中心的使用

1.创建配置信息

Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第3张图片
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第4张图片
命名空间:Nacos的命名空间(Namespace)是一种逻辑上的隔离机制,它用于将不同的服务实例或配置分隔开来。每个命名空间都有一个独特的ID,可以包含一组服务或配置。
假设一个公司有开发(Dev)、测试(Test)和生产(Prod)三个环境。他们可以在 Nacos 中为每个环境创建一个单独的命名空间:
Dev Namespace: 用于开发环境,开发人员可以在这里自由地测试和修改配置,而不会影响到其他环境。
Test Namespace: 用于测试环境,测试团队可以在这个环境中进行各种测试,确保应用的稳定性。
Prod Namespace: 生产环境的命名空间,这里的配置必须是经过严格测试和验证的,以确保应用的稳定运行。
通过这种方式,公司可以确保不同环境的配置互不干扰,同时保持各个环境的配置同步和一致性。
Data ID:配置的唯一标识,用于查找配置文件
Group:在特定命名空间内,用于细分和组织配置。它是在命名空间内的进一步细化,通常用于区分不同应用或服务的配置。

命名空间和Group区别

Nacos 配置中心中的命名空间(Namespace)和分组(Group)是两个用于隔离和组织配置的概念,但它们的作用范围和用途有所不同。让我通过例子来解释这两者的区别:

命名空间(Namespace)
命名空间通常用于隔离不同的环境或租户。每个命名空间都有一个唯一的 ID,并且在不同的命名空间中可以有相同的分组和 Data ID。

例子:
开发环境 Namespace:用于开发环境的配置管理。
测试环境 Namespace:用于测试环境的配置管理。
生产环境 Namespace:用于生产环境的配置管理。
在这个例子中,三个环境的配置是隔离的,开发环境的改动不会影响到测试或生产环境。

分组(Group)
分组是命名空间内的一个进一步划分,用于组织相关的配置项。同一个命名空间中的不同分组可以包含具有相同 Data ID 的配置。

例子:
假设在开发环境 Namespace中,有两个应用程序:App1 和 App2。我们可以为它们创建不同的分组:

App1 Group:包含 App1 的所有配置。
App2 Group:包含 App2 的所有配置。
这样,尽管两个应用程序在同一个命名空间中,但它们的配置被组织在不同的分组中,便于管理。

区别总结:
命名空间:用于隔离不同的环境、租户或者大范围的项目。它是更高层级的隔离,通常用于环境隔离。
分组:在特定命名空间内,用于细分和组织配置。它是在命名空间内的进一步细化,通常用于区分不同应用或服务的配置。
通过这样的设置,Nacos 能够提供灵活且强大的配置管理,适应不同规模和复杂度的应用场景。

2.创建SpringBoot项目
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第5张图片

Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第6张图片
然后添加下面两个框架
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第7张图片
进去之后删除下面两个(不删也行,因为没用,我怕我乱套,所以删了)
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第8张图片
3.配置nacos
点开下图的文件,在这里配置
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第9张图片
你点开之后可能出现一堆你看不懂的乱码,你需要修改编码方式,看下面俩张图就能不乱码了
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第10张图片
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第11张图片
然后就可以配置了,仔细看我的配置跟你的原始配置有啥不同!!!

# 应用服务 WEB 访问端口
server.port=8080
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace=
# spring.cloud.nacos.config.group=
# 注意,下面一行的代码中的  nacos:  的后面的玩意一定要和你的配  置中心的Data ID一样
spring.config.import=nacos:nacos-config-example
spring.cloud.nacos.config.file-extension=properties

最后一步,创建个java文件,可以开始写代码了
这个文件的位置如图,仔细看,位置错了运行不起来的
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第12张图片
下面是我的代码

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
@RefreshScope//这个注解是当你的配置中心的配置修改的时候,你通过url在浏览器访问了之后,可以获取到你修改之后的配置,也就是刷新你的配置
public class TestController {
    //@Value用于将 myconfig 配置项的值注入到 myConfig 字段中。
    // 这个值通常是从外部配置源(如properties文件、YAML文件或者Spring Cloud Config Server)加载的。
    //也就是说这个注解从properties配置文件知道了我用的nacos,然后去nacos的配置中找到了myconfig这个字段
    @Value("${myconfig}")
    private String myConfig;
    @RequestMapping("/myconfig")
    public String getConfig(){
        return myConfig;
    }
}

我的配置中心如下图,仔细看我的myconfig和上述代码中的@Value(“${myconfig}”)是对应的
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第13张图片
访问浏览器如下图
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第14张图片

9.注册中心的使用

9.1注册中心的流程

注册中心通常有两个角色:
1.服务提供者(生产者):对外提供服务的微服务应用。它会把自身的服务地址注册到注册中心,以供消费者发现和调用
2.服务调用者(消费者):调用其他微服务的应用程序。它会向注册中心订阅自己需要的服务,并基于服务提供者注册的信息发起远程调用。
流程:
1.首先,比如有三个生产者(内容都一样比如都是“西瓜”),他们仨都把自己的服务注册到了注册中心
2.这时候注册中心就有一张表,这张表就是注册到注册中心的生产者
3.这时候来了消费者吃“西瓜了”,于是就从注册中心的那个列表看了一下可用的生产者(西瓜)
4.然后发现三个西瓜都一样,这时候就通过负载均衡器给这个消费者分配一个西瓜
(为什么用负载均衡器呢?你这么想,一个西瓜只能让10个人吃,A西瓜已经有10个人了,再让这个消费者去吃就11个人了,这时候负载均衡器看看B和C西瓜有几个人吃,假如C有8个,B有6个,就让这个消费者去吃B西瓜)

9.2多模块项目

注册中心是要实现生产者和消费者的,于是你就需要有多模块项目了,生产者是一个模块,消费者是一个模块,下图为步骤
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第15张图片
然后添加下图四个框架
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第16张图片
进去之后,删除到剩我这样
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第17张图片
然后打开pom.xml,红色框框这两行跟我一样
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第18张图片
然后下面红框框几行删了
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第19张图片
然后加上下面这行,意思是把当前标记为父模块
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第20张图片

9.3生产者实现

现在来建生产者为上述的子模块
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第21张图片
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第22张图片
然后直接点cerete,因为父模块把需要添加的框架都添加了,所以子模块只需要继承就行了,啥也不需要添加
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第23张图片
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第24张图片
然后打开pom.xml,把红色框的内容删了,因为父模块已经有了,而且更全,子模块再有可能会出错,保守起见还是删了最好
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第25张图片
下面也删
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第26张图片
下面还删
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第27张图片

然后加上下面这段,告诉这个模块谁是它爹
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第28张图片
然后打开你的父模块的pom.xml,加上下面这段,告诉这个父亲,它的儿子是谁
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第29张图片

然后点下面这个
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第30张图片
然后
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第31张图片
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第32张图片

Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第33张图片
在这里插入图片描述
然后在这个配置文件复制下列代码

spring:
  application:
    name: nacos-discovery-demo #Nacos注册的服务名(很重要,命名不要使用下划线)
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        ephemeral: true # false是设置此服务为永久实例
server:
  port: 0 #动态端口号  因为微服务的时候端口号会放到注册中心,而不是给用户,消费者用端口号的时候由注册中心分配

然你就直接启动这个项目,然后你打开你的nacos,你就会发现下图那样
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第34张图片
你点开详情之后就看到了这个服务的ip地址和端口号
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第35张图片

接下来我的代码如下
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第36张图片

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("getnamebyid")
    public String getNameById(Integer id){
        return "producerName+"+ id;
    }
}

然后你运行项目之后,登录这个url地址就可以访问了
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第37张图片

9.4消费者实现

1.先添加框架:Nacos Discovery 、Spring Cloud LoadBalancer、Spring Cloud OpenFeign
框架也是父节点就有了,别忘了在consumer的pom.xml里面声明父亲,在父亲的pom.xml声明这个儿子,其他步骤都跟上面一样
2.配置Nacos
在consumer的application.yml文件复制下列代码

spring:
  application:
    name: nacos-consumer-demo
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        register-enabled: false # 消费者(不需要将此服务注册到nacos)
server:
  port: 8080

3.开启OpenFeign功能
在你的consumer的启动类加下面注解
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第38张图片

4.编写OpenFeign调用代码
看好了,是个接口
Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第39张图片

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Service
@FeignClient("nacos-discovery-demo")//表示调用nacos的nacos-discovery-demo服务
public interface TestService {
    //这个路径一定要等于producer的启动类的那个路径之和,含义是调用生产者的/user/getnamebyid接口
    @RequestMapping("/user/getnamebyid")
    public String getNameById(@RequestParam("id") int id);
}

5.编写代码通过OpenFeign调用生产者

import com.example.consumer.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Autowired
    private TestService testService;
    @RequestMapping("/getnamebyid")
    public String getNameById(Integer id){
        return testService.getNameById(id);
    }
}

逻辑如下
1.客户端向TestController的/getnamebyid发送HTTP请求,并带上参数id。
2.TestController接收到请求后,调用testService.getNameById(id)方法。
3.TestService是一个Feign客户端,它将请求转发到nacos-discovery-demo服务的/user/getnamebyid路径,并且通过@RequestParam(“id”)注解把id传给producer的

 public String getNameById(Integer id){
        return "啊啊啊啊啊producerName+"+ id;
    }

这个方法。
4.nacos-discovery-demo服务处理请求并返回结果。
5.TestController接收到结果,并将结果返回给客户端。
最后在浏览器的显示如下
在这里插入图片描述

9.5注册中心参数说明

Nacos(先解释专属名词,然后大白话讲解+安装配置教程+代码实例 信我,看了必会!!点进来吧各位大佬们)_第40张图片

分组(Group):
分组是将服务进行逻辑上的分类,类似于文件夹。比如,你可以有多个环境的服务,如开发环境、测试环境和生产环境,你可以为每个环境设置一个分组,使得同一个服务在不同的环境中不会相互干扰。
例子:假设你有一个用户服务,在开发环境中注册为"DEV-GROUP"分组,在生产环境中注册为"PROD-GROUP"分组。

保护阈值(Protect Threshold):
保护阈值是一个用于服务保护的阈值。当一个服务的健康实例数量低于这个阈值时,Nacos会将这个服务标记为保护状态,这时候即使服务实例非常少,也不会全部下线,保证了服务的可用性。
例子:如果一个服务设置了保护阈值为0.6,那么在服务实例总数的60%是健康的情况下,服务就不会全部下线。

服务路由类型(Service Routing Type):
服务路由是决定服务请求调用哪个实例的规则。比如,可以根据版本号、区域或其他元数据来路由请求。
例子:如果你有一个服务有A、B两个版本,你可以设置路由规则,使得来自某些特定用户的请求只会路由到A版本。

临时实例(Ephemeral Instance):
临时实例是指那些不需要持久存储的服务实例,通常在服务提供者关闭时会自动注销。这对于服务的弹性伸缩非常有用。
例子:当你使用容器服务时,容器启动时会注册为临时实例,容器停止时实例会自动注销。

权重(Weight):
权重是用于服务调用时负载均衡策略的一个参数。实例的权重越高,它被调用的概率就越大。
例子:如果服务A的实例有两个,实例1的权重为1.0,实例2的权重为3.0,那么在负载均衡时,实例2接收到的请求是实例1的三倍。

10.Nacos底层原理

10.1Nacos底层执行流程

1.服务提供者启动后,将自己的信息注册到 Nacos Server 的命名服务中。
2.服务消费者需要调用服务时,会向 Nacos Server 的命名服务查询服务提供者的信息。
3.Nacos Server 返回服务提供者的信息,服务消费者据此连接服务提供者。
4.同时,服务消费者和提供者都可能需要从 Nacos Server 的配置服务中获取或更新配置信息。
5.管理员或用户可以通过 Nacos Console 进行服务和配置的管理操作。

10.2配置中心自动刷新原理

Nacos配置中心是支持配置项自动刷新的(也就是代码中的@RefreshScope注解),原理通过长轮询+事件驱动的方式来实现的,具体来说:

长轮询(Long Polling)
长轮询是一种客户端和服务器之间通信的技术,其中客户端发起一个请求到服务器,然后服务器保持连接打开直到有更新可发送。这避免了客户端需要不断重新发送请求来检查更新。
在Nacos的上下文中,长轮询可以这样理解:
1.客户端(例如Spring Cloud应用)向Nacos服务器发送一个请求,询问某个配置是否有更新。
2.Nacos服务器不会立即响应,而是等待直到有更新发生或超时。
3.如果配置更新了,Nacos服务器将新的配置数据发送回客户端,然后客户端处理这些数据(例如,刷新@RefreshScope标记的beans)。
4.客户端处理完毕后,会再次发起请求,开始下一个长轮询周期。

事件驱动(Event-Driven)
事件驱动是一种编程范式,在这种模式中,系统的流程是由事件控制的。这些事件可以是用户行为,也可以是系统内部的更新通知。
在配置自动刷新的情况下,事件驱动工作流程如下:
1.当配置更新时,Nacos服务器将触发一个事件。
2.客户端监听这些事件。一旦检测到配置更改事件,它将执行相应的操作(例如,刷新配置)。
3.这种模式使得系统能够做出快速反应,因为一旦发生了更改,就会立即有通知,而不是等待下一个轮询周期。

这两种机制都是为了减少不必要的通信,并确保配置更新可以快速而有效地传播到需要它们的服务。在实际应用中,Nacos客户端库通常抽象了这些细节,开发者只需要按照文档配置和编码即可享受自动配置刷新带来的便利。

以下是合并了长轮询和事件驱动的Nacos配置中心的执行流程:

1.启动时加载配置
客户端应用启动时,通过Nacos客户端向Nacos服务器请求加载所需的配置信息。

2.建立长轮询连接:
客户端建立一个长轮询连接到Nacos服务器,询问配置是否有更新。
这个连接请求通常会包含当前客户端所拥有的配置的版本信息。

3.服务器端配置更新检测:
Nacos服务器接收到长轮询请求后,检查是否有配置更新。
如果没有更新,服务器保持连接打开,并在一定时间内(比如30秒)等待。

4.更新事件触发:
如果在等待期间配置发生了变化,Nacos服务器就会立即将更新的配置信息推送给客户端。
如果等待期间没有变化,连接超时后,服务器将返回一个响应告知客户端没有变化。

5.客户端处理更新:
客户端接收到更新后,会触发内部的事件,如Spring Cloud环境中的EnvironmentChangeEvent或者RefreshScope相关的事件。
监听这些事件的组件将会根据新的配置进行自动刷新。

6.重启长轮询:
客户端处理完配置更新后,会再次发送长轮询请求到Nacos服务器,开始新的监听周期。

7.健康检查和状态同步:
在整个过程中,Nacos服务器会定期进行健康检查,以确保只有健康的实例参与服务。客户端也会定期同步自身状态到Nacos,以便于管理和监控。
通过这种机制,Nacos能够实现几乎实时的配置更新分发,同时保持网络和服务器的高效性,避免频繁的轮询带来的性能问题。

10.3注册中心底层实现

Nacos注册中心的底层实现主要依赖于两个关键组件:服务注册和服务发现。
服务注册: 是指将服务实例的元数据(包括 IP 地址、端口号、服务名称等)注册到nacos 服务器上,以便其他服务能够发现和访问该服务。在服务启动时,它会向 Nacos 服务器发送一个注册请求,将自身的信息注册到特定的命名空间和分组中。
服务发现: 是指根据服务名称从 Nacos 服务器获取已注册的服务实例列表,并将其提供给需要调用该服务的服务消费者。消费者可以通过调用 Nacos 提供的API或集成Nacos 客户端库来获取服务实例列表
具体来说,Nacos注册中心的实现包括以下几个步骤:

  1. 服务注册: 当服务启动时,它会 Nacos 服务器发送一个注册请求,包含自己的元数据信息。Nacos 服务器接收到注册请求后,在内存中维护一个注册表,将服务实例的元数据保存起来,用于后续的服务发现。
  2. 心跳机制: 注册成功后,服务实例会定期向 Nacos 服务器发送心跳请求,以表明自己的健康状态和可用性。这样Nacos 服务器可以监控各个服务实例的状态,并及时剔除不可用或下线的实例。
  3. 服务发现: 当消费者需要访问某个服务时,它会向 Nacos 服务器发送一个服务发现请求,包含所需服务的名称。Nacos服务器根据服务名称查找注册表,并返回该服务的实例列表给消费者。
  4. **负载均衡:**在服务发现的过程中,Nacos 还提供了负载均衡的支持。消费者可以洗择合适的负载均衡策略来选来选择其中一个或者多个服务实例进行调用。

11.思考题

1.长连接和长轮询的区别?
长连接:客户端和服务器之间建立的是一个持久的TCP连接,这个连接会保持活动状态,直到一方显式地关闭它。长连接适合于消息必须尽快送达的实时通信场景。
长轮询:客户端发起一个到服务器的请求,但服务器会延迟响应,直到有数据可发送或者达到超时。长轮询保持HTTP连接在服务器有新的信息之前不会被关闭,但一旦完成数据传输,连接就会关闭,然后客户端会立即再次发起新的轮询请求。
2.为什么Nacos使用长轮询而不是长连接?
Nacos使用长轮询而不是长连接的主要原因在于资源和消息管理的高效性。长连接意味着客户端和服务器之间建立持久的连接,这种连接会一直保持直到被显式关闭。虽然长连接可以实时传输数据,但在处理大量客户端时,会占用更多的服务器资源(如文件描述符、内存等)。长轮询是一种准长连接的方式,它通过不断重新发起请求来模拟持续的连接,从而减少了服务器持续保持连接的资源消耗。当需要向客户端推送更新时,服务器只需要在有更新时响应挂起的请求,这种方式适用于配置更新这种低频、高延迟容忍的场景。

你可能感兴趣的:(spring,java,后端,spring,boot,spring,cloud,Nacos,mvc)