Springcloud-----Nacos

一、Nacos的安装


Nacos是阿里推出的一种注册中心组件,并且已经开源,目前是国内最为流行的注册中心组件。下面我们来了解一下如何安装并启动Nacos。

Nacos是一个独立的项目,我们可以去GitHub上下载其压缩包来使用,地址如下:

https://github.com/alibaba/nacos/releases/tag/2.2.3

下载完成之后解压缩,打开Nacos下的bin文件夹,我们可以看到下面这四个文件 

我们可以依据自己机器的环境选择要运行哪个启动脚本,但需要注意的是,Nacos默认是集群启动,如果你当前是单机环境进行启动,运行脚本会闪退。如果我们想进行单机启动,需要修改一下相关配置。下面,我们来了解一下Windows环境下修改的方式:

首先我们用记事本打开start.cmd文件,找到下面这行配置

将cluster改为standalone后保存退出,此时再运行启动脚本,就能正常启动Nacos了

并且nacos默认是使用Nacos端口,如果我们想修改这个端口,需要打开{Nacos文件夹所在目录}/conf/applictaion.preperties文件,并将下面这行配置代码的端口改为自己想要设置的端口

 需要注意的是端口号必须是未被使用的,否则启动时会因为端口已被占用而启动失败。

成功启动Nacos后,我们可以通过浏览器来访问{Nacos所在机器Ip} :{Nacos端口号}/nacos,用来获取一个nacos的可视化管理页面。

Widows

在命令提示符中输入netstat -ano | findstr :<端口号>

LInux 

netstat -ano | grep 端口号

成功启动Nacos后,我们可以通过浏览器来访问{Nacos所在机器Ip} :{Nacos端口号}/nacos,用来获取一个nacos的可视化管理页面。

二、Nacos的使用

下面我们来了解一下如何使用Nacos。

服务注册

将服务注册到Nacos,我们需要在各服务父工程中的pom文件中的<DependeceMannager>中声明Spring Cloud Alibaba的相关依赖, 需要注意的是其版本需要与你当前的spring boot版本进行兼容,两者之间的兼容关系大家可以去官网上查询。然后在各服务的pom文件中引入Nacos的相关依赖,具体可以参考下面的代码

父工程里面引入

           <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>

子工程中引入

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

然后我们需要去设置Nacos的相关配置

 cloud:nacos:discovery:server-addr: 182.92.242.181:8848

配置好之后我们就可以启动服务了,成功启动后就能在前面的Nacos的服务列表中看到我们注册的服务了

咱们这里直接使用linux云服务器上面搭建Nacos

Nacos对比Eureka,Nacos的功能要更为丰富,下面我们来具体一下。

权重

Nacos可以为服务分配权重,权重越高的服务,在进行负载均衡时被选中的概率就越大。在Nacos提供的网页中,我们可以去设置服务的权重。这里我们先启动三个product-service服务(由于机器不足,都部署到一台机器的不同端口上了),并注册到Nacos中

点开服务最右边的详情页,可以看到具体的三个服务实例,然后在点击实例右边的编辑按钮

在弹出的页面里我们就可以自己去编辑权重的大小了.这里我们把9092端口的服务权重设置成1,其它的设置为0.1

设置完成之后,权重并不会立马生效,因为这里权重的配置可以说算是一种负载均衡策略,而我们本地服务的负载均衡策略使用的是LoadBalance默认的轮询策略,因此要想让权重生效,我们需要通过修改配置文件将负载均衡策略调整为Nacos的负载均衡策略,具体配置参考下面的代码:

spring:cloud:loadbalancer:nacos:enabled: true

配置完成后,Nacos的负载均衡策略就生效了,我们刚才配置的权重也随之生效了。

下面 我们来访问一下order-service的接口(这个接口会远程调用product-service,并在调用的服务中打印一条信息)。

打印的结果如下:

可以发现9092端口的product-service服务被调用的次数要远远多于另外两个服务。

服务下线

在Nacos中可以让一个服务下线,一个服务下线后,在其它服务进行服务发现时,就不会在获取这个已下线服务的信息,也就不再会被远程调用到。在Nacos中下线一个服务非常简单,只需要在Nacos网页服务列表中找到要下线的服务,打开详情页,选择要下线是实例进行下线即可

 在这里,我们下线9092端口的服务,此时我们再多次访问order-service的接口

可以发现9092端口的服务一次都没有被调用了。然后我们再让其上线看看,还是再刚刚下线的地方上线,再进行几次接口访问,可以发现,9092端口的服务又被调用到了

同集群优先

 在进行服务调用时,服务的提供者和服务的调用者如果在同一个机房或者同一个地区会比在不同机房不同地区受到网络的影响要小很多,因为网络的延迟通常是与距离成正比的。因此Nacos提供了一种同集群优先的负载均衡策略,在这种策略下,Nacos会把不同服务按地区分为不同集群,并在进行服务调用时,优先调用同一集群的服务,例如上海集群中的服务在进行服务调用时,会优先调用上海集群中的服务。下面我们来具体了解一下如何使用同集群由先:

首先我们需要在服务的配置文件中设置服务集群名称,具体可以参考下面的代码:

然后启动服务,当前服务就被设置为在上海集群中了。

 接下来我们通过添加VM opition的方式将我们的9091.9092端口的product-service的服务设置为在上海集群,将9090设置为在北京集群,具体的设置方式可以参考下图一个一个设置

此时我们再多次访问order-service的接口(SH集群),控制台的信息如下:

9091(SH集群)9092(SH)

9090(BJ)

可以发现与order-service在同一集群中的9091.9092服务都有被调用,而不同集群中的9090则一次没有被调用。 但也并不是说完全不会调用其它集群中 的服务,如果调用的服务在当前集群中没有,也是会去调用其它集群中的服务的。例如,我们把9091.9092下线,再访问几次接口

通过控制台可以发现9090也被调用到了

健康检查

Nacos会对注册的服务进行健康检查,具体来说就是去检查看看服务还能不能被访问到。Nacos健康检查的机制有两种,具体如下:

  • 客户端主动上报:服务主动向Nacos发送心跳来告知健康状态,一般5s上报一次,如果超过15s未上报,该服务会被标记为不健康状态,超过30s则会被直接删除。
  • 服务端反向探测 :Nacos主动探知服务进行健康检查,间隔20s探测一次,如果检查失败,则会被标记为不健康状态,并不会直接删除

Nacos具体使用哪种机制依据当前服务实例的类型。下面 ,我们来了解一下服务实例的类型。

服务实例类型

在Nacos中,服务实例有两种类型,一种是临时实例,一种是非临时实例。临时实例在处于非健康状态时,会被删除,而非临时实例在非健康状态时则不会被删除,而是会被标记为非健康。因此,临时实例使用客户端主动上报的健康检查机制,而非临时实例则是使用服务端反向探侧。

我们可以在服务的配置文件中来配置当前服务是临时实例还是非临时实例,具体配置参考下面的代码

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

需要注意的是Nacos服务实例的类型一旦确定就不能再更改了,因为Nacos会保存每一个服务对应的实例类型,如果服务以不同于先前的实例类型启动(修改了ephemeral配置再启动),就会报错,解决办法有两种,一种是直接重启Nacos,一种则则是删除nacos目录下/data/protocol/raft这个文夹这里面报存的服务的元数据。

否则会报错

注意:在删除raft/之前需要停止nacos,kill掉nacos进程

接下来我们将product-service全设置成临时实例,oreder-servie设为非临时实例,Nacos网页中的显示如下:

此时,如果我们终止一个product-service,再次查看Nacos网页可以发现,product-service只剩下两个了

而我们终止order-service,再次查看网页,可以发现order-service仍然还在,只是健康状态为false了

环境隔离

在企业中,一个服务的开发通常会经历三个环境,开发环境(dev) ,测试环境(test),生产环境(prod)。处于不同环境下的服务之间是不能够进行调用的,因此要对不同环境下的服务进行环境隔离。

在Nacos中通过Namespace(命名空间)来实现环境隔离,默认情况下所有注册的服务都位于public命名空间中,我们可以自己创建一个命名空间,具体流程如下:

打开Nacos网页,选择命名空间

点击新建命名空间

在弹出来的页面就可以自定义创建我们的命名空间了

这里我们创建两个命名空间,一个dev,一个prod 

接下来我们需要将我们的服务分配到这些命名空间中,具体为设置以下配置:

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

 这里namespace的值为Nacos自动生成的命名空间id,可以去前面的命名空间页面查看。

接下来我们将9091.9092的product-service服务和order-service放到dev命名空间中,剩下的9090端口的product-service放到prod服务中

    此时再多次调用order-service的接口,可以发现和order-service 同样位于dev命名空间中的9091.9092端口的product-service服务被调用到,而位于不同命名空间的9090则一次都没用被调用到。

    配置中心

    Nacos除了上面的功能以外,还能作为配置中心进行使用。什么是配置中心呢?我们来了解一下。

    在微服务项目中,同一个服务通常会采取集群模式部署到多台主机上,当服务的配置需要修改时,如果一台一台机器去修改,就会显得十分的麻烦,如果有一个统一的组件能够让我们在组件上修改配置,并将修改的配置信息推送到各个相关的服务主机上,那就会高效很多,而配置中心就是这样一个组件。Nacos中就提供了配置中心的功能。

    我们可以在Nacos中添加配置,添加的具体步骤如下

    打开Nacos中的配置列表页,点击创建配置

    这里的DataId暂且设置为服务名称,配置格式选择为properties,命名空间为我们前面的dev

     设置完成后点击发布,就能看到我们刚才设置的配置了。

    下面我们来看一下如何在服务端获取Nacos中的配置。

    首先我们需要在服务中引入Nacos配置中心的依赖,具体如下:

    <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>

    然后我们需要再创建一个bootstrap配置文件,这个文件会在appliaction前缀的配置文件被加载之前被加载,在这个文件中,我们需要去配置Nacos作为配置中心的相关信息。在服务启动前,会先去读取bootstrap前缀的配置文件,然后根据里面的配置内容去Nacos中获取Nacos中的配置并整合到我们的application前缀的配置文件中。

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

    这里主要配置了两个信息一个是服务名称,一个则是Nacos配置中心地址,这个地址与Nacos注册中心的地址配置是隔离的。

    下面我们通过@Value去获取一下这个配置信息,代码如下

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

    在Nacos中配置中心也是有命名空间的,在前面创建配置时也能看到当前创建的配置位于哪个命名空间中,因此我们在去获取配置时,需要去指定命名空间,如果不指定,就只能从默认的命名空间(public)中去获取配置。指定命名空间的配置如下(在bootstrap中配置):

    spring:application:name: product-servicecloud:nacos:config:server-addr: 182.92.242.181:8848namespace: 8ac80256-2b42-4e3a-b085-b4cb8dcca495

    当我们修改Nacos配置时候,按理说应该是实时更新的,但是我们发现没有,这是因为我们得添加一个注解

    在获取配置时,并不是命名空间中创建的所有配置文件都会去获取,只会去获取对应DataId的配置,这个Dataid有固定的格式

    ${prefix}-${spring.profiles.active}.${file-extension}  
    • 其中prefix默认为服务名称,也可以通过 spring.cloud.nacos.config.prefix来配置。
    • spring.profiles.active为服务当前所处环境,可以通过spring.profiles.active配置项配置,这部分内容可以为空,为空时前面的‘-’会消除
    • file-extension为读取的配置格式,可以不设置,不设置为默认的properties,可以通过spring.cloud.nacos.config.file-extension配置项来配置,不过只支持yaml何properties两种

    需要注意的是上面的配置项在设置时,只能在bootstrap前缀的配置文件中设置

    服务在去Nacos中获取配置时,会获取下面这三种DataId的配置内容

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

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

    相关文章

    腾讯云重保流程详解:从预案到复盘的全周期安全防护

    摘要 腾讯云针对国家级重大活动&#xff08;如进博会、冬奥会等&#xff09;提供的网络安全保障服务&#xff08;重保&#xff09;是一套系统化的主动防御体系。本文从“事前准备”“事中响应”“事后复盘”三个核心阶段出发&#xff0c;结合民生银行等典型用户的实战案例&…

    单表查询-group by rollup优化

    1、group by rollup基本用法 我们有时候在项目上看到group by rollup用法&#xff0c;其实就是对group by分组进行合计。 下面看一下例子 select count(1),c3 from t1 group by rollup(c3); 计划从计划中解读亦是如此&#xff0c;另外可以从结果上进行分析第21行的count其实就是…

    云网络(参考自腾讯云计算工程师认证)

    计算机网络&#xff1a;OSI七层模型&#xff1a; 应用层&#xff1a;负责处理网络应用程序之间的通信、 表示层&#xff1a;负责数据的格式化和加密、 会话层&#xff1a;负责建立、管理和终止会话、 传输层&#xff1a;负责端到端的可靠传输、 网络层&#xff1a;负责数据的路…

    【MLLM】多模态理解Ovis2.5模型和训练流程(更新中)

    note 模型架构&#xff1a;延续 Ovis 系列创新的结构化嵌入对齐设计。 Ovis2.5 由三大组件构成&#xff1a;动态分辨率 ViT 高效提取视觉特征&#xff0c;Ovis 视觉词表模块实现视觉与文本嵌入的结构对齐&#xff0c;最后由强大的 Qwen3 作为语言基座&#xff0c;处理多模态嵌…

    mysql中的通用语法及分类

    MySQL 是一种广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;其语法设计遵循 SQL 标准&#xff0c;但也有一些特有的扩展。以下从​​通用语法规范​​和​​SQL 语句分类​​两个维度系统梳理 MySQL 的核心语法体系。一、MySQL 通用语法规范通用语法…

    Linux-搭建NFS服务器

    Linux-搭建NFS服务器前言一、网络配置二、在nfs服务器上安装nfs-utils软件包三、设置共享目录四、挂载NFS共享目录前言 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09; 是一种分布式文件系统协议&#xff0c;最初由 Sun Microsystems 于 1984 年开发…

    eslasticsearch+ik分词器+kibana

    eslasticsearch 下载地址:https://www.elastic.co/cn/downloads/past-releases ik分词器 下载地址&#xff1a;https://release.infinilabs.com/analysis-ik/stable/ kibana 下载地址&#xff1a;https://www.elastic.co/cn/downloads/kibana 1、解压安装包 将下载的 zi…

    SOME/IP-SD IPv4组播的通信参数由谁指定?

    <摘要> 在AUTOSAR SOME/IP-SD协议中&#xff0c;组播通信参数&#xff08;地址、协议、端口&#xff09;的协商机制。其核心在于明确规定了组播流的发布者和接收者之间由谁来“指定”通信路径&#xff0c;从而确保双方能够成功会合&#xff0c;实现高效的一对多事件分发。…

    新手首次操作SEO核心要点

    内容概要 初次接触SEO的新手朋友们&#xff0c;面对浩瀚的网络优化知识&#xff0c;难免感到无从下手。这份2025年的零基础入门指南&#xff0c;正是为你们量身打造。它清晰地规划了学习路径&#xff0c;从最基础的网站搭建注意事项开始&#xff0c;帮助你避开常见陷阱&#xf…

    AI、人工智能基础: 模型剪枝的概念与实践(PyTorch版)

    胡说八道: 各位观众老爷&#xff0c;大家好&#xff0c;我是诗人啊_&#xff0c;今天和各位分享模型剪枝的相关知识和操作&#xff0c;一文速通&#xff5e; &#xff08;屏幕前的你&#xff0c;帅气低调有内涵&#xff0c;美丽大方很优雅… 所以&#xff0c;求个点赞、收藏、关…

    Kubernetes 服务发现与健康检查详解

    Kubernetes 提供了多种机制来管理服务发现、负载均衡和容器健康状态监控。本文将围绕以下几个方面展开&#xff1a;Service 类型&#xff1a;ClusterIP、NodePort、Headless Service、LoadBalancer&#xff08;MetallB&#xff09;Ingress 的实现原理健康检查探针&#xff1a;L…

    如何规划一年、三年、五年的IP发展路线图?

    ‍在知识付费领域&#xff0c;规划 IP 发展路线&#xff0c;需要从短期、中期、长期不同阶段&#xff0c;系统地布局内容、运营与商业变现&#xff0c;逐步提升 IP 影响力与商业价值。一年目标&#xff1a;立足定位&#xff0c;夯实基础精准定位&#xff0c;打磨内容利用创客匠…

    C++从入门到实战(二十)详细讲解C++List的使用及模拟实现

    C从入门到实战&#xff08;二十&#xff09;C List的使用及模拟实现前言一、什么是List1.1 List的核心特性1.2 List与vector的核心差异1.3 List的构造、拷贝构造与析构1.3.1 常用构造函数1.3.2 析构函数1.4 List的迭代器1.4.1 迭代器类型与用法示例1&#xff1a;正向迭代器遍历…

    人工智能学习:机器学习相关面试题(一)

    1、 机器学习中特征的理解 def: 特征选择和降维 特征选择&#xff1a;原有特征选择出子集 &#xff0c;不改变原来的特征空间 降维&#xff1a;将原有的特征重组成为包含信息更多的特征&#xff0c; 改变了原有的特征空间降维的主要方法 Principal Component Analysis (主成…

    亚马逊巴西战略升级:物流网络重构背后的生态革新与技术赋能之路

    在全球电商版图中&#xff0c;拉美市场正以惊人的增长速度成为新的战略高地&#xff0c;而巴西作为其中的核心市场&#xff0c;凭借庞大的人口基数、高速发展的数字经济以及不断提升的消费能力&#xff0c;吸引着众多电商巨头争相布局。近日&#xff0c;亚马逊宣布将于2025年底…

    PS自由变换

    自由变换 自由变换用来对图层、选区、路径或像素内容进行灵活的像素调整。可以进行缩放、旋转、扭曲等多种操作。快捷键&#xff1a;CtrlT&#xff0c;操作完成后使用Enter键可以确认变换自由变换过程中如果出现失误&#xff0c;可以按ESC退出&#xff1b;满意可以按enter确定。…

    【K8s】整体认识K8s之存储--volume

    为什么要用volume&#xff1f;首先。容器崩溃或重启时&#xff0c;所有的数据都会丢失&#xff0c;我们可以把数据保存到容器的外部&#xff0c;比如硬盘nfs&#xff0c;这样&#xff0c;即使容器没了&#xff0c;数据还在&#xff1b;第二就是容器之间是隔离的。我们如果想共享…

    flutter工程

    安装flutter 在VSCode中安装flutter extension、flutter组件 国内源下载flutter 3.35.2的SDK&#xff0c;安装&#xff0c;官网下载不了 将flutter安装目录加入环境变量中 D:\program\flutter_sdk\flutter\bin 执行 C:\Windows\System32>flutter --version Flutter 3.35.2 •…

    C/C++ 高阶数据结构 —— 二叉搜索树(二叉排序树)

    ​ &#x1f381;个人主页&#xff1a;工藤新一 ​ &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; ​ &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 ​ &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章…

    stm32F4挂载emmc以及重定义printf

    1.Cubemx SDIO USART 使用串口输出调试信息 FATFS Clock Configuration 防止堆栈溢出 2.Keil5 新建自定义文件夹及文件 将文件夹添加进工程 新建.c与.h文件&#xff0c;保存到自定义的文件夹&#xff0c;并添加到工程中 bsp_emmc.c #include "bsp_emmc.h" #include…