当前位置: 首页 > news >正文

[SpringCloud] Nacos 简介

目录

一、Nacos,启动!

1、安装 Nacos

2、运行 Nacos

3、Nacos 服务注册

二、Nacos 服务多级存储模型

1、服务跨集群分配

2、NacosRule 负载均衡(优先本地)

3、服务实例的权重设置

4、环境隔离

三、Nacos 注册中心细节分析

1、临时实例与非临时实例

2、Nacos 和 Eureka 的对比

四、Nacos 配置管理

1、统一配置管理

2、微服务配置拉取

3、配置热更新

4、多环境配置共享

5、Nacos 集群搭建

6、配置管理问题汇总


一、Nacos,启动!

Nacos 跟 Eureka 一样,都是服务注册中心。我们可以选择使用 Nacos,也可以选择使用 Eureka。

1、安装 Nacos

Nacos 的版本选择 1.x 的版本,因为 2.x 的已经停止维护了。

注意:一定是带有 server 的,不是 develop、client 之类的。

gitee 链接:https://gitee.com/manic-little-er/nacos-server-1.4?_from=gitee_search

2、运行 Nacos

(1)查看端口

  • 打开 conf 目录下的 application.properties 文件中;

  • 其中写有端口号为 8848,若后续启动失败,有可能是端口被占用了;

(2)运行 startup.cmd 

  • 现在我们的环境是单机,在 bin 目录下打开控制台,输入:startup.cmd -m standalone;

(3)访问 Nacos 控制页面

  • 在刚才的控制台中有 Nacos 的控制页面的链接:localhost:8848/nacos/index.html;
  • 访问后是一个登录页面,账号、密码都是:nacos;

  • 登录后就可以使用控制面板了;

3、Nacos 服务注册

现在有 2 个 service 模块:order-service 和 user-service。其中,order-service 会调用 user-service

相关代码可以查看:https://blog.csdn.net/joyride_run/article/details/134031277

(1)引入依赖

  • 在父工程的 pom 文件中引入 spring-cloud-alibaba;(也可以按照自己的项目引入到 pom 文件)
  • springcloud 版本为 2021.0.6,可以兼容 springcloud-alibaba 版本 2.2.5.RELEASE;

  • 被调用的 user-service 模块中,引入 nacos 客户端依赖包;
  • 这样 Nacos 就会创建出 user-service 服务实例;

(2)修改 application 配置文件

  • 在 order-service 模块的 application 中,添加 server-addr 的属性;

  • 在 user-service 模块的 application 中,添加 server-addr 的属性;

(3)启动 application,观察服务列表

  • 启动 application;
  • 在这之前还需要启动 nacos 的服务端;

  • 查看 nacos 控制面板的服务列表;

二、Nacos 服务多级存储模型

一个服务可以有多个实例。比如上面的 user-service 有 2 个实例。假如服务器出现故障,那么部署在这个服务器中的所有实例,都会被销毁。

为了解决这个问题,Nacos 参考了现实中的方法,将多个实例当作同一个机房内的服务,也叫做集群。这就形成了多级存储模型

服务 -> 集群 -> 实例

1、服务跨集群分配

  • 现实中的服务器一般会分布在不同的地域,如果服务想要获取实例时,不从本地获取(局域网),反而去到别的集群获取,就会大大增加延迟,降低效率。
  • 只有在本地集群不可用时,才会考虑其他集群。

(1)为 Nacos 设置集群

  • 打开 Nacos 控制面板,启动 order-service;
  • 会发现它的集群为 default;

(2)修改 application 配置文件

  • 配置 cluster-name 属性,属性值代表集群名称;

(3)启动 application,观察 Nacos 服务列表

  • 可以发现,2 个 order-service 的实例,都已经是 BJ 集群;

(4)同服务分配到不同集群

如果我们想将 2 个 order-service 实例的其中之一,分配到 SH(上海)集群,应该怎么做呢?

  • 将其中一个 application 关闭,然后修改 application 配置文件;

  • 将 cluster-name 修改为 SH;

  • 再次观察 order-service 的详细信息,会发现已经分为不同的集群;

2、NacosRule 负载均衡(优先本地)

需求:

order-service 实例优先调用本地集群的 user-service,当本地集群一个 user-service 实例都没有时,访问别的集群。

我们设计出如下集群:

(1)修改 application 配置文件

  • 将 order-service 对 user-service 的负载均衡规则修改为 NacosRule

(2)发起请求 /order/queryOrderById/xxx

  • 发起 6 次请求;

  • 只有 user-service1 和 user-service2 有输出,user-service3 无输出;

(3)访问 user-service3

  • 将 order-service 本地集群的 2 个 user-service 关闭;

  • 再次发起请求,观察 user-service3 是否有输出;

  • user-service3 有输出,说明跨集群调用生效;
  • order-service 中同样有跨集群调用的提示;

(4)NacosRule 同集群内调用

  • NacosRule 确定了采用哪个集群的服务列表后,不是使用轮巡负载均衡规则,而是使用随机负载均衡规则

3、服务实例的权重设置

实际部署中会出现这样的场景:

  • 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求

Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。

这样做的好处就在于:

  • 当我们需要版本升级、维护机器等操作时,可以先将目标服务器的权重设置为 0,待服务器完全不承担用户请求的时候,就可以将其停机。

4、环境隔离

在实际开发中,通常会有不同的生产环境,对于某个服务,可以为其分配到指定的命名空间,这样其他命名空间的服务,就访问不到它

namespace:

  • Nacos 中服务存储和数据存储的最外层都是一个名为 namespace 的东西,用来做最外层隔离。
  • 同一个命名空间内有 group,分组后,就可以在每个 group 中存放 service 或者 data。

(1)查看 namespace

  • 在 nacos 控制页面中,左侧选项就可以查看 namespace;
  • 在默认情况下,我们的 service/data 都属于 public 命名空间下的 default_group ;

(2)新建 namespace

  • 在 namepace 的右侧,可以选择新建 namespace;

  • 创建一个用于开发环境的 namespace;
  • ID 如果不填写,会自动使用 UUID 生成;

(3)为 service 配置 namespace 属性

  • 要想我们的 service 能注册到新的 namespace 上,需要在 application 中去配置;
  • 配置 namespace 的时候,属性值写的是 ID;

三、Nacos 注册中心细节分析

1、临时实例与非临时实例

从上图可以看出:

  • 临时实例是由提供者周期发送心跳,来维持服务的提供;(服务停止,Nacos 会删除它)
  • 非临时实例是由 Nacos 来主动进行查询;(服务停止,Nacos 不会删除它

(1)配置非临时实例

(2)启动 application

  • 查看服务的详细信息,发现它已经是非临时实例;

2、Nacos 和 Eureka 的对比

(1)Nacos 与 Eureka 的共同点

  • 都支持服务注册和服务拉取;
  • 都支持服务提供者心跳方式做健康检测;

(2)Nacos 与 Eureka 的区别

  • Nacos 支持服务端主动检测提供者状态:临时实例采用心跳模式非临时实例采用主动检测模式;
  • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除;
  • Nacos 支持服务列表变更的消息推送模式,服务列表更新更及时;
  • Nacos 集群默认采用 AP 方式,当集群中存在非临时实例时,采用 CP 模式;Eureka采用 AP 方式;

四、Nacos 配置管理

实际开发中,会有很多的微服务,当需要修改配置的时候,得一个一个地去修改配置文件,非常麻烦,并且修改完成后还需要重启服务。

因此 Nacos 的配置管理,通常用来配置一些经常需要热更新的属性。

1、统一配置管理

我们在 Nacos 写好统一配置后,微服务会自动读取配置,然后注册到 Nacos。

可以简单理解为:service 读取 Nacos 的统一配置文件后,接着读取本地 application 配置文件,相当于将两个配置文件合并

(1)在 public 命名空间中新建一个配置

  • 也可以选择在自己创建的 namespace 中新建;
  • 比如我这里就自己创建有 development 命名空间; 

(2)填写相关信息

  • DataID:由服务名称和开发环境组成,格式为 yaml;
  • 一般是:[服务名称]-[profile].yaml;

(3)编写配置文件

  • 基于前面所述的内容,统一配置显然不是把一个 service 的配置文件的内容全都复制过来;
  • Nacos 内的统一配置一般用来热更新(比如一些开关类型、模板类型的属性);

  • 发布后就出现到配置列表;

2、微服务配置拉取

前面说到,service 启动会先读取 Nacos 的配置文件,那么这里就有个问题,service 要怎么知道 Nacos 配置文件的地址呢?

这里就要引入一个配置文件:bootstrap.yml。它的优先级要比 application.yml 高,可以在  bootstrap.yml 内写上关于 Nacos 的相关信息。

下面我们为 user-service 获取统一配置。

(1)引入 Nacos 的配置管理客户端依赖

  • 哪个 service 模块需要统一配置,哪个模块就引入;
  • 因为前面配置的是 user-service,所以我们引入到 user 模块;

(2)添加 bootstrap.yml 文件

  • 在 userservice 中的 resource 目录添加一个 bootstrap.yml 文件;
  • 这个文件是引导文件,优先级高于 application.yml;
  • 明确地址,明确文件名,借助这些信息,就可以找到 Nacos 统一配置文件;

  • 那么在 application 中,重复的内容就可以删除了;

(3)读取 Nacos 统一配置的内容

  • 如何证明读取到了统一配置文件?
  • 只需要输出其中的内容即可证明;
  • 使用 @Value 注解可以读取配置文件;

  • 我们配置的是日期格式,照抄即可;

(4)启动 application,访问 /user/nowDate

  • 启动的时候只需要启动 user 的 application 即可;
  • 如果启动了其他依赖了 user 的 service,是会报错的;
  • 因为我们没有给其他的 service 编写 bootstrap 配置文件; 

3、配置热更新

只靠前面的配置,是无法让微服务自动读取配置文件的变更内容的。

可以发现,我们修改了配置文件内容之后,调用服务,并没有发生相关变化。

我们需要以下 2 种方法实现热更新:

(1)@RefreshScope + @Value

通常在 SpringCloud 工程中,可以使用 @RefreshScope + @Value 实现配置文件内容变更后的动态刷新。

重新启动服务,访问一次后,再次修改配置文件,再次访问。

(2)使用 @ConfigurationProperties(推荐使用)

  • 首先创建一个配置属性类,类的属性就是配置文件中的属性;
  • @Component:让 Spring 识别,将其作为一个 bean 加入 IOC 中;
  • @Data 提供了 set、get 等方法;

  • 自动注入 Properties 类,get 方法获取属性;

4、多环境配置共享

考虑这么一个问题:

  • 比如测试、开发、生产等环境,他们有着一部分相同的配置信息,如果给每一环境都这么写上配置文件,不仅前期编写麻烦,后期修改也麻烦。

因此我们需要一个任何环境下都能被加载的配置。

(1)Nacos 读取的配置文件

微服务启动时会从 nacos 读取 2 个配置文件:

  • [spring.application.name]-[spring.profiles.active].yaml,例如: user-service-dev.yaml
  • [spring.application.name].yaml,例如: user-service.yaml

无论 profile 如何变化,[spring.application.name].yaml 这个文件一定会加载,因此多环境共享配置可以写入这个文件。

(2)编写共享配置文件

  • ID 取为 [spring.application.name].yaml;
  • 在配置内容中设置一个共享属性值;

(3)测试代码

  • 直接返回一个 properties 属性类,SpringMVC 会将其转为 JSON;

(4)访问 /user/properties

下面开启 2 个不同的端口,运行在不同的环境: 

  • 在 8081 端口启动一个环境为 development 的 application;
  • 可以获取到 2 个属性值;

  • 在 8082 端口启动一个环境为 test 的 application;

  • 可以获取到 1 个属性值,获取不到 development 环境下的 dateformat; 

(5)多种配置文件有相同属性时的优先级

5、Nacos 集群搭建

在企业中,更强调高可用性,Nacos 一定要做成集群的模式,由负载均衡器将请求发送到不同的 Nacos 节点。

https://www.bilibili.com/video/BV1LQ4y127n4/?p=29

6、配置管理问题汇总

(1)无法获取 Nacos 配置文件的内容

如下图所示: 

确定几个方面:

  • 添加了 bootstrap 起步依赖,高版本默认是不添加的;

  • 服务集群和配置文件是同一个 namespace;
  • 配置文件没有写错;

相关文章:

[SpringCloud] Nacos 简介

目录 一、Nacos,启动! 1、安装 Nacos 2、运行 Nacos 3、Nacos 服务注册 二、Nacos 服务多级存储模型 1、服务跨集群分配 2、NacosRule 负载均衡(优先本地) 3、服务实例的权重设置 4、环境隔离 三、Nacos 注册中心细节分…...

TypeScript - 字符串的字面类型

啥是字面量类型 字面量类型,是限制了一个字符串变量的取值范围只能某几个固定字符串中的一个。 我感觉 与枚举类型有异曲同工之妙。 字符串字面量类型有啥用 没啥用。 就是来限制字符串变量不能随便赋值的。 定义一个我看看 让你读书,但是只有四本书可以…...

CRM客户管理系统源码 带移动端APP+H5+小程序

CRM客户管理系统源码 带移动端APPH5小程序 开发环境: thinkphp mysql 功能介绍: 1、 办公管理:审批管理、工作报告、日程管理、办公审批、公告管理 2、 客户管理:我的客户、客户列表、成交客户、行业类别、预查、地区列表、客户状态、客…...

Mac版好用的Git客户端 Fork 免激活

Fork是一款强大的Git客户端软件,在Mac和Windows操作系统上都可以使用。汇集了众多先进的功能和工具,可以帮助用户更方便地管理和控制Git仓库。 Fork的界面简洁直观,易于使用。它提供了许多高级的Git功能,如分支管理、合并、提交、…...

有一个带头结点的单链表L,设计一个算法使其元素递增有序

有一个带头结点的单链表L,设计一个算法使其元素递增有序 代码思路: 我这里懒得搞那个指针了,直接遍历一遍链表,把链表的元素复制到数组arr里面 对数组A进行一下排序,排完之后再把元素复制到L里面。 至于排序你用啥算…...

JAVA将EEE MMM dd HH:mm:ss zzz yyyy日期格式化为yyyy-MM-dd HH:mm:ss形式

1、将EEE MMM dd HH:mm:ss zzz yyyy格式的数据转换成yyyy-MM-dd HH:mm:ss 代码如下 public static void main(String[] args) throws ParseException {String dateStr "Mon Oct 26 15:19:15 CST 2020";DateFormat cstFormate new SimpleDateFormat("yyyy-MM…...

【Qt】文件系统

文章目录 文件系统文件操作案例:显示路径到标题框,显示内容到文本框对文件进行写操作获取文件相关信息 文件系统 Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力,下面是 I/O 设备的类图: QIO…...

PostgreSQL 基础知识

执行环境: psql 1. 创建一个表格 CREATE TABLE customers ( customer_id serial PRIMARY KEY,firstname VARCHAR(100) NOT NULL,lastname VARCHAR(100) NOT NULL,username VARCHAR(50) UNIQUE NOT NULL,password VARCHAR(50) NOT NULL,email VARCHAR(255) UNIQUE …...

基于 ResNet18 架构使用 deformable convolution的车道线检测

下面是一个基于关键点的车道线检测网络的 PyTorch 代码示例,其中使用了 deformable convolution。该代码示例基于 ResNet18 架构,可以根据实际情况进行修改。 首先,需要导入必要的库和模块: import torch import torch.nn as nn…...

C++in/out输入输出流[IO流]

文章目录 1. C语言的输入与输出2.C的IO流2.1流的概念2.2CIO流2.3刷题常见while(cin >> str)重载强制类型转换运算符模拟while(cin >> str) 2.4C标准IO流2.5C文件IO流1.ifstream 1. C语言的输入与输出 C语言用到最频繁的输入输出方式就是scanf ()与printf()。 scanf…...

MongoDB的安装

MongoDB的安装 1、Windows下MongoDB的安装及配置 1.1 下载Mongodb安装包 下载地址: https://www.mongodb.com/try/download http://www.mongodb.org/dl/win32 MongoDB Windows系统64位下载地址:http://www.mongodb.org/dl/win32/x86_64 MongoDB W…...

SQL查询优化---如何查询截取分析

慢查询日志 1、慢查询日志是什么 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。 具体指运行时间超过long_query_time值的…...

vue3基础流程

目录 1. 安装和创建项目 2. 项目结构 3. 主要文件解析 3.1 main.js 3.2 App.vue 4. 组件和Props 5. 事件处理 6. 生命周期钩子 7. Vue 3的Composition API 8. 总结和结论 响应式系统: 组件化: 易于学习: 灵活性: 社…...

Vue 数据绑定 和 数据渲染

目录 一、Vue快速入门 1.简介 : 2.MVVM : 3.准备工作 : 二、数据绑定 1.实例 : 2.验证 : 三、数据渲染 1.单向渲染 : 2.双向渲染 : 一、Vue快速入门 1.简介 : (1) Vue[/vju/],是Vue.js的简称,是一个前端框架,常用于构建前端用户…...

【原创】解决Kotlin无法使用@Slf4j注解的问题

前言 主要还是辟谣之前的网上的用法,当然也会给出最终的使用方法。这可是Kotlin,关Slf4j何事!? 辟谣内容:创建注解来解决这个问题 例如: Target(AnnotationTarget.CLASS) Retention(AnnotationRetentio…...

CDN是如何实现全球节点同步的

当谈到内容交付网络(Content Delivery Network,CDN)加速时,我们必须了解CDN是如何实现全球节点同步的。CDN是一种网络架构,通过将内容分发到全球各地的服务器节点,以降低用户访问网站或应用程序时的延迟和提…...

Centos7 Linux系统下生成https的crt和key证书

linux下生成https的crt和key证书 步骤如下: x509证书一般会用到三类文,key,csr,crt Key 是私用密钥openssl格,通常是rsa算法。 Csr 是证书请求文件,用于申请证书。在制作csr文件的时,必须使…...

性能测试工具——Jmeter的安装【超详细】

目录 1、性能测试工具:JMeter和LoadRunner对比 2、为什么学习JMeter? 3、JMeter环境搭建 3.1、安装JDK 3.2、下载安装JMeter 3.3、配置环境变量 2.4、启动验证JMeter是否安装成功 4、认识JMeter的目录结构 1)bin目录:存放…...

系列三十、Spring AOP vs AspectJ AOP

一、关系 &#xff08;1&#xff09;当在Spring中要使用Aspect、Before、After等注解时&#xff0c;需要添加AspectJ的相关依赖&#xff0c;如下 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.1</…...

面向对象设计模式——策略模式

策略设计模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。该模式定义了一系列算法&#xff0c;将每个算法封装到一个独立的类中&#xff0c;使它们可以相互替换。策略模式使算法独立于客户端而变化&#xff0c;客…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...