Nacos是SpringCloud的一个功能非常强大的组件,想比eureka的功能更加丰富
官方的nacos简介
Nacos(全称:Naming and Configuration Service)是一个开源的动态服务发现、配置管理和服务管理平台。它由阿里巴巴集团开发并贡献给开源社区,旨在帮助开发者更好地构建和管理微服务架构。
Nacos提供了以下核心功能:
-
服务发现和注册:Nacos充当了服务注册中心的角色,允许开发者方便地注册、发现和管理微服务实例。它使用了一致性哈希算法来实现服务的负载均衡,并提供了多种方式来进行服务的发现和调用。
-
动态配置管理:Nacos可以集中管理应用程序的配置信息。开发者可以使用Nacos动态地更新和发布配置,而无需重新部署或重启应用程序。这样可以提高配置的灵活性和可维护性,同时减少了配置管理的复杂性。
-
服务健康监测:Nacos可以监测和报告微服务的健康状态。它可以定期进行心跳检查,并通过心跳数据来判断服务是否可用。当某个服务不可用时,Nacos可以及时发出警报,并协助进行故障排查和恢复。
-
动态路由和负载均衡:Nacos提供了动态路由和负载均衡的功能,使开发者可以灵活地管理和调整请求的路由策略。它支持基于权重、一致性哈希和最少活跃数等多种负载均衡算法,同时也可以与其他开源组件(如Nginx和OpenResty)集成。
总而言之,Nacos提供了一套完整的微服务基础设施,帮助开发者更好地构建、管理和调整微服务架构。它具有开源、易用、高可用和可扩展等特点,在业界得到了广泛的应用和认可。
Nacos安装
Windows安装
- 下载安装包
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:Releases · alibaba/nacos · GitHub
- 解压(任意的非中文目录)
- 端口配置
- Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,进入nacos的conf目录中进行修改
- 启动(进入bin目录)
打开cmd执行命令:
startup.cmd -m standalone
- 访问(http://127.0.0.1:8848/nacos )账号密码都是nacos
Linux安装
- 安装jdk
在java官网可以下载jdk的jar包,将下载好的jar包上传到某个目录(例如/user/local/)
解压后重命名为java:
tar -xvf jdk-8u144-linux-x64.tar.gz
配置环境变量:
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
设置环境变量:
source /etc/profile
- 上传安装包
上传到Linux服务器的某个目录(例如:/user/local/src)
- 解压
命令解压压缩安装包:
tar -xvf nacos-server-1.4.1.tar.gz
删除安装包:
rm -rf nacos-server-1.4.1.tar.gz
- 端口配置
- 启动
sh startup.sh -m standalone
SpringCloud引入nacos
1.在父工程中引入对应的依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2.注释掉原来AB服务中的eureka依赖
3.在nacos客户端引入相应的依赖:
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.修改A、B服务中的yml文件,注释掉eureka地址,添加nacos地址
spring:
cloud:
nacos:
server-addr: nacos:8848 # nacos服务地址
总结:
1.Nacos服务搭建
- 下载安装包
- 解压
- 在bin目录下运行指令:startup.cmd -m standalone
2.Nacos服务注册或发现
- 引入nacos.discovery依赖
- 配置nacos地址spring.cloud.nacos.server-addr
Nacos服务分级存储模型
服务集群属性
1.修改对应服务的yml文件,添加如下内容
spring:
cloud:
nacos:
server-addr: nacos:8848 # nacos服务地址
discovery:
cluster-name:SM #配置集群名称,也就是说机房的位置
总结:
1.Nacos服务分级存储模型
- 一级是服务
- 二级是集群
- 三级是实例
2.如何设置实例的集群属性
- 修改对应的yml文件,添加spring.cloud.nacos.discovery.cluster-name属性即可
在我们生产的过程中,负载均衡肯定是优先找离自己最近的服务(相同的集群),那么我们在Spring中该如何配置去优先寻找与自己同集群的服务呢?
根据集群进行负载均衡
1.修改A服务中的yml文件,设置集群为SM
spring:
cloud:
nacos:
server-addr: nacos:8848 # nacos服务地址
discovery:
cluster-name: SM
2.在A服务中设置负载均衡的IRule为NacosRule,这个规则会优先找与自己同集群的服务
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRul
根据权重进行负载均衡
在实际的应用时,我们会遇到这样的情况,有些服务器设备差,我们希望它承担用户请求少一点,有的服务器设备好,我们希望它承担的用户请求多一点
Nacos支持权重配置来控制访问频率,权重越大则访问频率越高[0,1]
环境隔离-namespace
Nacos中服务存储和数据存储的最外层都是一个名为namespqce的东西,用来做最外层隔离
在Nacos控制台可以创建namespace,用来隔离不同的环境(命名空间->新建命名空间)
cluster-name: SM
discovery:
#命名空间ID
namespace: 4d6ce343-9e1b-44df-a90f-2cf2b6b3d177 # dev环境
每个隔离环境都有唯一的id 不同的环境下的服务互相不可见
Nacos注册中心原理
我们可以设置该服务是否是临时实例:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 是否是临时实例
临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会
Nacos和eureka的共同担点:
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别:
- Nacos支持服务端主动检测提供者的状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用的是ap模式(一致性较弱,可用性较强),当集群当存在非临时实例时,采用cp模式(一致性较强,可用性较弱),Eureka采用ap模式