Nacos 的介绍和使用

1. Nacos 的介绍和安装

与 Eureka 一样,Nacos 也提供服务注册和服务发现的功能,Nacos 还支持更多元数据的管理, 同时具备配置管理功能,功能更丰富。

1.1. windows 下的安装和启动方式

下载地址:Release 2.2.3 (May 25th, 2023) · alibaba/nacos · GitHub

下载之后进行解压,bin 目录下面是启动和关闭脚本

由于 Nacos 默认的启动方式是集群,所以启动前需要修改配置为单机模式

使用记事本打开 startup.cmd,大概在 26 行左右,把 set MODE="cluster" 改为 set MODE="standalone"

保存之后再双击打开 startup.cmd,运行成功之后可以看出 Nacos 的端口号为 8848

在浏览器中输入 http://127.0.0.1:8848/nacos 就能访问了

在 windows 系统下,如果端口号冲突,可以关闭当前占用 8848 端口号下的进程,也可以修改 conf 目录下的 application.properties 文件中的端口号配置

1.2. Linux 系统下的安装和启动方式

在 Linux 系统中也是同样的操作,把刚刚下载的安装包解压之后也是相同的目录

此时就需要启动 startup.sh 了,以 Ubuntu 系统为例,同样是以单机模式启动,启动 Nacos 服务的命令为:

bash startup.sh -m standalone

如果端口号冲突同样也是两种解决方案

在访问之前还需要确保开放云服务器的端口号,除了 8848 端口号,还需要开启 9848 端口号

2. Nacos 的使用

2.1. 配置导入

和 Eureka 一样,需要在父项目中的 dependencyManagement 下导入下面的依赖,版本可以统一管理

spring-cloud-alibaba 的版本和 spring boot 也是对应的,具体可见官方文档:

版本发布说明-阿里云Spring Cloud Alibaba官网

<properties><spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope>
</dependency>

接下来子项目也需要引入 nacos 的依赖,order-service 在这里作为客户端需要引入发现服务的依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

负载均衡的依赖也需要添加:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

接下来,在官方文档中也给出 Nacos Config 地址的配置格式

spring:cloud:nacos:discovery:serverAddr: 127.0.0.1:8848

应用名称也需要配置一下

spring:application:name: order-service

product-service 也做相同的配置

之后就可以按照和 Eureka 一样的方式进行远程调用了:

public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);String url = "http://product-service/product/" + orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;
}

2.2. 服务下线

如果某个服务出现了问题,为了减少损失,需要把这个服务下线,解决好了之后再进行上线

例如,把端口号为 9091 的服务下线之后,该服务就不会收到请求了

同样的,再点击上线就又可以接收请求了

2.3. 负载均衡

点击编辑就可以修改该服务的权重

但是修改之后再次请求发现,目前 9090 端口和其它端口接收到的请求还是一样的

这是因为 Spring Cloud LoadBalance 组件自身有负载均衡配置的方式,所以不支持 Nacos 的权重属性配置,需要开启 Nacos 的负载均衡策略,让权重生效

#开启nacos负载均衡策略
spring:cloud:loadbalancer:nacos:enabled: true

此时 order-service 作为客户端发起请求,所以需要配置在 order-service 下,之后重启服务,再重新发起请求,发现此时的权重配置已经生效了

可能出现的问题:

在修改权重的时候可能会出现下面的报错

是因为 Nacos 采用 raft 算法来计算 Leader,并且会记录前一次启动的集群地址,当服务器 IP 改变时会导致 raft 记录的集群地址失效,导致选 Leader 出现问题(网络环境发生变化时,IP 地址也会发生变化)

解决办法就是删除 Nacos 根目录下 data 文件夹下的 protocol 文件夹

2.4. 配置同集群优先访问

微服务访问时,应该同一个集群优先访问的,例如同一个机房的电脑是在同一个局域网下的,访问速度会快一点

配置格式如下:

spring:cloud:nacos:discovery:server-addr: cluster-name: BJ #集群名称: 上海集群

把 order-service 和 端口号为 9090 的 product-service 的集群都设置为北京:

9091 和 9092 服务集群的配置方式:

之后再重启服务,集群就配置成功了

此时再发起请求,由于 order-service 的集群为 BJ,那么会优先访问集群为 BJ 的 product-service 了:

如果把 9090 的服务下线,那么就会访问 SH 的集群了

2.5. 健康检查

Nacos 提供了两种健康检查机制,一种是客户端主动上报,另一种是服务端反向探测

  1. 客户端主动上报:客户端会以心跳上报的形式向 Nacos 告知自身健康状态。若 Nacos 在一定时间内未收到客户端的心跳报告,便会将该实例置为不健康状态。若继续在超过另一段更长的时间后仍未收到报告,就会将实例从注册列表中删除,以此来确保注册列表中的实例都是活跃可用的。
  2. 服务端反向探测:Nacos 服务器主动对客户端进行健康状态探测,若探测失败,实例会被标记为不健康。这样在进行服务调用时,负载均衡器等组件就不会将请求分发到这些不健康的实例上,以保障服务质量,但一般不会立即删除该实例,以便在实例恢复健康后可继续使用。

Nacos 的服务实例(注册的节点)又分为临时实例和非临时实例

临时实例:如果实例宕机超过一定时间,会从服务列表去除

非临时实例:如果实例宕机,不会从服务列表去除

Nacos 对临时实例采取的是客户端主动上报的机制,对于非临时实例,采取服务器端反向探测机制,之前创建的服务都是非临时的,可以通过下面的配置来设置非临时实例

spring:cloud:nacos:discovery:ephemeral: false # 设置为⾮临时实例

把 order-service 设置为非临时实例之后,Nacos 检测到 order-service 状态异常,就会把它的健康状态设置为 false

在设置实例类型的时候可能会出现报错:

这是因为 Nacos 会记录每一个服务实例的 IP 和端口号,当发现 IP 和端口号都没有发生变化时,Nacos 不允许一个服务实例类型发生变化

解决办法就是先停止 Nacos 的服务,然后删除 Nacos 目录下 /data/protocol/raft 中的信息,再重启服务

2.6. 环境隔离

Nacos 提供了 namespace(命名空间)来实现环境的隔离,不同的命名空间的服务不可见,通过以下方式在 Nacos 上创建命名空间

spring:cloud:nacos:discovery:namespace: 51152a13-7911-49e3-bbdc-16fd5670a257

通过命名空间 ID 来配置属于哪个环境

此时只有 order-service 在 dev 环境下,所以再去访问 product-service 是会报错的,处于同一个环境下才能访问到

3. Nacos 配置中心

除了注册中心之外,Nacos 还是一个配置中心,具备配置管理的功能,当前项目的配置都在代码中,就会存在一些问题:

  1. 配置文件修改时,服务需要重新部署,在微服务架构中,一个服务有很多个实例,一个一个的部署比较麻烦,并且也容易出错
  2. 多人开发时,配置文件可能需要经常修改,使用同一个配置文件容易出现冲突

配置中心就是对这些配置项进行统一管理,通过配置中心,可以集中查看,修改和删除配置,不用再逐个修改配置文件了

先分别创建 public 和 dev 环境下的配置

之后在 product-service 导入依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

微服务启动前需要获取 Nacos 中的配置,并与 application.tml 配置合并,需要使用 bootstrap.properties 或者 bootstrap.yml 配置文件来配置 Nacos Server 地址

spring:application:name: product-servicecloud:nacos:config:server-addr: 127.0.0.1:8848

接下来尝试获取 Nacos 中的配置内容

@RestController
public class NacosController {@Value("${nacos.config}")private String nacosConfig;@RequestMapping("/getConfig")public String getConfig() {return "从nacos获取配置项nacos.config: " + nacosConfig;}
}

${nacos.config} 要和配置中的配置项保持一致

不过此时如果修改 Nacos 配置中心的配置,再次获取还是修改前的,如果要实现实时更新还需要加上 @RefreshScope注解

Nacos 配置中心的命名空间和注册中心的命名空间是分别设置的,默认都是 public,所以 bootstrap.yml 中也需要配置一下命名空间

配置之后再访问就是对应配置好的命名空间的配置:

接下来看关于 Data ID 的介绍

在开始之前配置的是 product-service,完整的格式应该是:

刚开始添加配置时就选择的配置文件类型为 properties,所以这里可以不用再配置了,接下来把 active 配置为 dev

在日志中可以看出是监听了三个类型的文件配置,如果这三个类型配置都配置上的话它们的一个优先级如下;

4. 部署到云服务器

这次部署和之前有些不一样,由于 product-service 中多了一个 bootstrap.yml 配置文件,其中已经配置好了 profiles.active,所以可以直接改成 @profile.name@,然后只需要分别配置 dev 和 prod 下的配置

除此之外还需要加上以下配置,使用过滤功能将环境相关的信息注入到配置文件中

5. Nacos 和 Eureka 的区别

共同点:都支持服务注册和服务拉取

区别:

功能上:Nacos 提供了更丰富的功能,除了服务发现和注册之外,还包括配置管理(配置中心)、流量管理、DNS服务等。这使得Nacos可以作为微服务架构中的一个更全面的解决方案。Eureka 主要专注于服务发现和注册,没有Nacos那么丰富的功能。

CAP 理论:Eureka 遵循 AP(可用性-分区容错性)原则,Nacos 可以灵活地在 AP 和 CP(一致性-分区容错性)模式之间切换,默认情况下是 AP 模式,也可以根据需要配置为 CP 模式。

服务发现:Eureka 采用基于拉(Pull)模式的服务发现机制。Eureka客户端(Eureka Client)会定期从Eureka服务器(Eureka Server)拉取服务信息,并且会缓存这些信息,默认每30秒更新一次。Nacos 采用基于推(Push)模式的服务发现机制。当服务列表发生变化时,Nacos服务器会实时推送这些变化给所有订阅了该服务的客户端,同时服务端和客户端之间会保持心跳连接,以确保服务信息的实时性和准确性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【零基础到精通】小白如何自学网络安全

小白人群想学网安但是不知道从哪入手&#xff1f;一篇文章告诉你如何在4个月内吃透网安课程&#xff0c;掌握网安技术 一、基础阶段 1.了解网安相关基础知识 了解中华人民共和国网络安全法、熟知网络安全的相关概念&#xff1a;包括信息安全、风险管理、网络攻防原理、认证与…

架构规划之任务边界划分过程中承接分配

架构师在边界划分的过程中需要做什么事情呢&#xff1f;接下来&#xff0c;我们会讨论一些关于任务分配的 基础假设&#xff0c;以及由这些基础假设而带来的决策路径。 所谓任务边界划分&#xff0c;就是判定某个任务在多个承接方中&#xff0c;应该归属到哪个承接方的过程。…

如可安装部署haproxy+keeyalived高可用集群

第一步&#xff0c;环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip&#xff1a;192..168.244.101 Vip&#xff1a;192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…

MySQL常用数据类型和表的操作

文章目录 (一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 (二)表的操作1查看指定库中所有表2.创建表3.查看表结构和查看表的创建语句4.修改表5.删除表 (三)总代码 (一)常用数据类型 1.数值类 BIT([M]) 大小:bit M表示每个数的位数&#xff0c;取值范围为1~64,若…

DeepSeekMoE:迈向混合专家语言模型的终极专业化

一、结论写在前面 论文提出了MoE语言模型的DeepSeekMoE架构&#xff0c;目的是实现终极的专家专业化(expert specialization)。通过细粒度的专家分割和共享专家隔离&#xff0c;DeepSeekMoE相比主流的MoE架构实现了显著更高的专家专业化和性能。从较小的2B参数规模开始&#x…

寻迹传感器模块使用说明

产品用途&#xff1a; 1、电度表脉冲数据采样 2、传真机碎纸机纸张检测 3、障碍检测 4、黑白线检测 产品介绍: 1、采用 TCRT5000 红外反射传感器 2、检测反射距离&#xff1a;1mm~25mm 适用 3、比较器输出&#xff0c;信号干净&#xff0c;波形好&#xff0c;驱…

java项目验证码登录

1.依赖 导入hutool工具包用于创建验证码 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.2</version></dependency> 2.测试 生成一个验证码图片&#xff08;生成的图片浏览器可…

Baklib探讨如何通过内容中台提升组织敏捷性与市场竞争力

内容概要 在数字化转型的浪潮中&#xff0c;内容中台已经成为企业提升市场响应速度和竞争力的关键所在。内容中台不仅是信息处理的集结地&#xff0c;更是促进资源高效整合和灵活应用的重要平台。通过构建一个高效的内容中台架构&#xff0c;企业能够更好地应对不断变化的市场…

Java基础——分层解耦——IOC和DI入门

目录 三层架构 Controller Service Dao ​编辑 调用过程 面向接口编程 分层解耦 耦合 内聚 软件设计原则 控制反转 依赖注入 Bean对象 如何将类产生的对象交给IOC容器管理&#xff1f; 容器怎样才能提供依赖的bean对象呢&#xff1f; 三层架构 Controller 控制…

Spring中@Conditional注解详解:条件装配的终极指南

一、为什么要用条件装配&#xff1f; 在实际开发中&#xff0c;我们经常需要根据不同的运行环境、配置参数或依赖情况动态决定是否注册某个Bean。例如&#xff1a; 开发环境使用内存数据库&#xff0c;生产环境连接真实数据库 当存在某个类时才启用特定功能 根据配置文件开关…

Redis代金卷(优惠卷)秒杀案例-多应用版

Redis代金卷(优惠卷)秒杀案例-单应用版-CSDN博客 上面这种方案,在多应用时候会出现问题,原因是你通过用户ID加锁 但是在多应用情况下,会出现两个应用的用户都有机会进去 让多个JVM使用同一把锁 这样就需要使用分布式锁 每个JVM都会有一个锁监视器,多个JVM就会有多个锁监视器…

ros 发布Topic

1、确定话题名称和消息类型 自定义话题名称&#xff0c;消息类型根据发送消息需要从std_msgs中查找确定 2、在main函数中通过NodeHander发布话题 // 创建一个NodeHandle对象&#xff0c;用于与ROS系统进行交互ros::NodeHandle nh;// 创建一个Publisher对象&#xff0c;用于发…

86.(2)攻防世界 WEB PHP2

之前做过&#xff0c;回顾一遍&#xff0c;详解见下面这篇博客 29.攻防世界PHP2-CSDN博客 既然是代码审计题目&#xff0c;打开后又不显示代码&#xff0c;肯定在文件里 <?php // 首先检查通过 GET 请求传递的名为 "id" 的参数值是否严格等于字符串 "admi…

毕业设计:基于深度学习的高压线周边障碍物自动识别与监测系统

目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 卷积神经网络 1.2 目标检测算法 1.3 注意力机制 二、 数据集 2.1 数据采集 2.2 数据标注 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 3.2 结果分析 最后 前言 &#x1f4c5;大四是整个大学…

AI取代人类?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

刷题记录 动态规划-7: 63. 不同路径 II

题目&#xff1a;63. 不同路径 II 难度&#xff1a;中等 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]&#xff09;。机器人尝试移动到 右下角&#xff08;即 grid[m - 1][n - 1]&#xff09;。机器人每次只能向下或者向右移动一步。…

深度求索DeepSeek横空出世

真正的强者从来不是无所不能&#xff0c;而是尽我所能。多少有关输赢胜负的缠斗&#xff0c;都是直面本心的搏击。所有令人骄傲振奋的突破和成就&#xff0c;看似云淡风轻寥寥数语&#xff0c;背后都是数不尽的焚膏继晷、汗流浃背。每一次何去何从的困惑&#xff0c;都可能通向…

51c视觉~CV~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241694 一、CV创建自定义图像滤镜 热图滤镜 这组滤镜提供了各种不同的艺术和风格化光学图像捕捉方法。例如&#xff0c;热滤镜会将图像转换为“热图”&#xff0c;而卡通滤镜则提供生动的图像&#xff0c;这些图像看起来…

【论文复现】粘菌算法在最优经济排放调度中的发展与应用

目录 1.摘要2.黏菌算法SMA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种改进粘菌算法&#xff08;ISMA&#xff09;&#xff0c;并将其应用于考虑阀点效应的单目标和双目标经济与排放调度&#xff08;EED&#xff09;问题。为提升传统粘菌算法&#xf…

C++基础(2)

目录 1. 引用 1.1 引用的概念和定义 1.2 引用的特性 1.3 引用的使用 2. 常引用 3. 指针和引用的关系 4. 内联函数inline 5. nullptr 1. 引用 1.1 引用的概念和定义 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开…